C語言版三子棋小遊戲
本文實例為大傢分享瞭C語言版三子棋小遊戲的具體代碼,供大傢參考,具體內容如下
①遊戲效果
- 有一個3*3的棋盤
- 每次下棋後(電腦和玩傢),棋盤會更新數據
- 會有菜單提示相關命令進行相關操作
- 下棋方法是輸入坐標
- 每一局遊戲結束後,會詢問是否繼續.
②主函數邏輯搭建
任何一個項目的實現,最重要的就是邏輯結構搭建,而各個功能的實現就是采取函數(模塊化)進行細分.
所以我們需要搭建邏輯,那麼邏輯結構是啥呢?
- 首先會跳出提示菜單,內容為 0退出遊戲,1開始/繼續遊戲,其他鍵提示錯誤,並重新輸入
- 按0後提示 “成功退出遊戲”
- 按1開始遊戲
#include <stdio.h> int main() { int input = 0; do { remind(); // 提示菜單 scanf("%d",&input); //開始輸入命令 switch (input) { case 0: printf("成功退出遊戲\n"); break; case 1: playgame(); // 開始遊戲 printf("是否繼續遊戲\n"); break; default : printf("命令錯誤,請重新選擇\n"); break; } } while (input); return 0; }
③遊戲模塊(playgame)邏輯搭建
前面的邏輯結構已經搭建,而我們需要實現的就是 playgame()模塊.
那麼他的功能邏輯是啥呢??
- 棋盤內容用二維數組存儲
- 初始化棋盤(即棋盤上還沒有下子).所以初始化是一個單獨模塊
- 對弈分為兩個模塊(電腦下子與玩傢下子)
- 每一局對弈後,都要判斷電腦或玩傢是否贏.(所以又是一個單獨的判斷輸贏模塊)
#define row 3 #define col 3 void playgame() { char board[row][col]; // 存儲下子內容 int result = 0; //用來接收Iswin函數判斷的返回值 Initboard(board, row, col); //初始化棋盤,即最開始棋盤都沒有下子 Displayboard(board, row, col); //顯示棋盤,即顯示棋盤目前的狀態 while (1) //開始進行對弈,直到一方贏或者平局結束循環 { player(board, row, col); //玩傢下子函數 if ((result = Iswin(board, row, col)) == 1) break; // Iswin函數的設定是如果玩傢勝利,返回1 computer(board, row, col); //電腦下子函數 if ((result = Iswin(board, row, col)) == -1) break; // Iswin函數的設定是 如果電腦勝利,返回-1 if (!result) break; //返回0平局,如果既沒有輸贏也不是平局,則繼續對弈 } if (result == 1) printf("恭喜您取得勝利!!!!!!!!!\n"); else if (result == -1) printf("你也太辣雞瞭吧,電腦都下不贏\n"); else printf("哎~~,你的技術不行啊,居然和電腦達成平手\n"); }
解釋:
可以清晰的明白playgame()函數的邏輯結構.
其中有一步驟是這樣的if (Iswin(board, row, col) >= 0),它的執行是先調用函數(滿足我們需要判斷誰贏的要求),再利用返回結果判斷是否結束循環,一條程序就達到兩個效果,比較妙.
④分支模塊具體實現
0.remind函數實現
就是起到一個提示作用,直接打印就行.
void remind() { printf("+------------------------------------------+\n" "+-------------- 0 結束遊戲 --------------+\n" "+----------- 1 開始/繼續遊戲 ------------+\n" "+------------------------------------------+\n"); }
1.Initboard函數實現
既然是初始化函數,說明我們的要求就是把二維數組board初始化為全空格.
void Initboard(char(*board)[3],int Row,int Col ) { int i = 0, j = 0; for (i = 0; i < Row; i++) { for (j = 0; j < Col; j++) { board[i][j] = ' '; // 賦予空格 } } }
2.Displayboard函數實現
顯示棋盤內容顯示的不止是二維數組board的內容,還要加上邊界(如圖),所以Displayboard的要求是什麼?
既要顯示邊界,也要顯示board的存儲內容.
而顯示邊界我們可以分成小塊循環顯示,比如看成3個條形加上最後下邊界
每一個條形又可以看成三個小方塊加上小右邊界
void Displayboard(char(*board)[3], int Row, int Col) { int i = 0, j = 0; for (i = 0; i < Row; i++) { printf("+---+---+---+\n"); //打印小條形的上邊界 for (j = 0; j < Col; j++) { printf("| %c ",board[i][j]); //打印小條形中的方塊內容 } printf("|\n"); //補上 小右邊界 } printf("+---+---+---+\n"); //補上 下邊界 }
3.player函數實現
玩傢下棋采用的是坐標輸入方式
玩傢輸入一個坐標,那麼棋盤上的相應位置就應該更新.(相應位置用 * 表示)
輸入坐標時候還要檢驗該位置是否已經落子瞭.
void player(char(*board)[3], int Row, int Col) { printf("請分別輸入橫縱坐標(輸入數據請用空格隔開):\n"); scanf("%d%d", &Row, &Col); while (1) { if (((1 <= Row) && (Row <= 3)) //邊界必須合格,且該地方無子 && ((1 <= Col) && (Col <= 3)) && (board[Row-1][Col-1] == ' ')) { board[Row - 1][Col - 1] = '*'; //之所以Row - 1 Col - 1是考慮到玩傢不一定是程序員,他不知道編程從0開始數 break; } else { printf("請仔細堅持你的坐標位置,是否已經落子或坐標超界,然後重新輸入坐標.\n"); printf("請輸入坐標:\n"); scanf("%d%d", &Row, &Col); } } printf("下子成功!\n"); Displayboard(board, row, col); // 無論是玩傢還是電腦下子,都需要顯示出下子內容 }
4.Iswin函數實現
玩傢或者電腦下子後,需要判斷雙方有一方是否贏.
Iswin的作用就是判斷是否有一方贏.
其中返回值1代表玩傢勝利,返回值0代表平局,返回值-1代表電腦贏
判斷勝利方法就是檢查每行每列以及斜線是否有一樣的,以及是否不輸不贏
int Iswin(char(*board)[3], int Row, int Col) { //怎麼判斷一方贏?? 橫,豎,斜線隻要都一樣,則可以知道一方贏(全是空格除外) for (int i = 0; i < Row; i++) //每一行 { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != ' ')) { if (board[i][0] == '*') return 1; //如果一行都是*,說明玩傢勝利,否則電腦勝利 return -1; } } for (int j = 0; j < Col; j++) //每一列 { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[0][j] != ' ')) { if (board[0][j] == '*') return 1; //如果一列都是*,說明玩傢勝利,否則電腦勝利 return -1; } } if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) //斜線 ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != ' '))) { if (board[1][1] == '*') return 1; return -1; } for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { if (board[i][j] == ' ') return -2; //如果前三者情況都沒有,隻要目前棋盤上還剩下空餘位置 //就說明不輸不贏,需要繼續對弈.返回[-1,1]之外的值就行 } } return 0; //除去上面4種情況就是平局 }
5.computer函數實現
由於是電腦下載,我們無法操作,於是隻有讓電腦隨機下載瞭.缺陷是電腦就有點智障瞭,哈哈.
#include <stdlib.h> #include <time.h> void computer(char(*board)[3], int Row, int Col) { srand(time(NULL)); while (1) { int i = rand() % 3; int j = rand() % 3; if (board[i][j] == ' ') { board[i][j] = '#';//#代表電腦下子 break; } } printf("電腦已下子:\n"); Displayboard(board, row, col); //電腦下子後,顯示棋盤 }
⑤完整代碼
#include <stdio.h> #include <stdlib.h> #include <time.h> #define row 3 #define col 3 void remind() { printf("+------------------------------------------+\n" "+-------------- 0 結束遊戲 --------------+\n" "+----------- 1 開始/繼續遊戲 ------------+\n" "+------------------------------------------+\n"); } void Initboard(char(*board)[3],int Row,int Col ) { int i = 0, j = 0; for (i = 0; i < Row; i++) { for (j = 0; j < Col; j++) { board[i][j] = ' '; // 賦予空格 } } } void Displayboard(char(*board)[3], int Row, int Col) { int i = 0, j = 0; for (i = 0; i < Row; i++) { printf("+---+---+---+\n"); for (j = 0; j < Col; j++) { printf("| %c ",board[i][j]); } printf("|\n"); } printf("+---+---+---+\n"); } void player(char(*board)[3], int Row, int Col) { printf("請分別輸入橫縱坐標(輸入數據請用空格隔開):\n"); scanf("%d%d", &Row, &Col); while (1) { if (((1 <= Row) && (Row <= 3)) //邊界必須合格,且該地方無子 && ((1 <= Col) && (Col <= 3)) && (board[Row-1][Col-1] == ' ')) { board[Row - 1][Col - 1] = '*'; //之所以Row - 1 Col - 1是考慮到玩傢不一定是程序員,他不知道編程從0開始數 break; } else { printf("請仔細堅持你的坐標位置,是否已經落子或坐標超界,然後重新輸入坐標.\n"); printf("請輸入坐標:\n"); scanf("%d%d", &Row, &Col); } } printf("下子成功!\n"); Displayboard(board, row, col); // 無論是玩傢還是電腦下子,都需要顯示出下子內容 } void computer(char(*board)[3], int Row, int Col) { srand(time(NULL)); while (1) { int i = rand() % 3; int j = rand() % 3; if (board[i][j] == ' ') { board[i][j] = '#';//#代表電腦下子 break; } } printf("電腦已下子:\n"); Displayboard(board, row, col); //電腦下子後,顯示棋盤 } int Iswin(char(*board)[3], int Row, int Col) { //怎麼判斷一方贏?? 橫,豎,斜線隻要都一樣,則可以知道一方贏(全是空格除外) for (int i = 0; i < Row; i++) //每一行 { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != ' ')) { if (board[i][0] == '*') return 1; //如果一行都是*,說明玩傢勝利,否則電腦勝利 return -1; } } for (int j = 0; j < Col; j++) //每一列 { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[0][j] != ' ')) { if (board[0][j] == '*') return 1; //如果一列都是*,說明玩傢勝利,否則電腦勝利 return -1; } } if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) //斜線 ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != ' '))) { if (board[1][1] == '*') return 1; return -1; } for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { if (board[i][j] == ' ') return -2; //如果前三者情況都沒有,隻要目前棋盤上還剩下空餘位置 //就說明不輸不贏,需要繼續對弈.返回[-1,1]之外的值就行 } } return 0; //除去上面4種情況就是平局 } void playgame() { char board[row][col]; // 存儲下子內容 int result = 0; //用來接收Iswin函數判斷的返回值 Initboard(board, row, col); //初始化棋盤,即最開始棋盤都沒有下子 Displayboard(board, row, col); //顯示棋盤,即顯示棋盤目前的狀態 while (1) //開始進行對弈,直到一方贏或者平局結束循環 { player(board, row, col); //玩傢下子函數 if ((result = Iswin(board, row, col)) == 1) break; // Iswin函數的設定是如果玩傢勝利,返回1 computer(board, row, col); //電腦下子函數 if ((result = Iswin(board, row, col)) == -1) break; // Iswin函數的設定是 如果電腦勝利,返回-1 if (!result) break; //返回0平局,如果既沒有輸贏也不是平局,則繼續對弈 } if (result == 1) printf("恭喜您取得勝利!!!!!!!!!\n"); else if (result == -1) printf("你也太辣雞瞭吧,電腦都下不贏\n"); else printf("哎~~,你的技術不行啊,居然和電腦達成平手\n"); } #include <stdio.h> int main() { int input = 0; do { remind(); // 提示菜單 scanf("%d", &input); //開始輸入命令 switch (input) { case 0: printf("成功退出遊戲\n"); break; case 1: playgame(); // 開始遊戲 printf("是否繼續遊戲\n"); break; default: printf("命令錯誤,請重新選擇\n"); break; } } while (input); return 0; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。