黑白棋简单对战下载链接(只能实现人人对战,人机,网络自行编写,大致模板已经有了):
黑白棋人人对战实现(人机,网络暂不可用,自行编写)-桌面系统文档类资源-CSDN下载
黑白棋吃子规则:
int ChessForm::judge(int x,int y,void *chess,Chess::ChessBg currentRole,bool eatChess)
{
//黑白棋落子规则
//除非至少翻转了对手的一个棋子,否则就不能落子。如果一方没有合法棋步,也就是说不管他下到哪里,
//都不能至少翻转对手的一个棋子,那他这一轮只能弃权,而由他的对手继续落子直到他有合法棋步可下。
//棋盘的八个方向
int dir[8][2]={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};
int tempx=x,tempy=y; //保存临时棋盘数组坐标位置
int i=0,eat=0; //初始化数据
typedef int(*p)[19]; //自定义类型
p chessFalg=p(chess); //类型转换
if(chessFalg[tempx][tempy] != 0) //如果此方格内已有棋子,返回
{
return 0;
}
//棋盘的八个方向
for(i=0;i<8;i++)
{
tempx +=dir[i][0];
tempy +=dir[i][1]; //准备判断相邻的棋子
//如果没有出界,且相邻棋子是对方棋子,才有吃子的可能
if(tempx<=18 && tempx>=1 && tempy<=18 && tempy>=1
&&(chessFalg[tempx][tempy] != currentRole) && (chessFalg[tempx][tempy] != Chess::Empty))
{
tempx +=dir[i][0];
tempy +=dir[i][1]; //判断下一个,向前走一步
while(tempx <=18 &&tempx >=1 &&tempy<=18 && tempy >=1)
{
if(chessFalg[tempx][tempy] ==0) //遇到空位跳出
{
break;
}
if(chessFalg[tempx][tempy]==currentRole) //找到自己的棋子,代表可以吃子
{
if(eatChess == true) //确定吃子
{
chessFalg[x][y]=currentRole;
tempx -= dir[i][0];
tempy -= dir[i][1]; //后退一步
while(tempx != x || tempy != y) //只要没有回到开始位置就执行
{
chessFalg[tempx][tempy] = currentRole; //标志为自己的棋子
tempx -= dir[i][0]; //继续后退一步
tempy -= dir[i][1];
eat++; //累计
}
}
else //不吃子只是判断这个位置能不能吃子
{
tempx -=dir[i][0];
tempy -=dir[i][1]; //后退一步
while(tempx != x || tempy != y) //只计算可以吃子的个数
{
tempx -=dir[i][0];
tempy -=dir[i][1]; //继续后退一步
eat++;
}
}
break;
}//没有找到自己的棋子,就向前走一步
tempx += dir[i][0];
tempy += dir[i][1];
}
}//如果这个方向不能吃子,就换一个方向
tempx =x;
tempy=y;
}
return eat;
}