原理

计算

  • 计算每个落子点的**“权值”**,找到权值最大的落子点
  • 对于每个空白点,分别计算周围的八个方向
  • 不妨以该空白点作为参照原点,以水平向右作为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++五子棋(四)——走棋原理及权值计算相关推荐

  1. 二进制权值计算 lsb_2020年二级计算机基础知识备考(第二章)

    点击蓝字关注我们哟~ 2020年9月全国计算机等级考试倒计时29天,还没有好好备考的小伙伴们抓紧时间备考了~ 今天,跟着考无忧继续备考一下二级计算机基础知识的<第二章 信息的表示和储存>. ...

  2. java哈夫曼树权值计算_JAVA 哈夫曼树权值求和(代码找错)

    展开全部 兄弟,你把如下第28行的count++;注释掉,一切问题都可以解决! 自己先琢磨为什么,不懂的再问!import java.util.Arrays; import java.util.Sca ...

  3. MATLAB手动修改神经网络权值的方法

    文章目录 一.问题描述 二.解决方法 三.简单的测试 一.问题描述 我在MATLAB上用deepNetworkDesigner做了一个简单的网络: 现在我想手动修改网络的权值矩阵. 网络的存储格式如下 ...

  4. 关联规则算法php,科学网—加权关联规则权值的计算 - 叶文菁的博文

    加权关联规则挖掘(以apriori和fp-tree算法为例)的权值计算. 以下面的数据为例来进行说明,表2中的交易权重和归一化权重只是截图结果,这里的具体数值可不要考虑. 加权支持度的计算为Sup(B ...

  5. 五子棋_AI权值算法(2)

    小编已经隔了好久没有更新了,原因我就不多说啦,接下来我要立个每周更新的flag啦. 上一篇我们的成果是这样的 然后如果我们要实现人机的话就需要算法啦,这里就使用比较简单的算法,其他的还有博弈树等比较高 ...

  6. 五子棋java程序=权值法_五子棋(人机对弈)——Java权值法五子棋博弈

    五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...

  7. 权值法实现五子棋AI

    权值法实现五子棋AI 前言 五子棋AI,能根据棋盘局势判断棋子应落在何处获胜,主要有权值法和博弈树法两种实现方案.本篇博客将就权值法展开介绍,笔者水平有限,望各路大神有所建议评论提出,谢谢. 权值法 ...

  8. 简易五子棋AI权值法(2)

    简易五子棋&AI权值法(2) 权值法 权值法实现AI,就是给每个无子的地方给一个权值,然后选出权值最大的让电脑落子. 具体到每个位置,权值根据周围一定范围的落子情况给出. 就我的想法来说,我觉 ...

  9. 基于有偏距离权值双线性插值原理(Weighted bilinear with warping)的图像超分辨重构研究-附Matlab程序

    ⭕⭕ 目 录 ⭕⭕ ✳️ 一.图像超分辨率重构原理 ✳️ 二.双线性插值重构理论与实验分析 ✳️ 2.1 双线性插值理论与实验验证 ✳️ 2.2 有偏距离双线性插值重构理论与实验验证 ✳️ 2.3 权 ...

最新文章

  1. eclipse编辑窗口不见了(打开左边的java、xml文件,中间不会显示代码)
  2. 写给程序员的 18 幅对联,你能看懂几个?
  3. fp5139应用电路图_四款l6599d经典应用电路图详解
  4. Bengio、周志华、山世光、包云岗等200+位AI学术领袖邀你观看智源大会精彩论坛...
  5. 计算未来轻沙龙 | 顶会论文相继放榜,NLP领域有哪些最新进展?
  6. Linux 随机启动 Mysql​
  7. linux安装mysql5.5.52,Linux系统上安装MySQL 5.5prm
  8. MyBatis框架学习笔记01:初探MyBatis实现简单查询
  9. (91)多人投票器(五人投票器)
  10. 终于要来了!苹果明年将推出11英寸版mini-LED屏iPad Pro
  11. linux利用内存加快读盘速度,Linux性能优化从入门到实战:10 内存篇:如何利用Buffer和Cache优化程序的运行效率?...
  12. 注册表知识and技巧大全
  13. 在ipad任意界面都可以写字_新 iPad 只是爱奇艺播放器?这 34 款实用 App 帮你秒增生产力...
  14. 堪培拉地理位置经纬度_澳大利亚的经纬度气候地形
  15. Zip函数教程(简单示例)
  16. 轻量级录屏软件 Captura 使用 ffmpeg 调用 NVDIA nvenc 录制小体积网课视频
  17. 基于Apache Kylin的分析案例
  18. jieba分词增加自定义词表
  19. 文件夹快速隐藏,文件夹选项中勾选隐藏目录依旧不能使其显示
  20. 论文解析[10] Contextual Transformer Networks for Visual Recognition

热门文章

  1. python 面向对象 (一)
  2. Bag of Words(BOW)模型
  3. PYTHON * 和**的用法
  4. 玩点不一样的,如何使用MATLAB实现批量修改文件后缀名,文件名,批量复制文件
  5. Hadoop 在关机重启后,namenode启动报错
  6. c语言数字的拆解_C语言解决变态推理题
  7. TensorFlow官方入门实操课程-一个神经元的网络(线性曲线预测)
  8. 代码实例--请求的转发:RequestDispatcher对象处理请求的两个方法--forward和include
  9. numpy.random.normal详解
  10. Let's do our own full blown HTTP server with Netty--转载