又是一个黑白棋的大模拟,这种棋类模拟通常分为多个函数实现能大大减少代码量。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define N 15
char mat[N][N],player[2],com[4];
bool state;
typedef struct node{
int x,y;
};
bool judge(int x,int y){
if(x>=0&&y>=0&&x<=7&&y<=7) return true;
else return false;
}
node leg[100];
int gox[8]={0,0,-1,1,1,1,-1,-1},goy[8]={-1,1,0,0,-1,1,-1,1};
int ret(char a){
if(a=='W') return 0;
if(a=='B') return 1;
else return -1;
}
node Move(int a,int b){
int x,y;
bool flag;
for(int i=0;i<8;i++){
x=a+gox[i];
y=b+goy[i];
flag=false;
if(judge(x,y)){
if(~ret(mat[y][x])){//如果下一格不为空
if(state^ret(mat[y][x])){//如果下一格是敌方棋子
while(1){
x=x+gox[i];
y=y+goy[i];
if(judge(x,y)){
if(~ret(mat[y][x])){
if(!(state^ret(mat[y][x]))){
flag=true;
break;
}
}
else break;
}
else break;
}
if(flag){
x=a;
y=b;
while(1){
x=x+gox[i];
y=y+goy[i];
if(!(state^ret(mat[y][x]))){
break;
}
else{
if(state){
mat[y][x]='B';
}
else mat[y][x]='W';
}
}
}
}
}
}
}
if(state){
mat[b][a]='B';
}
else mat[b][a]='W';
node rnt;
rnt.x=0;
rnt.y=0;
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
if(mat[i][j]=='W') rnt.y++;
if(mat[i][j]=='B') rnt.x++;
}
}
return rnt;
}
void deal(char *a){
int x,y;
int n=0;
node ans;
bool flag,flag2;
if(a[0]=='L'||a[0]=='M'){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
x=j;
y=i;
flag=false;
if(ret(mat[i][j])!=-1) continue;
for(int k=0;k<8;k++){
if(flag) break;
x=j+gox[k];
y=i+goy[k];
if(judge(x,y)){//判断该方向上的下一个点是否在棋盘内
if(~ret(mat[y][x])){//判断下一格是否为空
if(state^ret(mat[y][x])){//判断下一个点是否是敌方的点
while(1){//寻找己方的点
x+=gox[k];
y+=goy[k];
if(judge(x,y)){
if(~ret(mat[y][x])){
if(!(state^ret(mat[y][x]))){//如果是己方的点
flag=true;//该位置合法
break;
}
}
else break;
}
else break;
}
}
else continue;
}
}
}
if(flag){//如果位置合法,存储
leg[n].x=j;
leg[n++].y=i;
}
}
}
if(a[0]=='L'){
if(n){
for(int i=0;i<n;i++){
printf("(%d,%d)",leg[i].y+1,leg[i].x+1);
if(i==n-1) printf("\n");
else printf(" ");
}
}
else printf("No legal move.\n");
}
else{
flag=false;
y=a[1]-'1';
x=a[2]-'1';
for(int i=0;i<n;i++){
if(leg[i].x==x&&leg[i].y==y){
flag=true;
break;
}
}
if(flag){
ans=Move(x,y);
printf("Black - %2d White - %2d\n",ans.x,ans.y);
}
else{
state^=1;
ans=Move(x,y);
printf("Black - %2d White - %2d\n",ans.x,ans.y);
}
state^=1;
}
}
else if(a[0]=='Q'){
for(int i=0;i<8;i++){
printf("%s\n",mat[i]);
}
}
}
int main()
{
int T;
cin>>T;
getchar();
while(T--){
for(int i=0;i<8;i++){
gets(mat[i]);
}
gets(player);
if(player[0]=='W') state=0;
else state=1;
while(1){
gets(com);
deal(com);
if(com[0]=='Q') break;
}
if(T)
printf("\n");
}
return 0;
}