Programming 版 (精华区)
发信人: lofe ()感激生活(), 信区: Programming
标 题: 五子棋核心代码!
发信站: 哈工大紫丁香 (Sun Sep 3 16:44:55 2000), 转信
现将“五子棋”算法简单介绍如下:
for(k=1;k<=2;k++)
{
for(i=1;data[x-i][y]==k;i++);
for(j=1;data[x+j][y]==k;j++);
if(data[x-i][y]==0)v2+=1;if(data[x+j][y]==0)v2+=1;
v+=i+j;v1=i+j; values[k-1]+=zz(v1,v2,k);v2=0;
for(i=1;data[x][y-i]==k;i++);
for(j=1;data[x][y+j]==k;j++);
if(data[x][y-i]==0)v2+=1;if(data[x][y+j]==0)v2+=1;
v+=i+j;v1=i+j; values[k-1]+=zz(v1,v2,k);v2=0;
for(i=1;data[x-i][y-i]==k;i++);
for(j=1;data[x+j][y+j]==k;j++);
if(data[x-i][y-i]==0)v2+=1;if(data[x+j][y+j]==0)v2+=1;
v+=i+j; v1=i+j; values[k-1]+=zz(v1,v2,k);v2=0;
for(i=1;data[x-i][y+i]==k;i++);
for(j=1;data[x+j][y-j]==k;j++);
if(data[x-i][y+i]==0)v2+=1;if(data[x+j][y-j]==0)v2+=1;
v+=i+j; v1=i+j; values[k-1]+=zz(v1,v2,k);v2=0;
}
return(values[0]+values[1]);
以上部分为“五子棋”的算法核心部分,思路是:
1。判断任意点是否为可落子点。(data[x][y]为棋盘数组,'0'代表无子,'1'代表
黑子,'2'代表白子。)
2。如果是可落子点的话则:在横、竖、双斜四个方向上判断周围子的分布情况。比
如在横向上连续有两个同色子且两子以外没有任何子,同时此两子为敌方的子,则返回
一个值:values代表此点的落子利益值。(具体算法解释不再祥诉,可参看源程序相关
部分)
3.最后再一对方的角度再演算一遍,即可求出各点的落子利弊值。以此为依据可确
定具体落子点。
int zz(v1,v2,k) /*每个可能落子点的加权值(电脑走棋时)*/
int v1,v2,k;
{ int value1,n;
value1=0;n=0;
if(v1==3&&v2==0){value1+=0;if(k==2)value1+=2;}
if(v1==3&&v2==1){value1+=11;if(k==2)value1+=5;}
if(v1==3&&v2==2){value1+=12;if(k==2)value1+=6;}
if(v1==4&&v2==0){value1=0;}
if(v1==4&&v2==1){value1+=15;if(k==2)value1+=7;}
if(v1==4&&v2==2){value1+=31;if(k==2)value1+=62;}
if(v1==5&&v2==0){value1=0;}
if(v1==5&&v2==1){value1+=95;if(k==2)value1+=31;}
if(v1==5&&v2==2){value1+=400;if(k==2)value1+=32;}
if(v1==6&&v2==1){value1+=600;if(k==2)value1+=20;}
if(v1==6&&v2==2){value1+=700;if(k==2)value1+=20;}
n=value1;
if(n==126||n==62||n==91||n==80||n==139||n==78||n==46||n==58||n==74||n==89)
{value1+=133;if(k==2)value1+=20;
}
return(value1);
}
int check() /*选择加权值最大的点作为电脑的落子点*/
{int i,j,v;
for (i=0;i<=22;i++)
for (j=0;j<=22;j++)
value[i][j]=0;
for (i=0;i<=22;i++)
for (j=0;j<=22;j++)
{ if(data[i][j]==0)
{
value[i][j]=select(i,j);
}
}
v=0;
for(i=0;i<=22;i++)
for(j=0;j<=22;j++)
{if(value[i][j]>=v)
{x3=i;y3=j;
v=value[i][j];
}
}
if(v==0){x3=6;y3=6;}
return(NULL);
}
--
其实
放飞的风筝
随时可以飞回身旁
需要的只是
一个留下的理由!
※ 修改:.haojs 于 Sep 3 16:42:23 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.502毫秒