五子棋(人机对弈)——Java权值法五子棋博弈
五子棋人机博弈
五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考。
但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得“帮”电脑考虑下走哪步了。
实现的方法大概有三种:
- 最大权值法
- 决策树法
- 机器学习训练
这里我们主要针对第一种方法讨论下,大致思路如下:
- 我们绘制好一个棋盘后,假定大小为 15*15;
- 下棋之前,对于棋盘中的每个空位,我们每都替电脑人“掂一掂”下在哪里合算;(估权过程)
- 对每个空位按照规则都计算完权重,我们找出权重最大的位置,此位置就是npc落子位置
那么现在的问题就是,这个权重的计算规则是怎样的呢?
首先,我们思考一下人是怎么下子的。
- 当该位置四周为空时,这个位置落子可能就不是那么有意义;
- 我们最大可能地去实现将棋子相连,若该位置四周已出现一条连线,则连子数越多,该子越重要
- 就算一条线有很多子已经相连,如果该线的一端被堵住,那么该线的重要程度降低,我们称之为眠连,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权值法五子棋博弈相关推荐
- 五子棋java程序=权值法_五子棋(人机对弈)——Java权值法五子棋博弈
五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...
- JAVA权值法实现五子棋_java游戏之 五子棋实现人人对战!
五子棋,是我们大家都喜爱玩的智力棋类游戏,在学完了界面以及绘图之后便一直想做一个,如今终于如愿以偿,虽然还没有更好的美化该游戏,但是大局已定.高兴! 五子棋我们需要很多常量,比如说棋子的大小,棋盘格子 ...
- java五子棋博弈,五子棋(人機對弈)——Java權值法五子棋博弈
五子棋人機博弈 五子棋,人與人之間博弈,我們不用考慮太多,都是玩家自動思考. 但是如果我們要玩一個單機的五子棋,實現人機的對戰,那么我就得"幫"電腦考慮下走哪步了. 實現的方法大概 ...
- 权值法实现五子棋AI
权值法实现五子棋AI 前言 五子棋AI,能根据棋盘局势判断棋子应落在何处获胜,主要有权值法和博弈树法两种实现方案.本篇博客将就权值法展开介绍,笔者水平有限,望各路大神有所建议评论提出,谢谢. 权值法 ...
- 简易五子棋AI权值法(2)
简易五子棋&AI权值法(2) 权值法 权值法实现AI,就是给每个无子的地方给一个权值,然后选出权值最大的让电脑落子. 具体到每个位置,权值根据周围一定范围的落子情况给出. 就我的想法来说,我觉 ...
- 五子棋人机对弈 c语言,五子棋人机对弈系统
********本科毕业论文(设计)任务书 论文(设计)题目:五子棋人机对弈系统 学院:专业:班级: 学生姓名:学号:指导教师:职称: 1.论文(设计)研究目标及主要任务 研究目标: 采用具有一定智能 ...
- java象棋人机代码_中国象棋人机对弈Java版源码
[实例简介] 中国象棋人机对弈Java版源码,包含人工智能实现(含多个难度级别,采用α-β迭代搜索算法) [实例截图] [核心代码] 中国象棋人机对弈Java版源码 ├── boards │ ├─ ...
- 五子棋人机对弈代码——java版
算法是穷举递归法,只不过用java重新写了一遍 import java.awt.Color; import java.awt.Container; import java.awt.Graphics; ...
- 五子棋人机对弈代码——之穷举递归法
这是C语言版的代码,编译运行成可执行文件后,还需下载一个软件,才可人机对战,这个软件的下载地址如下:http://www.botzone.org/RATE/news/Gobang_Human_VS_A ...
最新文章
- APP启动原理,APPdelegate程序状态解析
- Postman——导出测试接口集合的Collection文件
- 机械装备计算机控制技术考试题,武汉理工大学机电工程学院研究生课程考试试题(肖峻)...
- python坐标系建立_在python中创建坐标网格
- 大端字节序与小端字节序的转换
- Servlet验证码功能
- 2015年传智播客JavaEE 第168期就业班视频教程day38-SSH综合案例-1
- 企业级 SpringBoot 教程 (十四)在springboot中用redis实现消息队列
- 更改收藏夹路径和桌面路径
- 《LwIP协议栈源码详解——TCP/IP协议的实现》移植综述
- Matlab实现人脸识别
- 智方8000系文具进销存管理系统 华军软件网
- 管理经济学【六】之 成本分析
- R语言KNN分类问题(kknn/class包在iris数据集上的实例)
- 安装谷歌服务框架2022最新版本22.45.15失败
- 15个搞笑的程序员段子
- ROS2学习(1)ROS2简述
- 【BZOJ2069】ZAW(POI2004)-最短路+二进制分组
- 不小心删除文件夹怎么恢复,怎么恢复误删文件?
- HDU 1243 反恐训练营(最长公共序列)