1.输出格式注意 程序结束的结尾换行是否有多
2.输出黑白棋子数的时候数字%2d输出
3.边界值注意
4.打印所有合法点的时候两点之间有空格 最有一个点输出没有空格
5.可用Udebug上的测试数据测试下(不全)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
char board[8][8]={},current;
int up(char current,int i,int j) //判断是否合法 //上
{
if(board[i-1][j]==current||board[i-1][j]=='-'||board[i][j]!='-')
{
return 0;
}
else
{
for(int m=i-2;m>=0;m--)
{
if(board[m][j]=='-')
return 0;
else if(board[m][j]==current)
return 1;
}
}
return 0;
}
int down(char current,int i,int j) //下
{
if(board[i+1][j]==current||board[i+1][j]=='-'||board[i][j]!='-')
return 0;
else
{
for(int m=i+2;m<8;m++)
{
if(board[m][j]=='-')
return 0;
else if(board[m][j]==current)
return 1;
}
}
return 0;
}
int left(char current,int i,int j) //左
{
if(board[i][j-1]==current||board[i][j-1]=='-'||board[i][j]!='-')
return 0;
else
{
for(int n=j-2;n>=0;n--)
{
if(board[i][n]=='-')
return 0;
else if(board[i][n]==current)
return 1;
}
}
return 0;
}
int right(char current,int i,int j) //右
{
if(board[i][j+1]==current||board[i][j+1]=='-'||board[i][j]!='-')
return 0;
else
{
for(int n=j+2;n<8;n++)
{
if(board[i][n]=='-')
return 0;
else if(board[i][n]==current)
return 1;
}
}
return 0;
}
int leftup(char current,int i,int j) //左上
{
if(board[i-1][j-1]==current||board[i-1][j-1]=='-'||board[i][j]!='-')
return 0;
else
{
for(int m=i-2,n=j-2;m>=0&&n>=0;m--,n--)
{
if(board[m][n]=='-')
return 0;
else if(board[m][n]==current)
return 1;
}
}
return 0;
}
int rightup(char current,int i,int j) //右上
{
if(board[i-1][j+1]==current||board[i-1][j+1]=='-'||board[i][j]!='-')
return 0;
else
{
for(int m=i-2,n=j+2;m>=0&&n<8;m--,n++)
{
if(board[m][n]=='-')
return 0;
else if(board[m][n]==current)
return 1;
}
}
return 0;
}
int leftdown(char current,int i,int j) //左下
{
if(board[i+1][j-1]==current||board[i+1][j-1]=='-'||board[i][j]!='-')
return 0;
else
{
for(int m=i+2,n=j-2;m<8&&n>=0;m++,n--)
{
if(board[m][n]=='-')
return 0;
else if(board[m][n]==current)
return 1;
}
}
return 0;
}
int rightdown(char current,int i,int j) //右下
{
if(board[i+1][j+1]==current||board[i+1][j+1]=='-'||board[i][j]!='-')
return 0;
else
{
for(int m=i+2,n=j+2;m<8&&n<8;m++,n++)
{
if(board[m][n]=='-')
return 0;
else if(board[m][n]==current)
return 1;
}
}
return 0;
}
void num() //计算当前棋面黑白子的个数
{
int B=0,W=0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
if(board[i][j]=='B') B++;
if(board[i][j]=='W') W++;
}
printf("Black - %2d White - %2d\n",B,W);
}
void L(char current) //输出当前玩家所有合法操作
{
int flag=0,temp=0,p=0;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(up(current,i,j)||down(current,i,j)||left(current,i,j)||right(current,i,j)||leftup(current,i,j)||rightup(current,i,j)||leftdown(current,i,j)||rightdown(current,i,j))
{
temp++;
}
}
}
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(up(current,i,j)||down(current,i,j)||left(current,i,j)||right(current,i,j)||leftup(current,i,j)||rightup(current,i,j)||leftdown(current,i,j)||rightdown(current,i,j))
{
flag=1;
cout<<'('<<i+1<<','<<j+1<<')';
if(p!=temp-1)
{
cout<<' ';
p++;
}
else
p++;
}
}
}
if(flag==0)
{
cout<<"No legal move.";
}
cout<<endl;
}
int L2(char current) //判断当前玩家是否有合法操作
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(up(current,i,j)||down(current,i,j)||left(current,i,j)||right(current,i,j)||leftup(current,i,j)||rightup(current,i,j)||leftdown(current,i,j)||rightdown(current,i,j))
{
return 1;
}
}
}
return 0;
}
void Mup(int r,int c) //翻转棋子
{
board[r][c]=current;
if(board[r-1][c]!=current&&board[r-1][c]!='-')
{
for(int m=r-2;m>=0;m--)
{
if(board[m][c]=='-')
break;
if(board[m][c]==current)
{
for(int p=r-1;p>=m;p--)
board[p][c]=current;
break;
}
}
}
}
void Mdown(int r,int c)
{
board[r][c]=current;
if(board[r+1][c]!=current&&board[r+1][c]!='-')
{
for(int m=r+2;m<8;m++)
{
if(board[m][c]=='-')
break;
if(board[m][c]==current)
{
for(int p=r+1;p<=m;p++)
board[p][c]=current;
break;
}
}
}
}
void Mleft(int r,int c)
{
board[r][c]=current;
if(board[r][c-1]!=current&&board[r][c-1]!='-')
{
for(int n=c-2;n>=0;n--)
{
if(board[r][n]=='-')
break;
if(board[r][n]==current)
{
for(int q=c-1;q>=n;q--)
board[r][q]=current;
break;
}
}
}
}
void Mright(int r,int c)
{
board[r][c]=current;
if(board[r][c+1]!=current&&board[r][c+1]!='-')
{
for(int n=c+2;n<8;n++)
{
if(board[r][n]=='-')
break;
if(board[r][n]==current)
{
for(int q=c+1;q<n;q++)
{
board[r][q]=current;
}
break;
}
}
}
}
void Mleftup(int r,int c)
{
board[r][c]=current;
if(board[r-1][c-1]!=current&&board[r-1][c-1]!='-')
{
for(int m=r-2,n=c-2;m>=0&&n>=0;m--,n--)
{
if(board[m][n]=='-')
break;
if(board[m][n]==current)
{
for(int p=r-1,q=c-1;p>m&&q>n;p--,q--)
board[p][q]=current;
break;
}
}
}
}
void Mrightup(int r,int c)
{
board[r][c]=current;
if(board[r-1][c+1]!=current&&board[r-1][c+1]!='-')
{
for(int m=r-2,n=c+2;m>=0&&n<8;m--,n++)
{
if(board[m][n]=='-')
break;
if(board[m][n]==current)
{
for(int p=r-1,q=c+1;p>m&&q<n;p--,q++)
board[p][q]=current;
break;
}
}
}
}
void Mleftdown(int r,int c)
{
board[r][c]=current;
if(board[r+1][c-1]!=current&&board[r+1][c-1]!='-')
{
for(int m=r+2,n=c-2;m<8&&n>=0;m++,n--)
{
if(board[m][n]=='-')
break;
if(board[m][n]==current)
{
for(int p=r+1,q=c-1;p<m&&q>n;p++,q--)
board[p][q]=current;
break;
}
}
}
}
void Mrightdown(int r,int c)
{
board[r][c]=current;
if(board[r+1][c+1]!=current&&board[r+1][c+1]!='-')
{
for(int m=r+2,n=c+2;m<8&&n<8;m++,n++)
{
if(board[m][n]=='-')
break;
if(board[m][n]==current)
{
for(int p=r+1,q=c+1;p<m&&q<n;p++,q++)
board[p][q]=current;
break;
}
}
}
}
void printboard()
{
for(int i=0;i<8;i++) //输出棋盘
{
for(int j=0;j<8;j++)
cout<<board[i][j];
cout<<endl;
}
}
void M(char r,char c)
{
r=r-'0'-1;c=c-'0'-1; //将char型转为int型再-1让棋盘适配数组
while(L2(current)==0) //如果当前玩家没有合法操作则则切换游戏者
{
if(current=='B')
current='W';
else
current='B';
}
Mleftup(r,c);
Mup(r,c);Mdown(r,c);Mleft(r,c);Mright(r,c);Mrightup(r,c);Mleftdown(r,c);Mrightdown(r,c);
num();
if(current=='W')
current='B';
else
current='W';
}
int main()
{
//freopen("c:\\test.txt","r",stdin);
//freopen("c:\\out.txt","w",stdout);
int T;
cin>>T;
while(T--)
{
for(int i=0;i<8;i++) //输入棋盘
for(int j=0;j<8;j++)
cin>>board[i][j];
cin>>current; //当前玩家
char command;
while(cin>>command) //输入命令
{
if(command=='L') L(current); //打印合法操作
if(command=='Q') break;
if(command=='M')
{
char r,c;
cin>>r>>c;
M(r,c);
}
}
printboard();
if(T)
cout<<endl;
}
}
/*
Udebug上的测试数据
10
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M46
L
M34
L
M23
L
M47
L
M56
L
M57
L
M43
L
M33
L
M63
L
M64
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
B
L
M56
L
M64
L
M33
L
M57
L
M74
L
M53
L
M42
L
M84
L
M63
L
M34
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M64
L
M63
L
M35
L
M34
L
M62
L
M26
L
M43
L
M52
L
M23
L
M25
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M35
L
M56
L
M64
L
M53
L
M63
L
M25
L
M46
L
M73
L
M66
L
M57
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M53
L
M63
L
M35
L
M52
L
M51
L
M41
L
M31
L
M36
L
M64
L
M34
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
B
L
M34
L
M33
L
M65
L
M46
L
M36
L
M66
L
M43
L
M53
L
M22
L
M23
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M53
L
M65
L
M46
L
M52
L
M75
L
M76
L
M63
L
M35
L
M41
L
M47
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
B
L
M43
L
M33
L
M34
L
M35
L
M25
L
M53
L
M36
L
M24
L
M63
L
M65
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
B
L
M34
L
M53
L
M66
L
M56
L
M67
L
M35
L
M52
L
M33
L
M36
L
M62
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M64
L
M43
L
M35
L
M65
L
M75
L
M26
L
M42
L
M36
L
M46
L
M56
Q
*/