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