五子棋人机对战代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.2电脑下棋算法设计
本款游戏最核心的地方就是算法,因为这是整个程序最难的模块。算法的中心思想是:
利用分数代表每个位置的重要程度,越重要的位置的分数值会越高,当电脑下棋时会先将电脑和玩家棋型的分数分别计算一遍,然后选择二者中分数最高的点下子。如果玩家的分数高, 那么代表电脑应该防守,如果电脑的分数高,那么代表电脑应该进攻。
解释一下其中的活,半活,死,半死:
活:代表几个子是相连的,中间没有空格,两端都至少有一个空格。
半活:代表几个子不是相连的,几个子中间有一个空格,两端都至少有一个空格。
死:代表几个子是相连的,中间没有空格,但有一端紧挨着对方的棋子或有一端正好在
棋盘的边界。
半死:代表几个子不是相连的,几个子中间有一个空格,而且一端紧挨着对方的棋子或
有一端正好在棋盘的边界。
每个位置的分数的计算方式是各个方向的分数相加,最后找出电脑棋型和玩家棋型的分
数的最高的位置为电脑的下棋点下棋。
具体的代码如下:
public void qixi ng(){
for ( int i=0;i<17;i++){
for ( int j=0;j<17;j++){
if (qipan [i+1][j+1]==0){ // 说明此处没有棋子
qix in gPC [i][j]=
heiheng(i,j,2)+heishu(i,j,2)+heizuoxie(i,j,2)+heiyouxie(i,j,2);
qixingPlayer [i][j] =
heiheng(i,j,1)+heishu(i,j,1)+heizuoxie(i,j,1)+heiyouxie(i,j,1);
} else {
qixingPC [i][j] = 0; qixingPlayer [i][j] = 0; }
}
}
}
// 算出黑子横方向的棋型数值
public int heihen ( int hang, int lie, int num){
int k = 0; // 记录空白处的个数
int count = 1; // 记录可以形成几连
int n = hang+1; // 对应棋盘的行
int m = lie+1; // 对应棋盘的列
boolean left = false ; // 判断左边是否有黑子
boolean liveLeft = false ; // 判断左边是活还是死boolean liveRight = false ; // 判断右边是活还是死while (( qipan [n][m-1]!=-1)&&( qipan [n][m-1]==num|| qipan ){
[n][m-1]==0) if ( qipan [n][m-1]==0&&k<1){ // 第一个空白
if ( qipan [n][m-2]!=num){ liveLeft = true ; break ;
}
k++;
m--;
} else if ( qipan [n][m-1]==num){ // 黑子
left = true ;
m--;
} else { // 第二个空白
liveLeft = true ;
break ;
}
}
if (!left){
k = 0;
m = lie+1;
while (( qipan [n][m+1]!=-1)&&( qipan [n][m+1]==num|| qipan [n][m+1]==0)
int t = qipan [n][m+1]; if (m==lie){
count++; m++; continue ;
}
if (t==0&&k<1){ // 第一个空白
if ( qipan [n][m+2]!=num){ liveRight = true ; break ;
}
k++; m++;
} else if (t==0&&k>0){ // 第二个空白 liveRight = true ; break ; } else { // 黑子
m++; count++;
}
}
return jieguo(liveLeft,liveRight,count,k,num);
}
// 算出黑子竖方向的棋型数值 public
int heishu( int hang, int lie, int num){ int k = 0; // 记录空白处的个数 int count = 1; // 记录可以形成几连 int n = hang+1; // 对应棋盘的行 int
m = lie+1;
// 对应棋盘的列
boolean top =
false ; // 判断上边是否有黑子 boolean liveLeft = false boolean liveRight = false
while (( qipan [n-1][m]!=-1)&&( qipan [n-1][m]==num|| qipan ){
if ( qipan [n-1][m]==0&&k<1){ // 第一个空白
if ( qipan [n-2][m]!=num){ liveLeft = true ;
break ;
}
k++; n--;
){
[n-1][m]==0)