摘要:三子棋目錄一問題介紹三子棋,在民間又叫井字棋。因為人們在游玩時常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。
目錄
? ? ? ? 三子棋,在民間又叫井字棋。因為人們在游玩時常常不畫棋盤的邊框,正如漢字中的“井”字,多稱為“井字棋”。
三子棋的游戲規則十分的簡單:
在3×3的棋盤雙方輪流下棋(先手一般的棋子為“X”,后手為“O”),當有一方所下的棋子連成一條直線即為勝利!
?
- ?創建游戲菜單
- 初始化棋盤
- 打印棋盤
- 玩家下棋(判斷是否勝利)
- 電腦下棋(判斷是否勝利)
- 游戲結束
//菜單函數void menu(void){ printf("|---------------|/n"); printf("|--- 1.START ---|/n"); printf("|--- 0.EXIT ---|/n"); printf("|---------------|/n");}
1.開始游戲? ? ? 0.退出游戲
使用全局變量創建3×3的棋盤
使用全局變量的原因:
//定義行、列#define ROW 3#define COL 3
//初始化棋盤函數void InitChessBoard(char Board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { //把數組中每個元素初始化為空格 Board[i][j] = " "; } }}
在這里,為了后續棋盤的大小方便改變,將分割行分別打印
//打印棋盤函數void DisplayChessBoard(char Board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { //打印“ 字符 | 字符 | 字符 ” printf(" %c ", Board[i][j]); if (j < col - 1) { printf("|"); } } //打印完一行之后換行 printf("/n"); if (i
玩家需通過輸入[1,3]區間內的數字來落子“x”
//玩家下棋函數void PlayerMove(char Board[ROW][COL], int row, int col){ int x = 0; int y = 0; while (1) { printf("player(行 列):>"); //玩家輸入坐標 scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { //玩家輸入區間為[1, 3] if (Board[x - 1][y - 1] == " ") { Board[x - 1][y - 1] = "x"; break; } else { printf("該坐標已被占用,請重新輸入!/a/n/n"); } } else { printf("輸入坐標非法,請重新輸入!/a/n/n"); } }}
電腦下棋需要使用生成隨機數種子,并且保證電腦在空的坐標上落子
在主調函數中使用生成隨機數函數,?確保生成的隨機數為隨機:
srand((unsigned int)time(NULL));//time的函數返回類型是time_t//在這里使用強制轉換類型(unsigned int)
//電腦下棋函數void ComputerMove(char Board[ROW][COL], int row, int col){ int x = 0; int y = 0; printf("computer:/n"); while (1) { //獲取時間隨機數 x = rand() % row; y = rand() % col; if (Board[x][y] == " ") { Board[x][y] = "o"; break; } } }
在這一步我們需要定義兩個函數:
我們約定當返回“x”時玩家勝利
返回“o”時電腦勝利
返回“q”時代表平局
返回“c”時代表棋盤未被填滿游戲繼續
//判斷是否勝利函數char IsWin(char Board[ROW][COL], int row, int col){ int i = 0; //判斷行 for (i = 0; i < row; i++) { if (Board[i][0] == Board[i][1] && Board[i][1] == Board[i][2] && Board[i][1] != " ") { return Board[i][1]; } } //判斷列 for (i = 0; i < col; i++) { if (Board[0][i] == Board[1][i] && Board[1][i] == Board[2][i] && Board[1][i] != " ") { return Board[1][i]; } } //判斷對角線"/" if (Board[0][0] == Board[1][1] && Board[1][1] == Board[2][2] && Board[1][1] != " ") { return Board[1][1]; } //判斷對角線"/" if (Board[0][2] == Board[1][1] && Board[1][1] == Board[2][0] && Board[1][1] != " ") { return Board[1][1]; } //檢查棋盤是否填滿 if (IsFull == 1) { //返回平局 return "q"; } //返回繼續 return "c";}
//判斷棋盤是否被填滿函數int IsFull(char Board[ROW][COL], int row, int col){ int i = 0; int j = 0; for(i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (Board[i][j] == " ") return 0; } } return 1;}
//游戲實現函數void Game(char Board[ROW][COL], int row, int col){ InitChessBoard(Board, ROW, COL); DisplayChessBoard(Board, ROW, COL); while (1) { PlayerMove(Board, ROW, COL); DisplayChessBoard(Board, ROW, COL); if (IsWin(Board, ROW, COL) != "c") break; ComputerMove(Board, ROW, COL); DisplayChessBoard(Board, ROW, COL); if (IsWin(Board, ROW, COL) != "c") break; } if (IsWin(Board, ROW, COL) == "x") printf("PLAYER WIN!/n/n"); else if (IsWin(Board, ROW, COL) == "o") printf("COMPUTER WIN!/n/n"); else printf("平局!/n/n");}
//主調函數int main(void){ srand((unsigned int)time(NULL)); char Board[ROW][COL] = { 0 }; int input = 0; do { menu(); printf("please enter:>"); scanf("%d", &input); switch (input) { case 1: printf("GAME START/n"); Game(Board, ROW, COL); break; case 0: printf("GAME EXIT/n/a"); break; default: printf("ERROR!/n/a"); } } while (input); return 0;}
#define _CRT_SECURE_NO_WARNINGS 1//程序所需頭文件#include #include #include //定義行、列#define ROW 3#define COL 3//菜單函數void menu(void){ printf("|---------------|/n"); printf("|--- 1.START ---|/n"); printf("|--- 0.EXIT ---|/n"); printf("|---------------|/n");}//初始化棋盤函數void InitChessBoard(char Board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { Board[i][j] = " "; } }}//打印棋盤函數void DisplayChessBoard(char Board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", Board[i][j]); if (j < col - 1) { printf("|"); } } printf("/n");//打印完一行之后換行 if (i "); //玩家輸入坐標 scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { //玩家輸入區間為[1, 3] if (Board[x - 1][y - 1] == " ") { Board[x - 1][y - 1] = "x"; break; } else { printf("該坐標已被占用,請重新輸入!/a/n/n"); } } else { printf("輸入坐標非法,請重新輸入!/a/n/n"); } }}//電腦下棋函數void ComputerMove(char Board[ROW][COL], int row, int col){ int x = 0; int y = 0; printf("computer:/n"); while (1) { //獲取時間隨機數 x = rand() % row; y = rand() % col; if (Board[x][y] == " ") { Board[x][y] = "o"; break; } } }//判斷棋盤是否被填滿函數int IsFull(char Board[ROW][COL], int row, int col){ int i = 0; int j = 0; for(i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (Board[i][j] == " ") return 0; } } return 1;}//判斷是否勝利函數char IsWin(char Board[ROW][COL], int row, int col){ int i = 0; //判斷行 for (i = 0; i < row; i++) { if (Board[i][0] == Board[i][1] && Board[i][1] == Board[i][2] && Board[i][1] != " ") { return Board[i][1]; } } //判斷列 for (i = 0; i < col; i++) { if (Board[0][i] == Board[1][i] && Board[1][i] == Board[2][i] && Board[1][i] != " ") { return Board[1][i]; } } //判斷對角線"/" if (Board[0][0] == Board[1][1] && Board[1][1] == Board[2][2] && Board[1][1] != " ") { return Board[1][1]; } //判斷對角線"/" if (Board[0][2] == Board[1][1] && Board[1][1] == Board[2][0] && Board[1][1] != " ") { return Board[1][1]; } //檢查棋盤是否填滿 if (IsFull == 1) { //返回平局 return "q"; } //返回繼續 return "c";}//游戲實現函數void Game(char Board[ROW][COL], int row, int col){ InitChessBoard(Board, ROW, COL); DisplayChessBoard(Board, ROW, COL); while (1) { PlayerMove(Board, ROW, COL); DisplayChessBoard(Board, ROW, COL); if (IsWin(Board, ROW, COL) != "c") break; ComputerMove(Board, ROW, COL); DisplayChessBoard(Board, ROW, COL); if (IsWin(Board, ROW, COL) != "c") break; } if (IsWin(Board, ROW, COL) == "x") printf("PLAYER WIN!/n/n"); else if (IsWin(Board, ROW, COL) == "o") printf("COMPUTER WIN!/n/n"); else printf("平局!/n/n");}//主調函數int main(void){ srand((unsigned int)time(NULL)); char Board[ROW][COL] = { 0 }; int input = 0; do { menu(); printf("please enter:>"); scanf("%d", &input); switch (input) { case 1: printf("GAME START/n"); Game(Board, ROW, COL); break; case 0: printf("GAME EXIT/n/a"); break; default: printf("ERROR!/n/a"); } } while (input); return 0;}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123083.html
摘要:今天博主將為大家帶來語言入門級小游戲三子棋井字棋的詳細介紹,希望這篇文章對大家能有幫助。在這里,我們使用函數來實現這一功能。 ?? ? ??今天博主將為大家帶來C語言入門級小游戲——三子棋(井字棋)的詳細介紹,希望這篇文章對大家能有幫助?。?? ? ? 在編程的學習過程中,編寫一些中這樣...
摘要:三子棋三子棋游戲介紹規則游戲設計思路代碼分析文件代碼分析。玩家下棋實現。三子棋是一種民間傳統游戲,又叫九宮棋圈圈叉叉一條龍井字棋等。落子后打印棋盤以顯示。假設平局時判定輸贏的函數返回后面代碼實現時詳細講。 ...
摘要:我們在前文中考慮的那張圖就來自這篇文章,之后我們會用剪枝算法來改進之前的解決方案。剪枝算法的實現接下來討論如何修改前面實現的算法,使其變為剪枝算法。現在我們已經有了現成的和剪枝算法,只要加上一點兒細節就能完成這個游戲了。 前段時間用 React 寫了個2048 游戲來練練手,準備用來回顧下 React 相關的各種技術,以及試驗一下新技術。在寫這個2048的過程中,我考慮是否可以在其中加...
摘要:我們在前文中考慮的那張圖就來自這篇文章,之后我們會用剪枝算法來改進之前的解決方案。剪枝算法的實現接下來討論如何修改前面實現的算法,使其變為剪枝算法。現在我們已經有了現成的和剪枝算法,只要加上一點兒細節就能完成這個游戲了。 前段時間用 React 寫了個2048 游戲來練練手,準備用來回顧下 React 相關的各種技術,以及試驗一下新技術。在寫這個2048的過程中,我考慮是否可以在其中加...
摘要:簡單介紹了三子棋原理后接下來為大家講解分步目標及代碼如何實現。電腦下棋我們實現了玩家和電腦的下棋后,我們需要編寫一個函數來判斷雙方的輸贏。我們使用函數來實現這一目標。 目錄 1.三子棋原理 2.分塊代碼實現 3.總結 1.首先向大家介紹一下三子棋的原理 首先我們需要有一個棋盤,初始時棋...
閱讀 3067·2021-11-11 16:55
閱讀 3204·2021-10-18 13:34
閱讀 601·2021-10-14 09:42
閱讀 1649·2021-09-03 10:30
閱讀 886·2021-08-05 10:02
閱讀 985·2019-08-30 11:27
閱讀 3492·2019-08-29 15:14
閱讀 1260·2019-08-29 13:02