設計思路
先用二維數組定義一個棋盤,0代表沒有玩家下過,1代表玩家一的棋子,2代表玩家二的棋子,將棋盤輸出,然后讓玩家依次輸入所要下的位置的行數和列數,並賦值給數組,之后進行判斷:判斷棋盤上所有棋子是否有連續5個,如果是,則返回獲勝玩家,如果否,則繼續輸入下一步要下的棋子坐標
代碼實現
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define HEIGHT 15 //定義棋盤行數 5 #define WIDTH 15 //定義棋盤列數 6 #define PLAYER1 'X' //定義玩家一棋子 7 #define PLAYER2 'O' //定義玩家二棋子 8 9 int map[HEIGHT][WIDTH]; //定義游戲棋盤 10 11 //輸出棋盤 12 void sc() 13 { 14 printf(" "); 15 for (int i = 0;i < WIDTH;i++) 16 if (i < 9) 17 printf("0%d ", i+1); 18 else 19 printf("%d ",i+1); 20 printf("\n "); 21 for (int i = 0;i <=WIDTH;i++) 22 printf("- "); 23 printf("\n"); 24 for (int i = 0;i < HEIGHT;i++) 25 { 26 if (i < 9) 27 printf("0%d ", i + 1); 28 else 29 printf("%d ", i + 1); 30 printf("|"); 31 for (int j = 0;j < WIDTH;j++) 32 if (map[i][j] == 0) 33 printf("+ "); 34 else if (map[i][j] == 1) 35 printf("%c ", PLAYER1); 36 else 37 printf("%c ",PLAYER2); 38 printf("|\n"); 39 } 40 printf(" "); 41 for (int i = 0;i <= WIDTH;i++) 42 printf("- "); 43 printf("\n"); 44 } 45 //落子 46 void play(int player) 47 { 48 int targetH = 0, targetW = 0; //targetH:選定的格子行數 targetW:選定的格子列數 49 50 if(player==1) 51 printf("現在輪到玩家一,棋子:%c\n請輸入格子的行數:", PLAYER1); 52 else 53 printf("現在輪到玩家二,棋子:%c\n請輸入格子的行數:", PLAYER2); 54 scanf_s("%d", &targetH); 55 while (targetH <= 0 || targetH > HEIGHT) 56 { 57 printf("請輸入正確的行數:"); 58 scanf_s("%d", &targetH); 59 } 60 printf("請輸入格子的列數:"); 61 scanf_s("%d", &targetW); 62 while (targetW <= 0 || targetW > WIDTH) 63 { 64 printf("請輸入正確的行數:"); 65 scanf_s("%d",&targetW); 66 } 67 if(map[targetH - 1][targetW - 1] ==0) 68 map[targetH-1][targetW-1]=player; 69 else 70 { 71 printf("輸入的坐標重復,請重新輸入\n"); 72 play(player); 73 } 74 } 75 76 //判斷游戲是否結束,並返回勝利玩家 77 int pd(int player) 78 { 79 int k = 0; //判斷當前有多少連續的棋子 80 81 for (int i = 0;i < HEIGHT;i++) 82 for (int j = 0;j <= WIDTH;j++) 83 { 84 if (map[i][j] == player) 85 { 86 for (k = 1;k < 5;k++) //判斷是否一行連續5個棋子 87 { 88 if (map[i][j + k] != player) 89 break; 90 } 91 if (k == 5) 92 return player; 93 for (k = 1;k < 5;k++) //判斷是否一列連續5個棋子 94 { 95 if (map[i + k][j] != player) 96 break; 97 } 98 if (k == 5) 99 return player; 100 for (k = 1;k < 5;k++) //判斷是否一斜線連續5個棋子 101 { 102 if (map[i + k][j + k] != player) 103 break; 104 } 105 if (k == 5) 106 return player; 107 } 108 } 109 return 0; //如果都沒有連續5個棋子,游戲繼續 110 } 111 //初始化棋盤 112 void csh() 113 { 114 for (int i = 0;i < HEIGHT;i++) //地圖初始化 115 for (int j = 0;j < WIDTH;j++) 116 map[i][j] = 0; 117 } 118 119 120 void main() 121 { 122 int winPlayer=0,player=0,isAgain=0; //winPlayer:勝利的玩家 player:現在游戲中的玩家 isAgain:是否重開游戲 123 124 csh(); 125 sc(); 126 while (winPlayer == 0) 127 { 128 play((player%2)+1); //判斷現在是哪一位玩家 129 winPlayer=pd((player % 2) + 1); 130 system("cls"); 131 player++; 132 sc(); 133 } 134 winPlayer == 1 ? printf("恭喜玩家一獲得勝利!!!\n") : printf("恭喜玩家二獲得勝利!!!\n"); 135 printf("輸入1重新開始,輸入其他任意數字退出游戲"); 136 scanf_s("%d",&isAgain); 137 if (isAgain == 1) 138 { 139 system("cls"); 140 main(); 141 } 142 143 }
效果截圖


