#include#include#includeusingnamespacestd;enumTResult{//结局状态WHITEWIN=1,//白方赢BLACKWIN,//黑方赢STALEMATE,//僵局DRAW,//和局DEAD,//过多的输入PUZZLE,//无法决定移动棋子ILLEGAL//非法};constcharRESULT[8][20]={//结局状态输出表示"","WhiteWin","BlackWin","Stalemate","Draw","DeadMoves","PuzzleMove","IllegalMove"};enumTPieceType{//棋子类型SPACE=0,PAWN,//兵KING,//王QUEEN,//后ROOK,//车BISHOP,//象KNIGHT//马};enumTSide{NONE=0,WHITE,//黑方BLACK//白方};typedefstruct{//棋盘每个位置的表示TSideside;//所属玩家TPieceTypept;//棋子类型}TPiece;constintBOARDSIZE=8;//棋盘大小typedefTPieceTBoard[BOARDSIZE][BOARDSIZE];//棋盘intn;//棋谱步数TResultresult;//最后结局/**用来进行王车易位的布尔变量**whitecastled:白方是否已经王车易位*blackcastled:黑方是否已经王车易位*white0rookMoved:白方号位的车是否已经移动*white7rookMoved:白方号位的车是否已经移动*black0rookMoved:黑方号位的车是否已经移动*black7rookMoved:黑方号位的车是否已经移动*whitekingMoved:白方王是否已经移动*blackkingMoved:黑方王是否已经移动**/boolwhitecastled,blackcastled,white0rookMoved,white7rookMoved,black0rookMoved,black7rookMoved,whitekingMoved,blackkingMoved;TPieceTypeChessType(conststring&move){switch(move[0]){case'K'://王returnKING;case'Q'://后returnQUEEN;case'R'://车returnROOK;case'B'://象returnBISHOP;case'N'://马returnKNIGHT;}returnPAWN;//兵}TSideOpponent(TSideside){//获取对手类型if(side==WHITE)returnBLACK;returnWHITE;}voidclear(TBoardb,intx,inty){//清空棋盘b的(x,y)位置b[x][y].side=NONE;//所属玩家b[x][y].pt=SPACE;//棋子类型}voidinit(TBoardb){//初始化棋盘inti,j;//清空整个棋盘for(i=0;iBOARDSIZE||y>BOARDSIZE){returntrue;}returnfalse;}boolCanMovePawn(TBoardb,intx,inty,intx2,inty2,intflag){//判断能否把兵从(x,y)移动到(x2,y2),当flag=1时,表示(x,y)直接移动到(x2,y2),flag为其他表示从(x,y)吃子到(x2,y2)if(flag==1){//直接移动,即兵直线前进一格if(y!=y2||b[x2][y2].side!=NONE){//y坐标不能改变,无法前进returnfalse;}if(b[x][y].side==WHITE){//下棋的是白方if(x==1){//白方的兵是第一次移动returnx2==2||(x2==3&&b[2][y].side==NONE);//第一次移动兵可以移动格或格}else{returnx2==x+1;//不是第一次移动,就只能向前移动格}}else{//下棋的是黑方if(x==6){//黑方的兵是第一次移动returnx2==5||(x2==4&&b[5][y].side==NONE);//第一次移动兵可以移动格或格}else{returnx...