五子棋人机博弈


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

  1. 最大权值法
  2. 决策树法
  3. 机器学习训练

这里我们主要针对第一种方法讨论下,大致思路如下:

  1. 我们绘制好一个棋盘后,假定大小为 15*15;
  2. 下棋之前,对于棋盘中的每个空位,我们每都替电脑人“掂一掂”下在哪里合算;(估权过程)
  3. 对每个空位按照规则都计算完权重,我们找出权重最大的位置,此位置就是npc落子位置

那么现在的问题就是,这个权重的计算规则是怎样的呢?
首先,我们思考一下人是怎么下子的。

  1. 当该位置四周为空时,这个位置落子可能就不是那么有意义;
  2. 我们最大可能地去实现将棋子相连,若该位置四周已出现一条连线,则连子数越多,该子越重要
  3. 就算一条线有很多子已经相连,如果该线的一端被堵住,那么该线的重要程度降低,我们称之为眠连,otherwise,两端都没堵住我们称之为活连。

现在我们来将棋子相连的情况进行下归类赋权

空子位置我们用 “0” 表示,白子用“2”表示,黑子用“1”表示;
我们主要分为以下几种情况:

定义 棋子相连情况 权值
活一连 010、020 40
活二连 0110、0220 400
活三连 01110、02220 3000
活四连 011110、022220 10000
眠一连 012、021 20
眠二连 0112、0221 200
眠三连 01112、02221 500
眠四连 011112、022221 3000

主要被分为了以上几类,当然可以考虑更多以使你的npc更加“智能”;

现在考虑算法

对于每个空位,我们从四个方向进行考察:

  • 水平
  • 竖直
  • 左斜
  • 右斜

我们以水平方向为例进行代码考察:

    int go[row][column];   //记录每个点的落子情况int weightarr[row][column];  //记录每个空位的权值 for piece in chessboard{if(piece为空){key1="0";    //记录空位左边连子情况key2="0";    //记录空位右边连子情况(i,j)为空位坐标ux=i;uy=j;   //(ux,uy)记录左边连子边界dx=i;dy=j;   //(dx,dy)记录右边边界first1=0;first2=0;    //first1 记录空位左边第一个子颜色,first2记录右边第一个颜色//while的目的在于找到最多的颜色相同的连线while(左边不越界){int first=go[i-1][j].color;first1=first;if(first==0) break;   //如果空位相邻也为空,退出else {      //如果不为空位--ux;if(颜色和first相同) {key1+=go[ux][uy].color;}else {key1+=go[ux][uy].color;break;}}   }while(右边不越界){...   //和上面同理}value1=左边连线权值;value2=右边连线权值;if(左右连线颜色相同) 权值翻倍;weightarr[i][j]+=该方向权值;//同理,依此计算 左斜,右斜,竖直情况;}   }

要注意的是,因为对于每个大方向,比如说水平方向,我们以该空位做间断点分了水平左和水平右,当水平左和水平右的颜色相同时,权值注意要加强,因为比如说隔开的2个黑子和1个黑子填上空位可以变成4个黑子;

大家可以具体自己重新设置权值,添加更多情况。
我们将具体实现代码放在github中,供大家参考:
https://github.com/Gray-way/Gobang

五子棋(人机对弈)——Java权值法五子棋博弈相关推荐

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

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

  2. JAVA权值法实现五子棋_java游戏之 五子棋实现人人对战!

    五子棋,是我们大家都喜爱玩的智力棋类游戏,在学完了界面以及绘图之后便一直想做一个,如今终于如愿以偿,虽然还没有更好的美化该游戏,但是大局已定.高兴! 五子棋我们需要很多常量,比如说棋子的大小,棋盘格子 ...

  3. java五子棋博弈,五子棋(人機對弈)——Java權值法五子棋博弈

    五子棋人機博弈 五子棋,人與人之間博弈,我們不用考慮太多,都是玩家自動思考. 但是如果我們要玩一個單機的五子棋,實現人機的對戰,那么我就得"幫"電腦考慮下走哪步了. 實現的方法大概 ...

  4. 权值法实现五子棋AI

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

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

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

  6. 五子棋人机对弈 c语言,五子棋人机对弈系统

    ********本科毕业论文(设计)任务书 论文(设计)题目:五子棋人机对弈系统 学院:专业:班级: 学生姓名:学号:指导教师:职称: 1.论文(设计)研究目标及主要任务 研究目标: 采用具有一定智能 ...

  7. java象棋人机代码_中国象棋人机对弈Java版源码

    [实例简介] 中国象棋人机对弈Java版源码,包含人工智能实现(含多个难度级别,采用α-β迭代搜索算法) [实例截图] [核心代码] 中国象棋人机对弈Java版源码 ├── boards │   ├─ ...

  8. 五子棋人机对弈代码——java版

    算法是穷举递归法,只不过用java重新写了一遍 import java.awt.Color; import java.awt.Container; import java.awt.Graphics; ...

  9. 五子棋人机对弈代码——之穷举递归法

    这是C语言版的代码,编译运行成可执行文件后,还需下载一个软件,才可人机对战,这个软件的下载地址如下:http://www.botzone.org/RATE/news/Gobang_Human_VS_A ...

最新文章

  1. APP启动原理,APPdelegate程序状态解析
  2. Postman——导出测试接口集合的Collection文件
  3. 机械装备计算机控制技术考试题,武汉理工大学机电工程学院研究生课程考试试题(肖峻)...
  4. python坐标系建立_在python中创建坐标网格
  5. 大端字节序与小端字节序的转换
  6. Servlet验证码功能
  7. 2015年传智播客JavaEE 第168期就业班视频教程day38-SSH综合案例-1
  8. 企业级 SpringBoot 教程 (十四)在springboot中用redis实现消息队列
  9. 更改收藏夹路径和桌面路径
  10. 《LwIP协议栈源码详解——TCP/IP协议的实现》移植综述
  11. Matlab实现人脸识别
  12. 智方8000系文具进销存管理系统 华军软件网
  13. 管理经济学【六】之 成本分析
  14. R语言KNN分类问题(kknn/class包在iris数据集上的实例)
  15. 安装谷歌服务框架2022最新版本22.45.15失败
  16. 15个搞笑的程序员段子
  17. ROS2学习(1)ROS2简述
  18. 【BZOJ2069】ZAW(POI2004)-最短路+二进制分组
  19. 不小心删除文件夹怎么恢复,怎么恢复误删文件?
  20. HDU 1243 反恐训练营(最长公共序列)

热门文章

  1. 零基础学习编程难不难?
  2. CTF练习WP(week1)之二
  3. sysout(System.out.println)快捷键
  4. AD如何生成Gerber文件,钻孔文件与坐标文件
  5. USB Type-C E-Marker
  6. postman pre-req 和 tests
  7. destoon 标签
  8. php微信h5分享到朋友圈,H5页面在微信端的分享(分享到朋友圈,好友)
  9. Servlet生命周期(代码+图示)
  10. Ubuntu下微信(wechat)经常无故卡死解决方法 百度输入法