C語言實現(xiàn)中國象棋
更新時間:2022年05月10日 14:37:17 作者:冰凌呀
這篇文章主要為大家詳細介紹了C語言實現(xiàn)中國象棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C語言實現(xiàn)中國象棋的具體代碼,供大家參考,具體內(nèi)容如下
運行截圖
實現(xiàn)思路
老套路,二維數(shù)組存儲棋盤,宏定義各種棋子,每次棋子的移動實質(zhì)為二維數(shù)組的賦值。
重點是判斷棋子是否可移動到目標位置,移動有兩種可能,一是單純移動,二是吃子移動。主要飛將的特殊規(guī)則。廢話不多說,貼源碼(主要下面是兩個源文件哦)
源碼
main.c
#include<stdio.h> #include<string.h> #include<windows.h> //自定義源文件(棋譜結(jié)構(gòu))? #include"manual.c" //棋盤行列? #define ROWS 10 #define COLS 9 //空地? #define white 0 //紅方棋子? #define isred (map[i][j]>0&&map[i][j]<10) #define ju 1 #define ma 2 #define xiang 3 #define shi 4 #define shuai 5 #define pao 6 #define bing 7 //黑方棋子 #define isblack (map[i][j]>10) #define Ju 11 #define Ma 12 #define Xiang 13 #define Shi 14 #define Jiang 15 #define Pao 16 #define Zu 17? //控制輸出顏色? #define NONECOLOR SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7) #define REDCOLOR SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED) #define GREENCOLOR SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN) //當(dāng)前玩家 #define red 1 #define black 0? //地圖? int map[ROWS][COLS]={white}; //棋步? char step[20]; //初始化地圖? void InitializeMap() { ?? ?int i,j; ?? ?for(i=0;i<ROWS;i++) ?? ?{ ?? ??? ?for(j=0;j<COLS;j++) ?? ??? ?{ ?? ??? ??? ?map[i][j]=white; ?? ??? ?} ?? ?} ?? ? /* ? ? ? 0 1 2 3 4 5 6 7 8 ?? ?0車馬象士將士象馬車 ?? ?1 ?? ?2 ?砲 ? ? ? ? ?砲 ?? ?3卒 ?卒 ?卒 ?卒 ?卒 ?? ?4 ?? ?5 ?? ?6兵 ?兵 ?兵 ?兵 ?兵 ?? ?7 ?炮 ? ? ? ? ?炮 ?? ?8 ? ?? ?9車馬相仕帥仕相馬車? */ ?? ?//黑方子力配置? ?? ?map[0][0]=Ju; ?? ?map[0][1]=Ma; ?? ?map[0][2]=Xiang; ?? ?map[0][3]=Shi; ?? ?map[0][4]=Jiang; ?? ?map[0][5]=Shi; ?? ?map[0][6]=Xiang; ?? ?map[0][7]=Ma; ?? ?map[0][8]=Ju; ?? ?map[2][1]=Pao; ?? ?map[2][7]=Pao; ?? ?map[3][0]=Zu; ?? ?map[3][2]=Zu; ?? ?map[3][4]=Zu; ?? ?map[3][6]=Zu; ?? ?map[3][8]=Zu; ?? ?//紅方子力配置 ?? ?map[6][0]=bing; ?? ?map[6][2]=bing; ?? ?map[6][4]=bing; ?? ?map[6][6]=bing; ?? ?map[6][8]=bing;? ?? ?map[7][1]=pao; ?? ?map[7][7]=pao; ?? ?map[9][0]=ju; ?? ?map[9][1]=ma; ?? ?map[9][2]=xiang; ?? ?map[9][3]=shi; ?? ?map[9][4]=shuai; ?? ?map[9][5]=shi; ?? ?map[9][6]=xiang; ?? ?map[9][7]=ma; ?? ?map[9][8]=ju; } //打印地圖 void displayMap() { ?? ?int i,j,k; ?? ?printf(" "); ?? ?for(k=0;k<COLS;k++) ?? ?{ ?? ??? ?printf(" %d",k); ?? ?} ?? ?printf("\n"); ?? ?for(i=0;i<ROWS;i++) ?? ?{ ?? ??? ?printf("%d ",i); ?? ??? ?for(j=0;j<COLS;j++) ?? ??? ?{ ?? ??? ??? ?if(map[i][j]==white) ?? ??? ??? ?{ ?? ??? ??? ??? ?NONECOLOR; ?? ??? ??? ??? ?printf(" ?"); ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?if(isred) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?REDCOLOR; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if(isblack) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?GREENCOLOR; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?switch(map[i][j]) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?case ju: ?? ??? ??? ??? ??? ??? ?printf("車"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case Ju: ?? ??? ??? ??? ??? ??? ?printf("車"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case ma: ?? ??? ??? ??? ??? ??? ?printf("馬"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case Ma: ?? ??? ??? ??? ??? ??? ?printf("馬"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case xiang: ?? ??? ??? ??? ??? ??? ?printf("相"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case Xiang: ?? ??? ??? ??? ??? ??? ?printf("象"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case shi: ?? ??? ??? ??? ??? ??? ?printf("仕"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case Shi: ?? ??? ??? ??? ??? ??? ?printf("士"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case shuai: ?? ??? ??? ??? ??? ??? ?printf("帥"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case Jiang: ?? ??? ??? ??? ??? ??? ?printf("將"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case pao: ?? ??? ??? ??? ??? ??? ?printf("炮"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case Pao: ?? ??? ??? ??? ??? ??? ?printf("砲"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case bing: ?? ??? ??? ??? ??? ??? ?printf("兵"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?case Zu: ?? ??? ??? ??? ??? ??? ?printf("卒"); ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?}?? ? ?? ??? ??? ?} ?? ??? ?}?? ? ?? ??? ?NONECOLOR; ?? ??? ?printf("\n"); ?? ?}?? ? ?? ?/* ?? ?char border[][3]={"九","八","七","六","五","四","三","二","一"}; ?? ?printf(" ?"); ?? ?for(k=0;k<9;k++) ?? ?{ ?? ??? ?printf("%s",border[k]); ?? ?} ?? ?*/ ?? ?printf("\n\n");? }? //將(x1,y1)的棋子移動到(x2,y2)? void movePiece(int x1,int y1,int x2,int y2) { ?? ?map[x2][y2]=map[x1][y1]; ?? ?map[x1][y1]=white; } //獲取玩家需要移動的棋子位置和移動到的目標位置 int getInput(int *x1,int *y1,int *x2,int *y2) { ?? ?printf("\n輸入棋子坐標和目的坐標(全為-1時表示查看當(dāng)前棋譜):\n"); ?? ?scanf("%d %d %d %d",x1,y1,x2,y2); ?? ?if((*x1)<0||(*x1)>ROWS||(*y1)<0||(*y1)>COLS||(*x2)<0||(*x2)>ROWS||(*y2<0)||(*y2)>COLS) ?? ?{ ?? ??? ?return 0; ?? ?} ?? ?else if((*x1)==(*x2)&&(*y1)==(*y2)) ?? ?{ ?? ??? ?return 0; ?? ?} ?? ?return 1; }? //判斷是否已經(jīng)結(jié)束游戲(-1:黑勝 0:還沒結(jié)束 1:紅勝)? int isOver() { ?? ?int i,j; ?? ?//沒有將時紅勝,沒有帥時黑勝 ?? ?int haveShuai=0,haveJiang=0; ?? ?for(i=0;i<ROWS;i++) ?? ?{ ?? ??? ?for(j=0;j<COLS;j++) ?? ??? ?{ ?? ??? ??? ?if(map[i][j]==shuai) ?? ??? ??? ?{ ?? ??? ??? ??? ?haveShuai=1;?? ??? ? ?? ??? ??? ?}?? ? ?? ??? ??? ?else if(map[i][j]==Jiang) ?? ??? ??? ?{ ?? ??? ??? ??? ?haveJiang=1; ?? ??? ??? ?} ?? ??? ?}?? ? ?? ?}?? ? ?? ?if(haveShuai==0) ?? ?{ ?? ??? ?return -1; ?? ?} ?? ?else if(haveJiang==0) ?? ?{ ?? ??? ?return 1; ?? ?} ?? ?else ?? ?{ ?? ??? ?return 0; ?? ?} }? //輸出贏家? void displayWinner(int winner) { ?? ?if(winner==1) ?? ?{ ?? ??? ?printf("紅勝!\n"); ?? ?} ?? ?else if(winner==-1) ?? ?{ ?? ??? ?printf("黑勝!\n"); ?? ?} } //打印當(dāng)前回合的玩家 void displayPlayer(int player) { ?? ?printf("======="); ?? ?if(player==red) ?? ?{ ?? ??? ?printf("紅方回合");? ?? ?} ?? ?else if(player==black) ?? ?{ ?? ??? ?printf("黑方回合"); ?? ? ?? ?} ?? ?printf("=======");?? ? }? //交替到對方回合? void exchangePlayer(int *player) { ?? ?if((*player)==red) ?? ?{ ?? ??? ?*player=black; ?? ?} ?? ?else if((*player)==black) ?? ?{ ?? ??? ?*player=red; ?? ?} } //坐標(x1,y1)上的棋子是否能移動到(x2,y2)上? int canMove(int x1,int y1,int x2,int y2,int player) { ?? ?//當(dāng)(x2,y2)為己方棋子時,不可以 ?? ?if(map[x2][y2]>0&&map[x2][y2]<10&&player==red||map[x2][y2]>10&&player==black) ?? ?{ ?? ??? ?return 0;?? ? ?? ?}? ?? ?int piece=map[x1][y1]; ?? ?int i,j; ?? ?int start,end; ?? ?int eye_x=-1,eye_y=-1; ?? ?int count=0; ?? ?switch(piece) ?? ?{ ?? ??? ?//車、車? ?? ??? ?case ju: ?? ??? ?case Ju: ?? ??? ??? ?if(x1==x2) ?? ??? ??? ?{ ?? ??? ??? ??? ?start=y1; ?? ??? ??? ??? ?end=y2; ?? ??? ??? ??? ?i=x1; ?? ??? ??? ??? ?if(y1>y2) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?start=y2; ?? ??? ??? ??? ??? ?end=y1; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?for(j=start+1;j<end;j++) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(map[i][j]!=white) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?return 0; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?else if(y1==y2) ?? ??? ??? ?{ ?? ??? ??? ??? ?start=x1; ?? ??? ??? ??? ?end=x2; ?? ??? ??? ??? ?j=y1; ?? ??? ??? ??? ?if(x1>x2) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?start=x2; ?? ??? ??? ??? ??? ?end=x1; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?for(i=start+1;i<end;i++) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(map[i][j]!=white) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?return 0; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case ma: ?? ??? ?case Ma: ?? ??? ??? ?if(abs(x1-x2)==1&&y1-y2==2) ?? ??? ??? ?{ ?? ??? ??? ??? ?eye_x=x1; ?? ??? ??? ??? ?eye_y=y1-1; ?? ??? ??? ?} ?? ??? ??? ?else if(abs(x1-x2)==1&&y1-y2==-2) ?? ??? ??? ?{ ?? ??? ??? ??? ?eye_x=x1; ?? ??? ??? ??? ?eye_y=y1+1; ?? ??? ??? ?} ?? ??? ??? ?else if(abs(y1-y2)==1&&x1-x2==2) ?? ??? ??? ?{ ?? ??? ??? ??? ?eye_x=x1-1; ?? ??? ??? ??? ?eye_y=y1; ?? ??? ??? ?} ?? ??? ??? ?else if(abs(y1-y2)==1&&x1-x2==-2) ?? ??? ??? ?{ ?? ??? ??? ??? ?eye_x=x1+1; ?? ??? ??? ??? ?eye_y=y1; ?? ??? ??? ?} ?? ??? ??? ?if(eye_x==-1&&eye_y==-1) ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?else if(map[eye_x][eye_y]!=white) ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case xiang: ?? ??? ?case Xiang: ?? ??? ??? ?//相(象)過河? ?? ??? ??? ?if((player==red&&x2<5)||(player==black&&x2>4))? ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?else if(abs(x1-x2)==2&&abs(y1-y2)==2) ?? ??? ??? ?{ ?? ??? ??? ??? ?eye_x=(x1+x2)/2; ?? ??? ??? ??? ?eye_y=(y1+y2)/2; ?? ??? ??? ??? ?if(map[eye_x][eye_y]!=white) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?return 0; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case shi: ?? ??? ?case Shi: ?? ??? ??? ?//出九宮 ?? ??? ??? ?if(player==red&&(x2<7||y2<3||y2>5)||player==black&&(x2>2||y2<3||y2>5)) ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0;?? ? ?? ??? ??? ?}? ?? ??? ??? ?//不是走的斜一格? ?? ??? ??? ?else if(abs(x1-x2)!=1||abs(y1-y2)!=1) ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case shuai: ?? ??? ?case Jiang: ?? ??? ??? ?//飛將 ?? ??? ??? ?if((player==red&&x2<3||player==black&&x2>6)&&y1==y2) ?? ??? ??? ?{ ?? ??? ??? ??? ?start=x1; ?? ??? ??? ??? ?end=x2; ?? ??? ??? ??? ?j=y1; ?? ??? ??? ??? ?if(x1>x2) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?start=x2; ?? ??? ??? ??? ??? ?end=x1;?? ? ?? ??? ??? ??? ?}?? ? ?? ??? ??? ??? ?for(i=start+1;i<end;i++) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(map[i][j]!=white) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?return 0; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?}? ?? ??? ??? ?else if(y2<3||y2>5||player==red&&x2<7||player==black&&x2>2||abs(x1-x2)+abs(y1-y2)!=1) ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case pao: ?? ??? ?case Pao: ?? ??? ??? ?if(x1==x2) ?? ??? ??? ?{ ?? ??? ??? ??? ?start=y1; ?? ??? ??? ??? ?end=y2; ?? ??? ??? ??? ?i=x1; ?? ??? ??? ??? ?if(y1>y2) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?start=y2; ?? ??? ??? ??? ??? ?end=y1; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?for(j=start+1;j<end;j++) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(map[i][j]!=white) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?count++; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if(count>1) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?return 0; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if(count==1) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(map[x2][y2]>10&&player==red||map[x2][y2]>0&&map[x2][y2]<10&&player==black) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?return 1; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?else ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?return 0; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?else if(y1==y2) ?? ??? ??? ?{ ?? ??? ??? ??? ?start=x1; ?? ??? ??? ??? ?end=x2; ?? ??? ??? ??? ?j=y1; ?? ??? ??? ??? ?if(x1>x2) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?start=x2; ?? ??? ??? ??? ??? ?end=x1; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?for(i=start+1;i<end;i++) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(map[i][j]!=white) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?count++; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if(count>1) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?return 0; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else if(count==1) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(map[x2][y2]>10&&player==red||map[x2][y2]>0&&map[x2][y2]<10&&player==black) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?return 1; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?else ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?return 0; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ??? ?case bing: ?? ??? ?case Zu: ?? ??? ??? ?//不是橫或縱走一格? ?? ??? ??? ?if((abs(x1-x2)+abs(y1-y2))!=1) ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?//沒過河時便左右移動? ?? ??? ??? ?if(player==red&&x1>=5&&(abs(y1-y2)==1)||player==black&&(x1<=4)&&(abs(y1-y2)==1)) ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?//往后退? ?? ??? ??? ?else if(player==red&&(x1-x2==-1)||player==black&&(x2-x1==-1)) ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ??? ?break; ?? ?} ?? ?return 1; }? //獲得棋子名字? char *getPieceName(int piece) { ?? ?switch(piece) ?? ?{ ?? ??? ?case Ju: ?? ??? ??? ?return "車"; ?? ??? ?case ju: ?? ??? ??? ?return "車"; ?? ??? ?case Ma: ?? ??? ??? ?return "馬"; ?? ??? ?case ma: ?? ??? ??? ?return "馬"; ?? ??? ?case Xiang: ?? ??? ??? ?return "象"; ?? ??? ?case xiang: ?? ??? ??? ?return "相"; ?? ??? ?case Shi: ?? ??? ??? ?return "士"; ?? ??? ?case shi: ?? ??? ??? ?return "仕"; ?? ??? ?case Jiang: ?? ??? ??? ?return "將"; ?? ??? ?case shuai: ?? ??? ??? ?return "帥"; ?? ??? ?case Pao: ?? ??? ??? ?return "砲"; ?? ??? ?case pao: ?? ??? ??? ?return "炮"; ?? ??? ?case Zu: ?? ??? ??? ?return "卒"; ?? ??? ?case bing: ?? ??? ??? ?return "兵"; ?? ?} ?? ?return ""; } //獲得棋步? void getStep(int x1,int y1,int x2,int y2,int player) { ?? ?//清空之前棋步? ?? ?step[0]='\0'; ?? ?char border_red[][3]={"九","八","七","六","五","四","三","二","一"}; ?? ?char border_black[][3]={"1","2","3","4","5","6","7","8","9"}; ?? ?int i,j; ?? ?int piece=map[x1][y1]; ?? ?int last=0,next=0; ?? ?j=y1; ?? ?for(i=0;i<x1;i++) ?? ?{ ?? ??? ?if(map[i][j]==piece) ?? ??? ?{ ?? ??? ??? ?last=1; ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?for(i=x1+1;i<ROWS;i++) ?? ?{ ?? ??? ?if(map[i][j]==piece) ?? ??? ?{ ?? ??? ??? ?next=1; ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?if(last==1&&next==1) ?? ?{ ?? ??? ?strcat(step,"中"); ?? ?}?? ? ?? ?else if(last==1) ?? ?{ ?? ??? ?if(player==red) ?? ??? ?{ ?? ??? ??? ?strcat(step,"后"); ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?strcat(step,"前"); ?? ??? ?} ?? ?} ?? ?else if(next==1) ?? ?{ ?? ??? ?if(player==red) ?? ??? ?{ ?? ??? ??? ?strcat(step,"前"); ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?strcat(step,"后"); ?? ??? ?} ?? ?} ?? ?strcat(step,getPieceName(map[x1][y1])); ?? ?if(last==0&&next==0) ?? ?{ ?? ??? ?if(player==red) ?? ??? ?{ ?? ??? ??? ?strcat(step,border_red[y1]); ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?strcat(step,border_black[y1]);?? ? ?? ??? ?} ?? ?} ?? ?if(x1==x2) ?? ?{ ?? ??? ?strcat(step,"平"); ?? ??? ?if(player==red) ?? ??? ?{ ?? ??? ??? ?strcat(step,border_red[y2]); ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?strcat(step,border_black[y2]);?? ? ?? ??? ?} ?? ??? ?return; ?? ?} ?? ?int distance=x2-x1; ?? ?switch(map[x1][y1]) ?? ?{ ?? ??? ?case Ju: ?? ??? ?case Jiang: ?? ??? ?case Pao: ?? ??? ?case Zu: ?? ??? ??? ?if(distance>0) ?? ??? ??? ?{ ?? ??? ??? ??? ?strcat(step,"進"); ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?strcat(step,"退"); ?? ??? ??? ?} ?? ??? ??? ?strcat(step,border_black[abs(distance)-1]); ?? ??? ??? ?break; ?? ??? ?case Ma: ?? ??? ?case Xiang: ?? ??? ?case Shi: ?? ??? ??? ?if(distance>0) ?? ??? ??? ?{ ?? ??? ??? ??? ?strcat(step,"進"); ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?strcat(step,"退"); ?? ??? ??? ?} ?? ??? ??? ?strcat(step,border_black[y2]); ?? ??? ??? ?break; ?? ??? ?case ju: ?? ??? ?case shuai: ?? ??? ?case pao: ?? ??? ?case bing: ?? ??? ??? ?if(distance>0) ?? ??? ??? ?{ ?? ??? ??? ??? ?strcat(step,"退"); ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?strcat(step,"進"); ?? ??? ??? ?} ?? ??? ??? ?strcat(step,border_red[9-abs(distance)]); ?? ??? ??? ?break; ?? ??? ?case ma: ?? ??? ?case xiang: ?? ??? ?case shi: ?? ??? ??? ?if(distance>0) ?? ??? ??? ?{ ?? ??? ??? ??? ?strcat(step,"退"); ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?strcat(step,"進"); ?? ??? ??? ?} ?? ??? ??? ?strcat(step,border_red[y2]); ?? ??? ??? ?break; ?? ?} } int main() { ?? ?InitializeMap(); ?? ?//棋譜? ?? ?manual m; ?? ?//初始化棋譜? ?? ?initializeManual(&m); ?? ?//游戲是否已經(jīng)結(jié)束? ?? ?int isEnd=0; ?? ?//坐標 ?? ?int x1,y1,x2,y2;? ?? ?//輸入是否合法 ?? ?int inputRight;? ?? ?//移動是否成功 ?? ?int moveSuccess;? ?? ?//當(dāng)前玩家 ?? ?int player=red;? ?? ?while(!isEnd) ?? ?{ ?? ??? ?system("cls");?? ??? ??? ??? ??? ??? ??? ?//清屏 ?? ??? ?displayMap();?? ??? ??? ??? ??? ??? ??? ?//打印現(xiàn)在棋局 ?? ??? ?displayPlayer(player);?? ??? ??? ??? ??? ?//當(dāng)前玩家回合? ?? ??? ?inputRight=getInput(&x1,&y1,&x2,&y2);?? ?//接收玩家輸入 ?? ??? ?if(x1==-1&&x2==-1&&y1==-1&&y2==-1)?? ??? ?//請求打印棋譜? ?? ??? ?{ ?? ??? ??? ?displayManual(m);?? ??? ??? ??? ??? ?//打印棋譜? ?? ??? ?} ?? ??? ?if(inputRight)?? ??? ??? ??? ??? ??? ??? ?//輸入成功? ?? ??? ?{ ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//是否選擇己方棋子? ?? ??? ??? ?if(map[x1][y1]>0&&map[x1][y1]<10&&player==red||map[x1][y1]>10&&player==black) ?? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//是否可以移動? ?? ??? ??? ??? ?moveSuccess=canMove(x1,y1,x2,y2,player); ?? ??? ??? ??? ?if(moveSuccess)?? ??? ??? ??? ??? ?//可以移動? ?? ??? ??? ??? ?{?? ??? ??? ??? ??? ??? ??? ??? ?//按照輸入移動棋子? ?? ??? ??? ??? ??? ?getStep(x1,y1,x2,y2,player); ?? ??? ??? ??? ??? ?insertStep(step,&m);?? ??? ?//添加棋步到棋譜中? ?? ??? ??? ??? ??? ?printf("當(dāng)前棋步為-->>%s\n",step);//打印當(dāng)前棋步? ?? ??? ??? ??? ??? ?system("pause"); ?? ??? ??? ??? ??? ?movePiece(x1,y1,x2,y2);?? ? ?? ??? ??? ??? ??? ?exchangePlayer(&player);?? ?//移動成功,輪到對方回合?? ??? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?isEnd=isOver();?? ??? ??? ??? ?//判斷棋局是否已經(jīng)結(jié)束?? ??? ? ?? ??? ??? ??? ?} ?? ??? ??? ?}?? ? ?? ??? ?}? ?? ?} ?? ?system("cls"); ?? ?displayMap();?? ??? ??? ??? ??? ??? ??? ??? ?//打印現(xiàn)在棋局 ?? ?displayWinner(isEnd); ?? ?saveManual(m,"manual.txt"); ?? ?return 0; }
manual.c
#ifndef manual_c #define manual_c #define MAXCOUNT 200 //棋譜結(jié)構(gòu)? typedef struct manual { ?? ?int count; ?? ?char step[MAXCOUNT][20];?? ? }manual; //初始化棋譜? void initializeManual(manual *m) { ?? ?m->count=0; } //打印棋譜? void displayManual(manual m) { ?? ?printf("\n"); ?? ?if(m.count==0) ?? ?{ ?? ??? ?printf("當(dāng)前棋譜為空!\n");?? ? ?? ?}? ?? ?int i; ?? ?for(i=0;i<m.count;i++) ?? ?{ ?? ??? ?if(i%2==0) ?? ??? ?{ ?? ??? ??? ?printf("%d-->>",i/2+1); ?? ??? ?} ?? ??? ?printf("%s ?",m.step[i]); ?? ??? ?if(i%2==1) ?? ??? ?{ ?? ??? ??? ?printf("\n"); ?? ??? ?} ?? ?} ?? ?printf("\n"); ?? ?system("pause");? } //添加棋步 void insertStep(char step[],manual *m) { ?? ?if(m->count>=MAXCOUNT) ?? ?{ ?? ??? ?return; ?? ?} ?? ?int i=m->count; ?? ?strcpy(m->step[i],step); ?? ?i++; ?? ?m->count=i;?? ? }? //刪除棋步 void deleteStep(manual *m) { ?? ?int i=m->count; ?? ?i--; ?? ?m->count=i;?? ? }? //保存棋譜? void saveManual(manual m,char filepath[]) { ?? ?int i; ?? ?FILE *fp=fopen(filepath,"w"); ?? ?for(i=0;i<m.count;i++) ?? ?{ ?? ??? ?fprintf(fp,"%s\n",m.step[i]); ?? ?} ?? ?fclose(fp); ?? ?printf("\n棋譜保存成功!\n"); } //讀取棋譜 void readManual(manual *m,char filepath[]) { ?? ?int i=0; ?? ?FILE *fp=fopen(filepath,"r"); ?? ?if(fp==NULL) ?? ?{ ?? ??? ?printf("棋譜文件丟失!\n"); ?? ??? ?return; ?? ?} ?? ?while(1) ?? ?{ ?? ??? ?if(fscanf(fp,"%s",m->step[i])==EOF) ?? ??? ?{ ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?i++; ?? ?} ?? ?m->count=i; ?? ?fclose(fp);?? ? }? #endif
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言中的時間函數(shù)clock()和time()你都了解嗎
這篇文章主要為大家詳細介紹了C語言中的時間函數(shù)clock()和time(),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02