CSDN论坛升级的时候经常出现的那个无名游戏(原版游戏),我把它移植成C++版的了。
对原来的游戏算法做了少量的修改,也不知道难度有没有提高,反正还是很简单就给围住了。
为了方便修改算法,本游戏中使用了嵌入式脚本,游戏算法全部使用脚本完成。
目录下的"game.c"是脚本文件,如果有哪位大仙的AI算法精通,可以试着改改。
核心AI算法:
var function ComputerTryMove()
{
int x=this->computerPos.x;
int y=this->computerPos.y;
if(x<=0 || y<=0 || x>=this->mapSize || y>=this->mapSize)//检查是否已经到达边界
return -1;
//计算八个方向可移动距离
int d[8]=0;
int& px=this->mapData[x];
while(px[--y]==NULL_ID )
d[0]++;
if(px[y]==BORDER_ID)
d[0]=MAX_LENGTH-d[0];
int& px=this->mapData;
y=this->computerPos.y;
while(px[--x][--y]==NULL_ID)
d[1]++;
if(px[x][y]==BORDER_ID)
d[1]=MAX_LENGTH-d[1];
x=this->computerPos.x;
y=this->computerPos.y;
while(px[--x][y]==NULL_ID)
d[2]++;
if(px[x][y]==BORDER_ID)
d[2]=MAX_LENGTH-d[2];
x=this->computerPos.x;
while(px[--x][++y]==NULL_ID)
d[3]++;
if(px[x][y]==BORDER_ID)
d[3]=MAX_LENGTH-d[3];
x=this->computerPos.x;
y=this->computerPos.y;
while(px[x][++y]==NULL_ID)
d[4]++;
if(px[x][y]==BORDER_ID)
d[4]=MAX_LENGTH-d[4];
y=this->computerPos.y;
while(px[++x][++y]==NULL_ID)
d[5]++;
if(px[x][y]==BORDER_ID)
d[5]=MAX_LENGTH-d[5];
x=this->computerPos.x;
y=this->computerPos.y;
while(px[++x][y]==NULL_ID)
d[6]++;
if(px[x][y]==BORDER_ID)
d[6]=MAX_LENGTH-d[6];
x=this->computerPos.x;
while(px[++x][--y]==NULL_ID)
d[7]++;
if(px[x][y]==BORDER_ID)
d[7]=MAX_LENGTH-d[7];
//找出可移动的最长距离或离边界最短距离
int max=-1;
for(int i=0;i<8;i++)
{
if(d[i]>d[max])
max=i;
else if(d[i]==d[max])
{
if(Rand(0,1)==1)
max=i;
}
}
if(d[max]==0)
return 1;
int& x=this->computerPos.x;
int& y=this->computerPos.y;
//向找出的最优方向移动
px[x][y]=NULL_ID;
switchto(max)
{
case 0:
y--;
case 1:
x--;
y--;
case 2:
x--;
case 3:
x--;
y++;
case 4:
y++;
case 5:
x++;
y++;
case 6:
x++;
case 7:
x++;
y--;
}
if(px[x][y]==BORDER_ID)//是否已经到达边界?
{
px[x][y]=CPU_ID;
return -1;
}
px[x][y]=CPU_ID;
return 0;
}
你赢了之后会放烟花
源码下载
压缩包中有源码(全部工程源码)和编译好的游戏文件。
注意(一定要意):编译工具是VS2008的,上次一个计算器的源码就有很多人用VC6打不开。