摘要:簡(jiǎn)單介紹了三子棋原理后接下來(lái)為大家講解分步目標(biāo)及代碼如何實(shí)現(xiàn)。電腦下棋我們實(shí)現(xiàn)了玩家和電腦的下棋后,我們需要編寫一個(gè)函數(shù)來(lái)判斷雙方的輸贏。我們使用函數(shù)來(lái)實(shí)現(xiàn)這一目標(biāo)。
1.首先向大家介紹一下三子棋的原理
首先我們需要有一個(gè)棋盤,初始時(shí)棋盤全為空,我們可以通過(guò)數(shù)組的方式,將空格改為一定的符號(hào),當(dāng)有任一行或一列或?qū)蔷€為相同符號(hào)時(shí)則有一方勝出。簡(jiǎn)單介紹了三子棋原理后接下來(lái)為大家講解分步目標(biāo)及代碼如何實(shí)現(xiàn)。
2.分塊代碼實(shí)現(xiàn)
1>首先我們需要打印一個(gè)菜單,引導(dǎo)用戶輸入決定玩游戲或是退出游戲,我們使用函數(shù)實(shí)現(xiàn)這一步驟
void menu(){ printf("************************/n"); printf("***** 1. play ******/n"); printf("***** 0. exit ******/n"); printf("************************/n");}
我們將此函數(shù)嵌套在設(shè)定的一個(gè)test函數(shù)中,這樣做的好處可以讓我們主函數(shù)盡可能的簡(jiǎn)介,主函數(shù)只需調(diào)用test函數(shù)就可實(shí)現(xiàn)整個(gè)工程,我們使用switch case來(lái)接受用戶的輸入值并給出相應(yīng)結(jié)果
void test(){?? ?int input = 0;?? ?srand((unsigned int)time(NULL));?? ?do?? ?{?? ??? ?menu();?? ??? ?printf("請(qǐng)選擇:>");?? ??? ?scanf("%d", &input);?? ??? ?switch (input)?? ??? ?{?? ??? ?case 1:?? ??? ??? ?game();?? ??? ??? ?break;?? ??? ?case 0:?? ??? ??? ?printf("退出游戲/n");?? ??? ??? ?break;?? ??? ?default:?? ??? ??? ?printf("選擇錯(cuò)誤/n");?? ??? ??? ?break;?? ??? ?}?? ?} while (input);}
?在這一段中srand的使用我們后面再說(shuō),接下來(lái)為大家介紹game函數(shù)中游戲的實(shí)現(xiàn)。
2>game函數(shù)的實(shí)現(xiàn)
前文說(shuō)到我們需要使用數(shù)組來(lái)實(shí)現(xiàn)三子棋
所以我們首先要初始化一個(gè)數(shù)組,既然是三子棋,我們需要一個(gè)三行三列的二維數(shù)組,為了后續(xù)維護(hù)代碼方便,我們首先新建一個(gè)頭文件,在頭文件中定義一個(gè)ROW和COL,將這兩個(gè)值作為行和列,值均為三。
#define ROW 3#define COL 3
這時(shí)候我們就可以很方便的創(chuàng)建一個(gè)二位數(shù)組
char board[ROW][COL] = { 0 };
如在前文提到的,我們需要讓打印出來(lái)的棋盤在游戲開始時(shí)時(shí)空的,所以衛(wèi)門將數(shù)組初始化為空格,我們使用InitBoard函數(shù)實(shí)現(xiàn)這一目標(biāo)。
void InitBoard(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ù)組初始化后我們需要將棋盤打印出來(lái),要打印如前文所示有分割的鍵盤,我們可以利用兩次循環(huán),外循環(huán)每次循環(huán)打印一行,內(nèi)循環(huán)打印一列,要注意到棋盤的右邊和下面是沒有分割的,我們加入一個(gè)if判斷來(lái)控制分割只在棋盤中間,我們使用DisplayBoard函數(shù)來(lái)實(shí)現(xiàn)這一目標(biāo)。
void DisplayBoard(char board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { //數(shù)據(jù) for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("/n"); //分割行 if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } } printf("/n"); }}
在test函數(shù)中調(diào)用上述兩個(gè)函數(shù)后,我們可以打印出一個(gè)空氣盤,接下來(lái)為大家講解玩家和電腦分別如何下棋。
首先在下棋前,我們需要判斷一下棋盤中是否還有空位,若棋盤已滿,則無(wú)法繼續(xù)下棋。在判斷完之后,我們假定玩家下棋符號(hào)為*,電腦下棋符號(hào)為#,我們使用符號(hào)替換相應(yīng)坐標(biāo)中數(shù)組的空格。我們使用player_move函數(shù)來(lái)實(shí)現(xiàn)玩家下棋。
void player_move(char board[ROW][COL], int row, int col){ printf("玩家下棋:>"); int x = 0; int y = 0; while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == " ") { board[x - 1][y - 1] = "*"; break; } else { printf("該坐標(biāo)被占用,請(qǐng)重新輸入!/n"); } } else { printf("坐標(biāo)非法,請(qǐng)重輸入!/n"); } }}
在玩家下棋后,電腦同樣需要下棋,這時(shí)候我們給出一個(gè)隨機(jī)值,上文提到的srand就在這用到了,我們用rand()%ROW或COL就會(huì)的到一個(gè)0~2的數(shù)字,再判斷相應(yīng)位置是否為空,若不為空則將相應(yīng)數(shù)組中的空格替換為#,若為空則給出其他隨機(jī)數(shù)字。
void computer_move(char board[ROW][COL], int row, int col){ int x = 0; int y = 0; printf("電腦下棋>/n"); while (1) { x = rand() % ROW;//0~2 y = rand() % COL;//0~2 if (board[x][y] == " ") { board[x][y] = "#"; break; } }}
我們實(shí)現(xiàn)了玩家和電腦的下棋后,我們需要編寫一個(gè)函數(shù)來(lái)判斷雙方的輸贏。我們使用Iis_win函數(shù)來(lái)實(shí)現(xiàn)這一目標(biāo)。(這里簡(jiǎn)單介紹一下is_win函數(shù)原理,我們判斷是否有7一行或一列或?qū)蔷€為同一符號(hào),若有則返回這一符號(hào),若無(wú)則判斷棋盤是否為空,判斷后再返回對(duì)應(yīng)的符號(hào),在這我們?cè)O(shè)定:
若滿足一行或一列或?qū)蔷€為同一符號(hào),則返回相應(yīng)符號(hào)
若不滿足上述條件且棋盤判斷為不滿則返回"Q",若判斷為滿則返回"C"。
具體代碼如下:
har is_win(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]; } } //對(duì)角線的判斷 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 (1 == is_full(board, row, col))i { return "Q"; } //繼續(xù) return "C";}
我們?cè)賕ame函數(shù)中再判斷is_win的返回值便可以很好地判斷雙方的輸贏和是否繼續(xù),game函數(shù)完全體如下
void game(){ char board[ROW][COL] = { 0 }; InitBoard(board, ROW, COL);//初始化棋牌 //打印棋盤 DisplayBoard(board, ROW, COL); //下棋 char ret = 0; while (1) { player_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != "C") { break; } computer_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != "C") { break; } } if (ret == "*") { printf("玩家贏/n"); } else if (ret == "#") { printf("電腦贏/n"); } else { printf("平局/n"); }}
3.總結(jié)
我們?yōu)榱舜a的簡(jiǎn)介明了,我們使用game.g的頭文件,且將所需函數(shù)都聲明在里面,再建立game.c的源文件,將函數(shù)具體實(shí)現(xiàn)放在里面,分別再test.c和game.c中引入頭文件后,就可將代碼分塊,簡(jiǎn)介易懂。
具體代碼請(qǐng)見c語(yǔ)言/2021.11.20 · 吳昌盛/code - 碼云 - 開源中國(guó) (gitee.com)
歡迎各位討論點(diǎn)贊,感謝大家的閱讀。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/124096.html
摘要:條消息語(yǔ)言入門三子棋語(yǔ)言實(shí)現(xiàn)詳細(xì)版的博客博客條消息語(yǔ)言入門三子棋語(yǔ)言實(shí)現(xiàn)詳細(xì)版的博客博客我們將雷盤初始化為統(tǒng)一的符號(hào)。 目錄 1.原理簡(jiǎn)介 2.分布目標(biāo)及代碼實(shí)現(xiàn) 3.總結(jié) 1.原理簡(jiǎn)介 ?首先我們需要一個(gè)空的雷盤,在其中隨機(jī)埋入十枚雷,當(dāng)我們排這顆雷時(shí),若此位置為雷,則游戲失敗,若不...
摘要:今天博主將為大家?guī)?lái)語(yǔ)言入門級(jí)小游戲三子棋井字棋的詳細(xì)介紹,希望這篇文章對(duì)大家能有幫助。在這里,我們使用函數(shù)來(lái)實(shí)現(xiàn)這一功能。 ?? ? ??今天博主將為大家?guī)?lái)C語(yǔ)言入門級(jí)小游戲——三子棋(井字棋)的詳細(xì)介紹,希望這篇文章對(duì)大家能有幫助?。?? ? ? 在編程的學(xué)習(xí)過(guò)程中,編寫一些中這樣...
摘要:上一期咱們用語(yǔ)言實(shí)現(xiàn)了三子棋的小游戲語(yǔ)言實(shí)現(xiàn)三子棋今天我們?cè)賮?lái)寫個(gè)掃雷的游戲,說(shuō)起掃雷,相信大家都不陌生,可能許多朋友還是玩掃雷的高手。 ? ? ?上一期咱們用C語(yǔ)言實(shí)現(xiàn)了三子棋的小游戲? C語(yǔ)言實(shí)現(xiàn)三子棋? ? ? ?今天我們?cè)賮?lái)寫個(gè)掃雷的游戲,說(shuō)起掃雷,相信大家都不陌生,可能許多朋友還是...
摘要:三子棋目錄一問題介紹三子棋,在民間又叫井字棋。因?yàn)槿藗冊(cè)谟瓮鏁r(shí)常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋 目錄 一、問題介紹 ? ? ? ? 三子棋,在民間又叫井字棋。因?yàn)槿藗冊(cè)谟瓮鏁r(shí)常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋的游戲規(guī)則十分的簡(jiǎn)單: ...
閱讀 3027·2023-04-25 18:06
閱讀 3272·2021-11-22 09:34
閱讀 2856·2021-08-12 13:30
閱讀 2044·2019-08-30 15:44
閱讀 1660·2019-08-30 13:09
閱讀 1629·2019-08-30 12:45
閱讀 1715·2019-08-29 11:13
閱讀 3608·2019-08-28 17:51