C++五子棋(四)——走棋原理及权值计算
原理
计算
- 计算每个落子点的**“权值”**,找到权值最大的落子点
- 对于每个空白点,分别计算周围的八个方向
- 不妨以该空白点作为参照原点,以水平向右作为X轴正方向,以竖直向下为Y轴正方向建立平面直角坐标系
- 因为在计算某个方向时,正向和反向需同时考虑,实际上只需要四个方向,即向量(1,0)的方向、向量(1,1)方向、向量(0,1)方向和向量(-1,1)方向,图示如下(灵魂画图,请勿吐槽 滑稽)
走棋原理
产生效果
- 黑棋走这个点
产生效果 | 评分 |
---|---|
连2 | 10 |
死3 | 30 |
活3 | 40 |
死4 | 60 |
活4 | 200 |
连5 | 20000 |
- 如果白棋(AI)走这个点
产生效果 | 评分 |
---|---|
连1 | 5 |
连2 | 10 |
死3 | 25 |
活3 | 50 |
死4 | 55 |
活4 | 300 |
连5 | 30000 |
权值计算
- chessData.h
void calcScore(ChessData* data);
- chessData.cpp
#include <string>
void calcScore(ChessData* data){if(!data) return;//统计玩家或AI连子int personNum = 0; //玩家int botNum = 0; //AIint emptyNum = 0; //各方向空白位数//清空评分数组memset(data->scoreMap, 0, sizeof(data->scoreMap));for (int row = 0; row < BOARD_GRAD_SIZE; row++){for(int col = 0; col < BOARD_GRAD_SIZE; col++){//空白点计算if(row >= 0 && col >= 0 && data->chessMap[row][col] == 0){//遍历四个方向,然后分别计算正反四个方向int directs[4][2] = {{1,0}, {1,1}, {0,1}, {-1,1}};for(int k = 0; k < 4; k++){int x = directs[k][0];int y = directs[k][1];//重置personNum = 0;botNum = 0;emptyNum = 0;//对黑棋评分(正向)for(int i = 1; i <= 4; i++){if(row + i * y >= 0 && row + i * y < BOARD_GRAD_SIZE && col + i * x >= 0 && col + i * x < BOARD_GRAD_SIZE && data->chessMap[row + i * y][col + i * x] == 1){//玩家的子personNum++;}else if(row + i * y >= 0 && row + i * y < BOARD_GRAD_SIZE &&col + i * x >= 0 && col + i * x < BOARD_GRAD_SIZE && data->chessMap[row + i * y][col + i * x] == 0){//空白位emptyNum++;break; //遇到空白位置停止该方向搜索}else{break; //出边界或遇到白棋停止搜索}}//对黑棋评分(反向)for(int i = 1; i<= 4; i++){if(row - i * y >= 0 && row - i * y < BOARD_GRAD_SIZE && col - i * x >= 0 && col - i * x <BOARD_GRAD_SIZE && data->chessMap[row - i * y][col - i * x] == 1){personNum++;}else if(row - i * y >= 0 && row - i * y <BOARD_GRAD_SIZE && col - i * x >= 0 && col - i * x < BOARD_GRAD_SIZE &&data->chessMap[row -i * y][col - i * x] == 0){emptyNum++;break;}else{break;}}if(personNum == 1){data->scoreMap[row][col] += 10;}else if(personNum == 2){if(emptyNum == 1){//死3data->scoreMap[row][col] += 30;}else if(emptyNum == 2){//活3data->scoreMap[row][col] += 40;}}else if(personNum == 3){if(empty == 1){//死4data->scoreMap[row][col] += 60;}else if (emptyNum == 2){//活4data->scoreMap[row][col] += 200;}}else if(personNum == 4){data->scoreMap[row][col] += 20000;}emptyNum = 0; //清空//对白棋评分(正向)for(int i = 1; i <= 4; i++){if(row + i * y > 0 && row + i * y < BOARD_GRAD_SIZE && col + i * x > 0 && col + i * x < BOARD_GARD_SIZE &&data->chessMap[row + i * y][col + i * x == -1]){botNum++;}else if(row + i * y >0 && row + i * y < BOARD_GRAD_SIZE && col + i * x > 0 && col + i * x < BOARD_GRAD_SIZE && data->chessMap[row + i * y][col + i *x] == 0){emptyNum++;break;}else{break;}}//白棋评分(反向)for(int i = 1; i <= 4; i++){if(row - i * y > 0 && row - i * y <BOARD_GRAD_SIZE && col - i * x > 0 && col - i * x < BOARD_GRAD_SIZE && data->chessMap[row - i * y][col -i * x] == -1){botNum++;}else if (row - i * y >0 && row - i * y < BOARD_GRAD_SIZE &&col - i * x > 0 && col - i * x < BOARD_GRAD_SIZE &&data->chessMap[row - i * y][col - i * x] == 0){emptyNum++;break;}else{break; //出边界}}if(botNum == 0){//连1data->scoreMap[row][col] += 5;}else if(botNum == 1){//活2data->scoreMap[row][col] += 10;}else if(botNum == 2){if(emptyNum == 1){//死3data->scoreMap[row][col] += 25;}else if(emptyNum == 2){//活3data->scoreMap[row][col] += 50;}}else if(botNum == 3){if(emptyNum == 1){//死4data->scoreMap[row][col] += 55;}else if(botNum == 2){//活4data->scoreMap[row][col] += 300;}}else if(botNum >= 4){//活5data->scoreMap[row][col] += 30000;}}}}}
}
C++五子棋(四)——走棋原理及权值计算相关推荐
- 二进制权值计算 lsb_2020年二级计算机基础知识备考(第二章)
点击蓝字关注我们哟~ 2020年9月全国计算机等级考试倒计时29天,还没有好好备考的小伙伴们抓紧时间备考了~ 今天,跟着考无忧继续备考一下二级计算机基础知识的<第二章 信息的表示和储存>. ...
- java哈夫曼树权值计算_JAVA 哈夫曼树权值求和(代码找错)
展开全部 兄弟,你把如下第28行的count++;注释掉,一切问题都可以解决! 自己先琢磨为什么,不懂的再问!import java.util.Arrays; import java.util.Sca ...
- MATLAB手动修改神经网络权值的方法
文章目录 一.问题描述 二.解决方法 三.简单的测试 一.问题描述 我在MATLAB上用deepNetworkDesigner做了一个简单的网络: 现在我想手动修改网络的权值矩阵. 网络的存储格式如下 ...
- 关联规则算法php,科学网—加权关联规则权值的计算 - 叶文菁的博文
加权关联规则挖掘(以apriori和fp-tree算法为例)的权值计算. 以下面的数据为例来进行说明,表2中的交易权重和归一化权重只是截图结果,这里的具体数值可不要考虑. 加权支持度的计算为Sup(B ...
- 五子棋_AI权值算法(2)
小编已经隔了好久没有更新了,原因我就不多说啦,接下来我要立个每周更新的flag啦. 上一篇我们的成果是这样的 然后如果我们要实现人机的话就需要算法啦,这里就使用比较简单的算法,其他的还有博弈树等比较高 ...
- 五子棋java程序=权值法_五子棋(人机对弈)——Java权值法五子棋博弈
五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...
- 权值法实现五子棋AI
权值法实现五子棋AI 前言 五子棋AI,能根据棋盘局势判断棋子应落在何处获胜,主要有权值法和博弈树法两种实现方案.本篇博客将就权值法展开介绍,笔者水平有限,望各路大神有所建议评论提出,谢谢. 权值法 ...
- 简易五子棋AI权值法(2)
简易五子棋&AI权值法(2) 权值法 权值法实现AI,就是给每个无子的地方给一个权值,然后选出权值最大的让电脑落子. 具体到每个位置,权值根据周围一定范围的落子情况给出. 就我的想法来说,我觉 ...
- 基于有偏距离权值双线性插值原理(Weighted bilinear with warping)的图像超分辨重构研究-附Matlab程序
⭕⭕ 目 录 ⭕⭕ ✳️ 一.图像超分辨率重构原理 ✳️ 二.双线性插值重构理论与实验分析 ✳️ 2.1 双线性插值理论与实验验证 ✳️ 2.2 有偏距离双线性插值重构理论与实验验证 ✳️ 2.3 权 ...
最新文章
- 北航、旷视联合,打造最强实时语义分割网络
- layui单元格鼠标样式_Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法...
- python2与python3代码互相转化时注意事项
- 如何查询oracle的共享内存,[20190104]ipcs查看共享内存段.txt
- 设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于两对角线的和,例如以下魔方,各行各列及两对角线值的和都是64.
- mysql用命令修改主键名_MySQL的常用命令:添加外键,修改字段名称,增加字段 设置主键自增长等...
- JavaScript异常处理
- 注册岩土工程师计算机专业的能考吗,岩土工程师报考条件
- matlab使用矩形窗设计一个具有线性相位的低通数字滤波器,matlab结合矩形窗设计fir滤波器.doc...
- 小米手机是什么系统?
- win8 配置要求
- 【网络安全】IP地址、子网掩码、网关、DNS、DHCP概述(自学,随时补充)
- android9.0设置默认输入法
- 如何实现背景/背景图片透明文字不透明
- 神经网络算法入门实例,神经网络算法入门书籍
- assign和weak之间的区别
- vs2019测试sizeof(string)的长度是28
- 哈达玛矩阵的相关基础知识
- 布隆过滤器 布谷鸟过滤器 Redis 安装布隆过滤器
- 流行的rpc框架性能测试对比
热门文章
- python 文本聚类算法
- git push代码到远程新分支
- 158. Leetcode 121. 买卖股票的最佳时机 (贪心算法-股票题目)
- Leetcode 79. 单词搜索 (每日一题 20210720 同类型题)
- 强化学习笔记:Q-learning :temporal difference 方法
- python库整理:numpy 集合操作
- 文巾解题 面试题 03.06. 动物收容所
- MySQL快速查询的12条建议,让你不止会用select *
- 深度学习核心技术精讲100篇(五十二)-用户画像系统构建全思路解析
- python实战系列之写个好玩的猜拳游戏(附源代码)