参考文章: 【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)
源码: goBang
思考一:作为对手的系统用什么算法下棋?
估值函数、搜索算法和胜负判断等
博弈算法,在极大极小值搜索中应用alpha-beta剪枝
智能五子棋博弈程序的核心算法
智能五子棋中的算法研究
人机版五子棋两种算法概述
思考二:人机博弈的要点
1.棋局的状态能够在机器中表示出来,并能让程序知道当时的博弈状态
2.合法的走法规则如何在机器中实现,以便不让机器随便乱走而有失公平
3.如何让机器从所有的合法走法中选择最佳的走法
4.一种判断博弈状态优劣的方法,并能让机器能够做出智能的选择
5.一个显示博弈状态的界面,有了这样的界面程序才能用的起来而有意义
思考三:五子棋下棋规矩
五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。
整个对局过程中黑方有禁手,白方无禁手。
黑方禁手有三三禁手、四四禁手和长连禁手三种
思考四:人机下棋逻辑
系统先下,黑棋落子,交换下子顺序
玩家下,监测胜负(无胜负,交换下子顺序)
系统下(五元组中找最优位置),监测胜负(无胜负,交换下子顺序)
。。。
直到分出胜负(这里未考虑平局)
出现提示窗,告知玩家战局结果,同时可选择“返回菜单”或“再来一局”
具体实现:涉及知识点
官方文档--预制资源
将其改名为Chess拖入下面assets文件夹使其成为预制资源
1.在canvas节点上挂载Menu脚本组件
2.在按钮事件中,拖拽和选择相应的Target,Component和Handler
初始化棋子节点断点截图
系统为黑棋的评分表:
找最优位置下子
个人想法
这是我学习五子棋游戏开发的记录,后续还会写其他游戏开发,加油!
五子棋人机对战: 人机对战,我们可以想象一下我们在玩QQ游戏五子棋时的场景,根据每次下的步骤来分析电脑是怎样解析我们下棋的步骤的。下五子棋的步骤: 1、第一步,黑子先下 2、白子的第一步的最好的位置就是在黑子周围的八个点上 3、接着黑子的第二步必然也是根据白子周围的八个点和自己的黑子所在的位置来下。 4、如此循环下去。。。。 那么对于计算机来说,就是让他找到第一个黑子周围的八个点,并且随机选中一个下白子。 对于计算机来说(计算机执白棋):
1、赋权值
我们把棋盘上的位置都存储在一个数组中,扫描的话,怎样才能证明黑子附近的八个位置是最优位置呢?所以用权值数组,给这八个位置赋予较大的权值,这样才能证明其为最优。
活一连的话,它附近的八个位置就赋为10 死一连的话,黑子的八个方向有一个方向的一端被赋值为5,其他6个位置依然是10 活二连的话,两个子在相连的方向,两端赋为20,以两颗棋子分别为中心的八个位置,位置重复的进行权值累加. 死二连的话,两个子在相连的方向,白子堵住的另一端,赋值为15,其他都一样。 活三连的话,三个相连的方向,两端赋值为50,其他位置重复的进行权值累加. 死三连的话,三个子在相连的方向,白子堵住的另一端,赋值为18,跟活二连相比的话,会比其低,和死二连相比比其高。 四子相连时,不管是死是活,可以下棋堵住的地方都被赋值为100。
白棋也一样赋值
2、全盘遍历,找空位,每找一个空位的时候,判断这个空位的八个方向上有无棋子,若有,继续判断这个棋子的方向上是否有棋子,有的话是否是对方的棋子(黑棋白棋覆盖的权值进行累加),计算个数,判断为几连,好赋权值;若无,则赋为null。
3、用一个循环找出最大权值
4、统计权值 把最大权值的所有位置存储到一个队列中(泛型),随机选取出一个位置,下棋子。
5、清空权值数组,返回全盘遍历。
围棋是一种高明的逻辑游戏,其中蕴涵深刻的哲理,那么如何用程式码制作五子棋呢?下面是有,欢迎参阅。五子棋人机大战原始码教程步骤图解:
新建游戏专案档案目录
编写index档案原始码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8/>
<title>五子棋</title>
<link rel="stylesheet" type=text/css href="css/style.css"/>
<script type=text/javascript src=js/script.js></script>
</head>
<body>
<canvas id="chess" width=450px height=450px></canvas>
<input type=button onclick="window.location.reload******" value="在玩一次">
</body>
</html>
在css资料夹里新建css档案,style.css档案原始码如下:
canvas{
display: block
margin-top: 60px
box-shadow: -2px -2px 2px #EFEFEF, 5px 5px 5px #B9B9B9
width: 450pxheight: 450px
}
input{float: rightdisplay: block: -250px
width: 100pxheight: 30pxfont-size: 18px
}
{ color: #fefefe}
images资料夹里用到的图片如下
在js资料夹里新建script.js档案,原始码如下:
window.onload=function******{
var me=true
var over=false
var chessBord=[]
初始化chessBord阵列
for***var i=0i<15i++***{
chessBord[i]=[]
for***var j=0j<15j++***{
chessBord[i][j]=0
}
}
var me=[true]
赢法阵列
var wins=[]
var puterWin=[]
赢法的统计阵列
var myWin=[]
初始化3维阵列
for***var i=0i<15i++***{
wins[i]=[]
for***var j=0j<15j++***{
wins[i][j]=[]
}
}
var count=0
for***var i=0i<15i++***{
for***var j=0j<11j++***{
for***var k=0k<5k++***{
wins[i][j+k][count]=true
}
count++
}
}
for***var i=0i<15i++***{
for***var j=0j<11j++***{
for***var k=0k<5k++***{
wins[j+k][i][count]=true
}
count++
}
}
for***var i=0i<11i++***{
for***var j=0j<11j++***{
for***var k=0k<5k++***{
wins[i+k][j+k][count]=true
}
count++
}
}
for***var i=0i<11i++***{
for***var j=14j>3j--***{
for***var k=0k<5k++***{
wins[i+k][j-k][count]=true
}
count++
}
}
console.log***count***
for***var i=0i<counti++***{
myWin[i]=0
puterWin[i]=0
}
/**/
var chess=document.getElementById***'chess'***
var context=chess.getContext***'2d'***
context.strokeStyle="#BFBFBF"
var logo=new Image******
logo.src="images/logo.png"
/**/
logo.onload=function******{
context.drawImage***logo,0,0,450,450***
qipan******
/**/
}
/**/
function qipan******{
for***var i=0i<15i++***{
context.moveTo***15+i*30,15***
context.lineTo***15+i*30,430***
context.stroke******
context.moveTo***15,15+i*30***
context.lineTo***435,15+i*30***
context.stroke******
}
}
/***定义onesStep函式来绘制棋子*/
var oneStep=function***i,j,me***{
context.beginPath******
context.arc***15+i*30,15+j*30,13,0,2*Math.PI***
context.closePath******
var gradient=context.createRadialGradient***15+i*30+2,15+j*30-2,13,15+i*30+2,15+j*30-2,0***
if***me***{
gradient.addColorStop***0,"#0A0A0A"***
gradient.addColorStop***1,"#636766"***
}
else{
gradient.addColorStop***0,"#D1D1D1"***
gradient.addColorStop***1,"#F9F9F9"***
}
context.fillStyle=gradient
context.fill******
}
/**/
chess.onclick=function***e***{
if***over***{
return
}
if***!me***{
return
}
var x=e.offsetX
var y=e.offsetY
var i=Math.floor***x/30***
var j=Math.floor***y/30***
if***chessBord[i][j]==0***{
oneStep***i,j,me***
chessBord[i][j]=1
for***var k=0k<countk++***{
if***wins[i][j][k]***{
myWin[k]++
puterWin[k]=6
if***myWin[k]==5***{
window.alert***"你赢了"***
over=true
}
}
}
if***!over***{
me=!me
puterAI******
}
}
}
定义puterAI函式
var puterAI=function******{
var myScore=[]
var puterScore=[]
var max=0
var u=0, v=0
for***var i=0i<15i++***{
myScore[i]=[]
puterScore[i]=[]
for***var j=0j<15j++***{
myScore[i][j]=0
puterScore[i][j]=0
}
}
for***var i=0i<15i++***{
for***var j=0j<15j++***{
if***chessBord[i][j]==0***{
for***var k=0k<countk++***{
if***wins[i][j][k]***{
if***myWin[k]==1***{
myScore[i][j]+=200
} else if***myWin[k]==2***{
myScore[i][j]+=400
} else if***myWin[k]==3***{
myScore[i][j]+=2000
} else if***myWin[k]==4***{
myScore[i][j]+=10000
}
if***puterWin[k]==1***{
puterScore[i][j]+=200
} else if***puterWin[k]==2***{
puterScore[i][j]+=400
} else if***puterWin[k]==3***{
puterScore[i][j]+=2000
} else if***puterWin[k]==4***{
puterScore[i][j]+=10000
}
}
}
if***myScore[i][j]>max***{
max=myScore[i][j]
u=i
v=j
} else if***myScore[i][j]==max***{
if***puterScore[i][j]>puterScore[u][v]***{
u=i
v=j
}
}
if***puterScore[i][j]>max***{
max=puterScore[i][j]
u=i
v=j
} else if***puterScore[i][j]==max***{
if***myScore[i][j]>myScore[u][v]***{
u=i
v=j
}
}
}
}
}
oneStep***u,v,false***
chessBord[u][v]=2
for***var k=0k<countk++***{
if***wins[u][v][k]***{
puterWin[k]++
myWin[k]=6
if***puterWin[k]==5***{
window.alert***"狗狗赢了"***
over=true
}
}
}
if***!over***{
me=!me
}
}
/**/
}
6以上步骤全部搞定之后,就可以执行index档案玩游戏了。游戏初始化介面如下:
看过的人还:
1.五子棋怎么做棋
2.五子棋必胜开局技巧
3.五子棋的基础知识讲解
4.五子棋必胜步骤图走法
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)