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 权 ...
最新文章
- eclipse编辑窗口不见了(打开左边的java、xml文件,中间不会显示代码)
- 写给程序员的 18 幅对联,你能看懂几个?
- fp5139应用电路图_四款l6599d经典应用电路图详解
- Bengio、周志华、山世光、包云岗等200+位AI学术领袖邀你观看智源大会精彩论坛...
- 计算未来轻沙龙 | 顶会论文相继放榜,NLP领域有哪些最新进展?
- Linux 随机启动 Mysql​
- linux安装mysql5.5.52,Linux系统上安装MySQL 5.5prm
- MyBatis框架学习笔记01:初探MyBatis实现简单查询
- (91)多人投票器(五人投票器)
- 终于要来了!苹果明年将推出11英寸版mini-LED屏iPad Pro
- linux利用内存加快读盘速度,Linux性能优化从入门到实战:10 内存篇:如何利用Buffer和Cache优化程序的运行效率?...
- 注册表知识and技巧大全
- 在ipad任意界面都可以写字_新 iPad 只是爱奇艺播放器?这 34 款实用 App 帮你秒增生产力...
- 堪培拉地理位置经纬度_澳大利亚的经纬度气候地形
- Zip函数教程(简单示例)
- 轻量级录屏软件 Captura 使用 ffmpeg 调用 NVDIA nvenc 录制小体积网课视频
- 基于Apache Kylin的分析案例
- jieba分词增加自定义词表
- 文件夹快速隐藏,文件夹选项中勾选隐藏目录依旧不能使其显示
- 论文解析[10] Contextual Transformer Networks for Visual Recognition
热门文章
- python 面向对象 (一)
- Bag of Words(BOW)模型
- PYTHON * 和**的用法
- 玩点不一样的,如何使用MATLAB实现批量修改文件后缀名,文件名,批量复制文件
- Hadoop 在关机重启后,namenode启动报错
- c语言数字的拆解_C语言解决变态推理题
- TensorFlow官方入门实操课程-一个神经元的网络(线性曲线预测)
- 代码实例--请求的转发:RequestDispatcher对象处理请求的两个方法--forward和include
- numpy.random.normal详解
- Let's do our own full blown HTTP server with Netty--转载