您好,欢迎访问三七文档
////main.c//象棋//車马相仕帅仕相马車//十十十十十十十十十//十炮十十十十十炮十//兵十兵十兵十兵十兵//十十十十十十十十十//--楚河-汉界--//十十十十十十十十十//卒十卒十卒十卒十卒//十炮十十十十十炮十//十十十十十十十十十//車马象士将士象马車//Createdbytarena121on15/8/12.//Copyright(c)2015年Tarena.Allrightsreserved.//#includestdio.h#includestdbool.h#includemath.h#includestdlib.h#defineR(piece)\033[31m#piece\033[0m//红色棋子#defineB(piece)\033[30m#piece\033[0m//黑色棋子#defineCROSS\033[33m十\033[0m//定义外部变量,棋盘坐标char*array[11][9];intxi,yi;//要移动的棋子intxj,yj;//移动的目标位置boolisStandard=1;//是否符合规则,初始值1,符合boolgameOverSign=1;//游戏是否结束,0结束boolrestart=0;//生成棋盘voidchessboardBuilding();//打印棋盘voidprintChessboard();//判断是红棋还是黑棋,红旗返回1,黑棋返回-1,否则返回0intredOrBlack(intx,inty);//红棋移动voidredMove();//黑棋移动voidblackMove();//每种棋子的规则voidrulesOfAllKindsOfChessPieces();//判断游戏结束voidisGameOver();//**************************主函数******************************intmain(){//生成棋盘chessboardBuilding();//打印棋盘printChessboard();//开始下棋intturn=-1;while(gameOverSign){isStandard=1;turn*=(-1);//双方交替下棋switch(turn){case1:redMove();turn=(restart)?(turn*-1):turn;break;case-1:blackMove();turn=(restart)?(turn*-1):turn;break;}isGameOver();}printf(游戏结束!\n);}//主函数结束//*************************自定义函数*****************************//生成棋盘voidchessboardBuilding(){for(inti=0;i11;i++){for(intj=0;j9;j++){array[i][j]=CROSS;}printf(\n);}array[5][0]=array[5][1]=array[5][4]=array[5][7]=array[5][8]=-;array[5][2]=B(楚);array[5][3]=B(河);array[5][5]=B(汉);array[5][6]=B(界);//布置红棋array[0][0]=array[0][8]=R(車);array[0][1]=array[0][7]=R(马);array[0][2]=array[0][6]=R(相);array[0][3]=array[0][5]=R(仕);array[0][4]=R(帅);array[2][1]=array[2][7]=R(炮);array[3][0]=array[3][2]=array[3][4]=array[3][6]=array[3][8]=R(兵);//布置黑棋array[10][0]=array[10][8]=B(車);array[10][1]=array[10][7]=B(马);array[10][2]=array[10][6]=B(相);array[10][3]=array[10][5]=B(仕);array[10][4]=B(将);array[8][1]=array[8][7]=B(炮);array[7][0]=array[7][2]=array[7][4]=array[7][6]=array[7][8]=B(卒);}//打印棋盘voidprintChessboard(){//显示printf(\033[43;30m中国象棋欢迎您\033[0m\n\n);for(inti=0;i11;i++){for(intj=0;j9;j++){printf(%s,array[i][j]);}printf(\n);}}//判断是红棋还是黑棋,红旗返回1,黑棋返回-1,否则返回0intredOrBlack(intx,inty){if(array[x][y]==R(車)||array[x][y]==R(马)||array[x][y]==R(相)||array[x][y]==R(仕)||array[x][y]==R(帅)||array[x][y]==R(炮)||array[x][y]==R(兵)){return1;}elseif(array[x][y]==B(車)||array[x][y]==B(马)||array[x][y]==B(象)||array[x][y]==B(仕)||array[x][y]==B(将)||array[x][y]==B(炮)||array[x][y]==B(卒)){return-1;}elsereturn0;}//红棋移动voidredMove(){if(restart){printf(违反游戏规则,请重新输入\n);restart=0;}printf([红棋]请输入你要移动的棋子:\n);scanf(%d%d,&xi,&yi);printf([红棋]请输入你要放置的位置:\n);scanf(%d%d,&xj,&yj);rulesOfAllKindsOfChessPieces();printChessboard();}//黑棋移动voidblackMove(){if(restart){printf(违反游戏规则,请重新输入\n);restart=0;}printf([黑棋]请输入你要移动的棋子:\n);scanf(%d%d,&xi,&yi);printf([黑棋]请输入你要放置的位置:\n);scanf(%d%d,&xj,&yj);rulesOfAllKindsOfChessPieces();printChessboard();}//判断游戏结束voidisGameOver(){boolsign_r=0;boolsign_b=0;for(inti=0;i11;i++){for(intj=0;j9;j++){if(array[i][j]==R(帅)){sign_r=1;}elseif(array[i][j]==B(将)){sign_b=1;}}}if((sign_r==0)||(sign_b==0)){gameOverSign=0;}}//每种棋子的规则voidrulesOfAllKindsOfChessPieces(){//R(車)----------------------------------------if(array[xi][yi]==R(車)){if(yi==yj)//列坐标不变,同列移动{for(inti=xi+1;ixj;i++){if(i==5)continue;//如果行等于5,跳过if(array[i][yi]!=CROSS)isStandard=0;//如果初始位置和目标位置之间有棋子,则不符合规则}for(inti=xi-1;ixj;i--){if(i==5)continue;//如果行等于5,跳过if(array[xi][yi]!=CROSS)isStandard=0;}}elseif(xi==xj)//行坐标不变,同行移动{for(inti=yi+1;iyj;i++)if(array[xi][i]!=CROSS)isStandard=0;for(inti=yi-1;iyj;i--)if(array[xi][i]!=CROSS)isStandard=0;}if((xi==xj||yi==yj)&&isStandard&&(redOrBlack(xj,yj)!=1))//如果棋子直行、没有犯规且落点不是红棋,可以移动{array[xi][yi]=CROSS;array[xj][yj]=R(車);}else{restart=1;}}//B(車)----------------------------------------elseif(array[xi][yi]==B(車)){if(yi==yj)//列坐标不变,同列移动{for(inti=xi+1;ixj;i++){if(i==5)continue;//如果行等于5,跳过if(array[i][yi]!=CROSS)isStandard=0;//如果初始位置和目标位置之间有棋子,则不符合规则}for(inti=xi-1;ixj;i--){if(i==5)continue;//如果行等于5,跳过if(array[i][yi]!=CROSS)isStandard=0;}}elseif(xi==xj)//行坐标不变,同行移动{for(inti=yi+1;iyj;i++)if(array[xi][i]!=CROSS)isStandard=0;for(inti=yi-1;iyj;i--)if(array[xi][i]!=CROSS)isStandard=0;}if((xi==xj||yi==yj)&&isStandard&&redOrBlack(xj,yj)!=-1)//如果棋子直行、没有犯规且落点不是红棋,可以移动{array[xi][yi]=CROSS;array[xj][yj]=B(車);}else{restart=1;}}//R(马)----------------------------------------elseif(array[xi][yi]==R(马)){if((redOrBlack(xj,yj)!=1)&&((xj==xi-2&&yj==yi-1&&redOrBlack(xi-1,yi)==0)||(xj==xi-2&&yj==yi+1&&redOrBlack(xi-1,yi)==0)||(xj==xi-1&&yj==yi-2&&redOrBlack(xi,yi-1)==0)||(xj==xi-1&&yj==yi+2&&redOrBlack(xi,yi+1)==0)||(xj==xi+1&&yj==yi-2&&redOrBlack(xi,yi-1)==0)||(xj==xi+1&&yj==yi+2&&redOrBlack(xi,yi+1)==0)||(xj==xi+2&&yj==yi-1&&redOrBlack(xi+1,yi)==0)||(xj==xi+2&&yj==yi+1&&redOrBlack(xi+1,yi)==0))){array[xi][yi]=CROSS;array[xj][yj]=R(马);}else{restart=1;}}//B(马)----------------------------------------elseif(array[xi][yi]==B(马)){if((redOrBlack(xj,yj)!=-1)&&((xj==xi-2&&yj==yi-1&&redOrBlack(xi-1,yi)==0)||(xj==xi-2&&yj==yi+1&&redOrBlack(xi-1,yi)==0)||(xj==xi-1&&yj==yi-2&&redOrBlack(xi,yi-1)==0)||
本文标题:C语言编写中国象棋
链接地址:https://www.777doc.com/doc-4379365 .html