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权值法五子棋博弈
五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...
- 五子棋(人机对弈)——Java权值法五子棋博弈
五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...
- Java五子棋Ai-权值法
Java五子棋Ai-权值法 一. 什么是权值法? 二.实现权值法Ai会面临的问题 1.如何表达棋盘上未下处的横竖斜的棋子情况?(类似01120) 2.如何将未下处的横竖斜情况和权值联系起来?(Hash ...
- java五子棋ai_Java五子棋Ai-权值法
一. 什么是权值法? 权值法顾名思义,即是权衡不同的情况并赋予不同的数值,这个数值即代表着这个情况的重要性. 例如,当我们进行五子棋对战的时候,我们每下一个棋子就要判断这个点横竖斜的情况,对于不同的情 ...
- 交大校友會高階經理人才培訓班 2009/11/19 演講主題:蒙恬科技- 智慧型人機介面整合專家_蔡義泰,蒙恬科技董事長...
交大校友會高階經理人才培訓班 2009/11/19 演講主題:蒙恬科技- 智慧型人機介面整合專家 主講人:蔡義泰,蒙恬科技董事長 主持人:交大校友會執行長陳俊秀 董事長金語摘要: 1. 創業時就努力 ...
- 权值法实现五子棋AI
权值法实现五子棋AI 前言 五子棋AI,能根据棋盘局势判断棋子应落在何处获胜,主要有权值法和博弈树法两种实现方案.本篇博客将就权值法展开介绍,笔者水平有限,望各路大神有所建议评论提出,谢谢. 权值法 ...
- java scala_经过几天的Scala回归Java的10个最烦人的事情
java scala 因此,我正在尝试使用Scala,因为我想编写一个解析器,而Scala Parsers API似乎非常合适. 毕竟,我可以在Scala中实现解析器并将其包装在Java接口后面,因此 ...
- java字节码_好的,每个接触Java字节码的人
java字节码 Oracle诉Google一案认为,复制Java API的结构,序列和组织是侵犯版权的行为. 侵犯版权不仅是复制行为,而且还适用于拥有该作品副本的所有中间方. 那就是编写/编译任何JV ...
- 好的,每个接触Java字节码的人
Oracle诉Google一案认为,复制Java API的结构,序列和组织是侵犯版权的行为. 侵犯版权不仅是复制行为,而且还适用于拥有该作品副本的所有中间方. 那就是编写/编译任何JVM语言的人,以及 ...
最新文章
- 【Network Security!】关于DDOS攻击的现状分析与探索
- gitlab安装_Gitlab安装和配置教程(包括邮箱配置)
- Windows10忘记锁屏密码,如何破解
- android 键盘 能复制,android – 从EditText中禁用软键盘,但仍允许复制/粘贴?
- python如何读取csv文件列表页_每25行读取一个csv文件,并使用python传递到列表
- LeetCode 1922. 统计好数字的数目(快速幂)
- python如何更改entry属性_如何在Python3中更改Gtk3 Entry文本颜色?
- ROBEL:谷歌推出低成本机器人训练平台
- git tag打标签常用命令
- 加密货币挖矿太火造成显卡短缺,AMD、英伟达能躺着赚钱嘛?
- 入门篇:函数计算中角色和访问策略的讲解
- Smart210使用superboot刷机
- Golang学习之路(一):Golang安装和配置
- 服务器装系统鼠标键盘用不了怎么办,教你重装系统鼠标键盘不能用怎么解决?...
- ico付费图标下载器 附带易语言源码
- [Irving]Android 常用布局之RelativeLayout
- mysql score表_Mysql数据库练习题student,score表
- OpenCV开发笔记(四十一):红胖子8分钟带你深入了解scharr滤波器算子边缘检测(图文并茂+浅显易懂+程序源码)
- 罗切斯特大学读计算机博士,2020年罗切斯特大学博士申请条件
- (一)离散型智能制造
热门文章
- 制作ubuntu to go,随身携带的系统(uefi+gpt启动)
- 计算机丢失vcomp110.dll,msvcr110.dll丢失怎么办?
- 使用MediaMonkey代替Windows版iTunes来管理iPod
- Community Day 社区嘉年华 · 深圳站|极客社区与技术大咖的双向奔赴,这一次走在技术迭代之前
- CUDA报错:unknown error - this may be due to an incorrectly set up environment, e.g. changing env varia
- 张泉灵“生命的后半段”读后感
- 如何让电脑的速度快如闪电?
- 《动物精神》之启示一
- Codeforces D. Cleaning(前缀和、后缀和)
- Windows Azure Pack与VMware VRA 对比(二)安装VRA IaaS服务器