#include<iostream>#include<string>#include<cmath>usingnamespacestd;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;i<BOARDSIZE;++i)for(j=0;j<BOARDSIZE;++j){clear(b,i,j);}//摆放各个棋子for(i=0;i<BOARDSIZE;++i){//棋盘前两行是白方b[0][i].side=WHITE;b[1][i].side=WHITE;b[1][i].pt=PAWN;//上面第二行是白方的兵//棋盘最后两行是黑方b[6][i].side=BLACK;b[7][i].side=BLACK;b[6][i].pt=PAWN;//倒数第二行是黑方的兵}b[0][0].pt=b[0][7].pt=b[7][0].pt=b[7][7].pt=ROOK;//初始化车的位置b[0][1].pt=b[0][6].pt=b[7][1].pt=b[7][6].pt=KNIGHT;//初始化马的位置b[0][2].pt=b[0][5].pt=b[7][2].pt=b[7][5].pt=BISHOP;//初始化象的位置b[0][3].pt=b[7][3].pt=QUEEN;//初始化后的位置b[0][4].pt=b[7][4].pt=KING;//初始化王的位置//初始化王车易位使用的布尔变量whitecastled=false;blackcastled=false;white0rookMoved=false;white7rookMoved=false;black0rookMoved=false;black7rookMoved=false;whitekingMoved=fals
2020年国际象棋C 来自淘豆网m.daumloan.com转载请标明出处.