五子棋java程序=权值法_五子棋(人机对弈)——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程序为什么在编译执行后会先打出一个笑脸呢?...
嗯,我个人认为,从键盘输入再输出意义不是很大,如果楼主有C的基础,那么这个输入将是一个很好练习,因为java的输入和输出与C有很大的区别,废话不多说 首先,无论是在Eclipse的控制台上还是CMD模 ...
- java程序员年度总结_一个五年Java程序员的年终总结,献给还在迷茫中的你
我越来越担心我作为一个Java程序员的未来. 恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过 ...
- 简述如何编写java程序_1-4 简述 Eclipse 编写 Java 程序的流程。_学小易找答案
[填空题]三四年级是英语入门初学阶段,更加注重( ). [单选题]不属于pos终端收银机的基本构成是( ). A . 显示器 B . 小票打印机 C . 键盘 D . 条形码电子称 [单选题]( ) ...
- java程序包不存在_第一章 Java语言简介
Java语言简介 Java之父 James Gosling(詹姆斯·高斯林) 正式诞生时间 1995年,已有二十多年历史 三大方向 JavaSE(桌面版,基础需重点掌握) JavaME(移动版,现在基 ...
- java象棋人机代码_中国象棋人机对弈Java版源码
[实例简介] 中国象棋人机对弈Java版源码,包含人工智能实现(含多个难度级别,采用α-β迭代搜索算法) [实例截图] [核心代码] 中国象棋人机对弈Java版源码 ├── boards │ ├─ ...
- 简述java程序的工作过程_简述 Java 程序的开发过程。_学小易找答案
[填空题]两个啮合齿轮在啮合区内,一个齿轮的轮齿用()绘制,另一个齿轮的轮齿被遮挡的部分用()绘制,被遮挡的部分也可以省略不画. [单选题]只有建立了统一的学校集体,才能在儿童的意识中唤起舆论的强大力 ...
- 所有java程序都有线程_若所有的用户线程都终止了,Java程序就会结束。( )_学小易找答案...
[单选题]关于链表结构,陈述错误的是 . [单选题]下列关于构造方法的特点的描述中,错误的是 . [判断题]在构造方法中如调用 super() 语句,则必须使其成为构造方法中的第一条语句. [单选题] ...
- 此安装程序必须使用 java 开发工具包 (jdk) 执行_彻底搞懂Java开发工具包(JDK)安装及环境变量配置...
[官方正版]java jdk 9学习笔记 78.4元 包邮 (需用券) 去购买 > 一.Java 和 JDK 是什么 Java:Java是一种优秀的程序设计语言,它有非常多的语言特性,如简单性. ...
- java代码优化的方法和准则_编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)...
建议16:易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP,Ruby,Groovy.Javascript等,这些入侵者都有一个共同特征:全是同一类语言-----脚本语言,它 ...
- finally在java程序中的作用_深入理解Java中的finally
问题 在Java的异常体系中,我们经常会使用finally语句块来保证进行一些无论有无异常都要执行的处理流程,但finally语句块与return语句究竟哪个先执行总是让人迷惑.根据书本介绍,似乎是f ...
最新文章
- php js统计链接点击次数,JS实现在线统计一个页面内鼠标点击次数的方法
- mysql100万数据一键下载csv_使用PHP来导入包含100万条数据的csv文件,请问你最快多久能全部导入mysql 数据库?...
- 单例模式反射、序列化漏洞及解决方案!
- YII2 - Yii 2 控制器不能包含大写字母的Bug
- java中的基本数据类型(四类八种)
- 夏利车电动窗功能设定
- python书籍推荐:Python数据科学手册
- 程序中变量分布的区域总结 堆 栈 字符常量区 全局数据区 静态存储区
- quartus仿真28:JK触发器实现的脉冲分配器(分析)
- python写个验证码
- Arduino开发板使用DS3231实时时钟模块的方法
- 从《牛津高阶英汉词典》中提取单词(2)
- C9—Qt实现网络调试助手
- 信息系统项目管理师必背核心考点(四十四)规划风险应对
- 数据质量监控工具-Apache Griffin
- 用Python爬中国银行指定日期九点三十分汇率
- SLG手游卡牌类游戏机器人逻辑算法
- 里恩EDC详解临床研究常用的设计类型
- 程序员应了解的那些事(4)求递归算法的时间复杂度
- 【原创题目】lym子集
热门文章
- Python自学教程 1 Windows10环境下配置python3.8.0Pycharm的安装及初步使用
- 路由器和调制解调器的区别_交换机,路由器和调制解调器之间有什么区别?
- QTableWidget中表格显示图片
- Golang rpc:service/method request ill-formed错误
- html菜单箭头,html – 纯CSS选择菜单/下拉菜单:如何制作右箭头功能?
- 史蒂夫·鲍尔默也用Firefox和Google
- 备份硬件驱动--驱动精灵的使用
- 初二计算机简单动画,浙教版八年级下册信息技术:第七课《简单的动画补间动画》教案...
- devtools引发的一场关于类加载问题的探究
- ROS轨迹保存为tum格式,并用evo轨迹绘制