一、首先我们先了解一下什么叫做博弈树: 博弈树是指由于动态博弈参与者的行动有先后次序,因此可以依次将参与者的行动展开成一个树状图形。
博弈树的几个特点:
(1) 博弈的初始格局是初始节点。
(2) 在博弈树中,"或"节点和"与"节点是逐层交替出现的。自己一方扩展的节点之间是"或"关系,对方扩展的节点之间是"与"关系。双方轮流地扩展节点。
(3) 所有自己一方获胜的终局都是本原问题,相应的节点是可解节点;所有使对方获胜的终局都认为是不可解节点。
二、智能五子棋要怎么用到博弈树
首先何为智能呢?
按我的理解,就是尽量的往自己有利的位置下棋,并尽可能的让自己获胜。
可以通过什么来保证自己是有利的呢?
首先我们要设计估值函数:
以刚落下棋子(x,y)的位置为中心,得到一个11乘11的正方形,即为(x-5,y-5),(x+5,y-5),(x-5,y+5),(x+5,y+5)这四个点所围成的正方形,我称这个正方形为得分区域;
计算得分是逐个方向考虑: 横向得分+竖线得分+左斜线得分+右斜线得分
得分规则:
五:15625
活四:3125
单四:630
活三:625
单三:130
活二:125
单二:30
活一:25
单一:5
死一、死二、死三、死四:0
估值规则:AI方-玩家
AI方=横向得分+竖线得分+左斜线得分+右斜线得分;
玩家=横向得分+竖线得分+左斜线得分+右斜线得分;
有了估值函数后就可以计算出棋子所下位置的得分;
接下来就是对棋子所下位置进行判断,是否为当前所需要的最高得分,由于表达能力有限,就用我的代码来解释一下:
private Point PCTurn() {
int PCScore = 0;
int HumanScore = 0;
int score = 0;
int maxX = -1, maxY = -1, maxScore = -30000;
int be = 0;
int end = 19;
if (pcFirstDown) {
be = 7;
end = 10;
pcFirstDown = false;
}
for (int i = be; i < end; i++) {
for (int j = be; j < end; j++)
{
//初始化分数;
PCScore = 0;
HumanScore = 0;
score = 0;
if(qizi[i,j]!=0){
continue;
}
qizi[i, j] = pcColor;
score = PCScore = guzhi(pcColor,i,j);//得到分数;
//Console.WriteLine("x=" + i + " y=" + j + " score=" + score + " maxScore=" + maxScore);
if (score >= 13000)
{
isComputerWin = true;
}
if (maxScore >= PCScore) {
//当maxScore值大于PCScore时剪枝
qizi[i, j] = 0;
continue;
}
for (int n = be; n < end; n++)
{
if (maxScore >= score) {
//当极大值层的极大值大于score时,剪枝
break;
}
for (int m = be; m < end; m++)
{
if (qizi[n, m] != 0) {
continue;
}
qizi[n, m] = humanColor;
HumanScore = guzhi(humanColor,n,m);
if (score > PCScore - HumanScore) {
score = PCScore - HumanScore;//不停的更新极小值层的极小值
}
qizi[n, m] = 0;
}
}
qizi[i, j] = 0;
if (score > maxScore) {
maxScore = score;
maxX = i;
maxY = j;
}
}
}
//Console.WriteLine("PC:"+maxScore);
return new Point(maxX, maxY);
}
以上就是文章的主要内容。