人人對戰
創新互聯建站是一家朝氣蓬勃的網站建設公司。公司專注于為企業提供信息化建設解決方案。從事網站開發,網站制作,網站設計,網站模板,微信公眾號開發,軟件開發,微信小程序開發,10年建站對邊坡防護網等多個方面,擁有多年的網站營銷經驗。chunli@Linux:~$ cat main.c // main.c // 象棋 // 車馬相仕帥仕相馬車 // 十十十十十十十十十 // 十炮十十十十十炮十 // 兵十兵十兵十兵十兵 // 十十十十十十十十十 // --楚河-漢界-- // 十十十十十十十十十 // 卒十卒十卒十卒十卒 // 十炮十十十十十炮十 // 十十十十十十十十十 // 車馬象士將士象馬車 // #include <stdio.h> #include <stdbool.h> #include <math.h> #include <stdlib.h> #define R(piece) "\033[31m"#piece"\033[0m"http://紅色棋子 //#define B(piece) "\033[30m"#piece"\033[0m"http://黑色棋子 #define B(piece) "\033[32m"#piece"\033[0m"http://黑色棋子 #define CROSS "\033[33m十\033[0m" //定義外部變量,棋盤坐標 char* array[11][9]; int xi,yi;//要移動的棋子 int xj,yj;//移動的目標位置 bool isStandard = 1;//是否符合規則,初始值1,符合 bool gameOverSign = 1;//游戲是否結束,0結束 bool restart = 0; //生成棋盤 void chessboardBuilding(); //打印棋盤 void printChessboard(); //判斷是紅棋還是黑棋,紅旗返回1,黑棋返回-1,否則返回0 int redOrBlack(int x,int y); //紅棋移動 void redMove(); //黑棋移動 void blackMove(); //每種棋子的規則 void rulesOfAllKindsOfChessPieces(); //判斷游戲結束 void isGameOver(); //**************************主函數****************************** int main() { //生成棋盤 chessboardBuilding(); //打印棋盤 printChessboard(); //開始下棋 int turn = -1; while (gameOverSign) { isStandard = 1; turn *= (-1);//雙方交替下棋 switch (turn) { case 1: redMove(); turn = (restart) ? (turn*-1) : turn; break; case -1: blackMove(); turn = (restart) ? (turn*-1) : turn; break; } isGameOver(); } printf("游戲結束!\n"); }//主函數結束 //*************************自定義函數***************************** //生成棋盤 void chessboardBuilding() { for (int i = 0; i < 11; i ++) { for (int j = 0; j < 9 ; 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(卒); } //打印棋盤 void printChessboard() { system("clear"); //顯示 printf(" \033[43;30m中國象棋歡迎您\033[0m\n\n"); for (int i = 0; i < 11; i ++) { for (int j = 0; j < 9; j ++) { printf("%s",array[i][j]); } printf("\n"); } } //判斷是紅棋還是黑棋,紅旗返回1,黑棋返回-1,否則返回0 int redOrBlack(int x,int y) { 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(兵)) { return 1; } else if (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; } else return 0; } //紅棋移動 void redMove() { if (restart) { printf("違反游戲規則,請重新輸入\n"); restart = 0; } printf("[紅棋]請輸入你要移動的棋子:\n"); scanf("%d %d",&xi,&yi); printf("[紅棋]請輸入你要放置的位置:\n"); scanf("%d %d",&xj,&yj); rulesOfAllKindsOfChessPieces(); printChessboard(); } //黑棋移動 void blackMove() { if (restart) { printf("違反游戲規則,請重新輸入\n"); restart = 0; } printf("[黑棋]請輸入你要移動的棋子:\n"); scanf("%d %d",&xi,&yi); printf("[黑棋]請輸入你要放置的位置:\n"); scanf("%d %d",&xj,&yj); rulesOfAllKindsOfChessPieces(); printChessboard(); } //判斷游戲結束 void isGameOver() { bool sign_r = 0; bool sign_b = 0; for (int i = 0; i < 11; i ++) { for (int j = 0; j < 9; j ++) { if (array[i][j] == R(帥)) { sign_r = 1; } else if (array[i][j] == B(將)) { sign_b = 1; } } } if ((sign_r == 0)||(sign_b == 0)) { gameOverSign = 0; } } //每種棋子的規則 void rulesOfAllKindsOfChessPieces() { //R(車)---------------------------------------- if (array[xi][yi] == R(車)) { if (yi == yj)//列坐標不變,同列移動 { for (int i = xi+1; i < xj; i ++) { if (i == 5) continue;//如果行等于5,跳過 if (array[i][yi] != CROSS) isStandard = 0;//如果初始位置和目標位置之間有棋子,則不符合規則 } for (int i = xi-1; i > xj; i --) { if (i == 5) continue;//如果行等于5,跳過 if (array[xi][yi] != CROSS) isStandard = 0; } } else if (xi == xj)//行坐標不變,同行移動 { for (int i = yi+1; i < yj; i ++) if (array[xi][i] != CROSS) isStandard = 0; for (int i = yi-1; i > yj; 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(車)---------------------------------------- else if (array[xi][yi] == B(車)) { if (yi == yj)//列坐標不變,同列移動 { for (int i = xi+1; i < xj; i ++) { if (i == 5) continue;//如果行等于5,跳過 if (array[i][yi] != CROSS) isStandard = 0;//如果初始位置和目標位置之間有棋子,則不符合規則 } for (int i = xi-1; i > xj; i --) { if (i == 5) continue;//如果行等于5,跳過 if (array[i][yi] != CROSS) isStandard = 0; } } else if (xi == xj)//行坐標不變,同行移動 { for (int i = yi+1; i < yj; i ++) if (array[xi][i] != CROSS) isStandard = 0; for (int i = yi-1; i > yj; 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(馬)---------------------------------------- else if (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(馬)---------------------------------------- else if (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) || (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] = B(馬); } else { restart = 1; } } //R(炮)---------------------------------------- else if (array[xi][yi] == R(炮)) { int count = 0;//起始位置間棋子的個數 if (yi == yj)//列坐標不變,同列移動 { for (int i = xi+1; i < xj; i ++) { if (i == 5) continue;//如果行等于5,跳過 if (redOrBlack(i, yi) != 0) count++; } for (int i = xi-1; i > xj; i --) { if (i == 5) continue;//如果行等于5,跳過 if (redOrBlack(i, yi) != 0) count++; } } else if (xi == xj)//行坐標不變,同行移動 { for (int i = yi+1; i < yj; i ++) if (redOrBlack(xi, i) != 0) count++; for (int i = yi-1; i > yj; i --) if (redOrBlack(xi, i) != 0) count++; } if ((xi == xj || yi == yj)&& (count <= 1) && redOrBlack(xj, yj) != 1)//如果棋子直行、沒有犯規且落點不是紅棋,可以移動 { array[xi][yi] = CROSS; array[xj][yj] = R(炮); } else { restart = 1; } } //B(炮)---------------------------------------- else if (array[xi][yi] == B(炮)) { int count = 0;//起始位置間棋子的個數 if (yi == yj)//列坐標不變,同列移動 { for (int i = xi+1; i < xj; i ++) { if (i == 5) continue;//如果行等于5,跳過 if (redOrBlack(i, yi) != 0) count++; } for (int i = xi-1; i > xj; i --) { if (i == 5) continue;//如果行等于5,跳過 if (redOrBlack(i, yi) != 0) count++; } } else if (xi == xj)//行坐標不變,同行移動 { for (int i = yi+1; i < yj; i ++) if (redOrBlack(xi, i) != 0) count++; for (int i = yi-1; i > yj; i --) if (redOrBlack(xi, i) != 0) count++; } if ((xi == xj || yi == yj)&& (count <= 1) && redOrBlack(xj, yj) != -1)//如果棋子直行、沒有犯規且落點不是紅棋,可以移動 { array[xi][yi] = CROSS; array[xj][yj] = B(炮); } else { restart = 1; } } //R(兵)---------------------------------------- else if (array[xi][yi] == R(兵)) { if (xi > xj) isStandard = 0;//如果倒退,則不符合規范 if (xi == 3) if ((xj != xi+1) || (yi != yj)) isStandard = 0;//第3行時只能前進一步 if (xi == 4) if ((xj != xi+2) || (yi != yj)) isStandard = 0;//第4行時只能前進兩步 if (xi > 4) { if ((xj == xi+1 && yi ==yj)|| (xj == xi && yi ==yj+1)||(xj == xi && yi ==yj-1)) { } else isStandard = 0; } if ((xi == xj || yi == yj)&& isStandard && redOrBlack(xj, yj) != 1)// { array[xi][yi] = CROSS; array[xj][yj] = R (兵); } else { restart = 1; } } //B(卒)---------------------------------------- else if (array[xi][yi] == B(卒)) { if (xi < xj) isStandard = 0;//如果倒退,則不符合規范 if (xi == 7) if ((xj != xi-1) || (yi != yj)) isStandard = 0;//第3行時只能前進一步 if (xi == 6) if ((xj != xi-2) || (yi != yj)) isStandard = 0;//第4行時只能前進兩步 if (xi < 4) { if ((xj == xi-1 && yi ==yj)|| (xj == xi && yi ==yj+1)||(xj == xi && yi ==yj-1)) { } else isStandard = 0; } if (isStandard && redOrBlack(xj, yj) != -1)// { array[xi][yi] = CROSS; array[xj][yj] = R (卒); } else { restart = 1; } } //R(相)---------------------------------------- else if (array[xi][yi] == R(相)) { if ((xj <= 4)&&(redOrBlack(xj, yj) != 1) && ((xj == xi-2 && yj == yi-2 &&redOrBlack(xi-1, yi-1) == 0) || (xj == xi-2 && yj == yi+2 &&redOrBlack(xi-1, yi+1) == 0) || (xj == xi+2 && yj == yi-2 &&redOrBlack(xi+1, yi-1) == 0) || (xj == xi+2 && yj == yi+2 &&redOrBlack(xi+1, yi+1) == 0))) { array[xi][yi] = CROSS; array[xj][yj] = R(相); } else { restart = 1; } } //B(象)---------------------------------------- else if (array[xi][yi] == B(象)) { if ((xj >= 6)&&(redOrBlack(xj, yj) != -1) && ((xj == xi-2 && yj == yi-2 &&redOrBlack(xi-1, yi-1) == 0) || (xj == xi-2 && yj == yi+2 &&redOrBlack(xi-1, yi+1) == 0) || (xj == xi+2 && yj == yi-2 &&redOrBlack(xi+1, yi-1) == 0) || (xj == xi+2 && yj == yi+2 &&redOrBlack(xi+1, yi+1) == 0))) { array[xi][yi] = CROSS; array[xj][yj] = B(象); } else { restart = 1; } } //R(仕)---------------------------------------- else if (array[xi][yi] == R(仕)) { if ((xj <= 2)&&(redOrBlack(xj, yj) != 1) && ((xj == xi-1 && yj == yi-1 ) || (xj == xi-1 && yj == yi+1 ) || (xj == xi+1 && yj == yi-1 ) || (xj == xi+1 && yj == yi+1 ))) { array[xi][yi] = CROSS; array[xj][yj] = R(仕); } else { restart = 1; } } //B(士)---------------------------------------- else if (array[xi][yi] == B(士)) { if ((xj >= 8)&&(redOrBlack(xj, yj) != 1) && ((xj == xi-1 && yj == yi-1 ) || (xj == xi-1 && yj == yi+1 ) || (xj == xi+1 && yj == yi-1 ) || (xj == xi+1 && yj == yi+1 ))) { array[xi][yi] = CROSS; array[xj][yj] = B(士); } else { restart = 1; } } //R(帥)---------------------------------------- else if (array[xi][yi] == R(帥)) { if ((xj <= 2 && yj <= 5 && yj >=3)&&(redOrBlack(xj, yj) != 1) && (((xj == xi)&&(yj == yi + 1 || yj == yi - 1))||((yj == yi)&&(xj == xi + 1 || xj == xi - 1)))) { array[xi][yi] = CROSS; array[xj][yj] = R(帥); } else { restart = 1; } } //B(將)---------------------------------------- else if (array[xi][yi] == B(將)) { if ((xj >= 8 && yj <= 5 && yj >=3)&&(redOrBlack(xj, yj) != -1) && (((xj == xi)&&(yj == yi + 1 || yj == yi - 1))||((yj == yi)&&(xj == xi + 1 || xj == xi - 1)))) { array[xi][yi] = CROSS; array[xj][yj] = B(將); } else { restart = 1; } } else { restart = 1; } } chunli@Linux:~$
編譯運行:
chunli@Linux:~$ gcc -std=c99 main.c && ./a.out 中國象棋歡迎您 車馬相仕帥仕相馬車 十十十十十十十十十 十炮十十十十十炮十 兵十兵十兵十兵十兵 十十十十十十十十十 --楚河-漢界-- 十十十十十十十十十 卒十卒十卒十卒十卒 十炮十十十十十炮十 十十十十十十十十十 車馬相仕將仕相馬車 [紅棋]請輸入你要移動的棋子: 0 0 [紅棋]請輸入你要放置的位置: 1 0 中國象棋歡迎您 十馬相仕帥仕相馬車 車十十十十十十十十 十炮十十十十十炮十 兵十兵十兵十兵十兵 十十十十十十十十十 --楚河-漢界-- 十十十十十十十十十 卒十卒十卒十卒十卒 十炮十十十十十炮十 十十十十十十十十十 車馬相仕將仕相馬車 [黑棋]請輸入你要移動的棋子: ^C chunli@Linux:~$
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
名稱欄目:【C語言小游戲】中國象棋-創新互聯
文章鏈接:http://vcdvsql.cn/article32/ejhsc.html
成都網站建設公司_創新互聯,為您提供用戶體驗、手機網站建設、品牌網站設計、網站設計公司、響應式網站、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯