C語言實(shí)現(xiàn)井字棋游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)井字棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
首先,我們需要一個(gè)大體的思路,先進(jìn)行宏觀規(guī)劃,再對(duì)細(xì)節(jié)進(jìn)行實(shí)現(xiàn)。
比如:
1、首先需要一個(gè)菜單面板作以修飾,在這個(gè)面板上,玩家可以選擇進(jìn)入游戲或者退出游戲。
2、需要一個(gè)游戲程序,這個(gè)是核心。
差不多就是這兩個(gè)了,我們可以先把這個(gè)寫下來,這樣也可以方便后面使用,像這樣:
void Game(); int Menu();//這里Menu之所以用int,是為了用返回值來確定是否退出游戲,并非唯一,也非最佳,讀者自己嘗試
為了豐富游戲內(nèi)容,我們可以加入一個(gè)選項(xiàng)在函數(shù)Game()里,比如PVE模式、PVP模式。
void PVP(); void PVE();
接下來,我們就可以用主函數(shù)把這些東西連起來啦!如下:
int main() { int i=Menu(); if (i == 1) { Game(); } printf("再見"); return 0; }
這樣就大功告成啦~~(最后哪個(gè)再見可以不要,這個(gè)代碼中,筆者為了優(yōu)化玩家游戲體驗(yàn),加入了很多不必要的東西,讀者均可以不寫,主要視讀者興趣而定)
接下來我們來實(shí)現(xiàn)細(xì)節(jié),先來寫菜單:(如下)
int Menu() { //以下是修飾用的菜單面板 printf("##########################\n"); printf("###### #####\n"); printf("###### 1:開始游戲 #####\n"); printf("###### 2:退出游戲 #####\n"); printf("###### #####\n"); printf("##########################\n"); printf("請(qǐng)選擇:"); //下面這個(gè)循環(huán)的目的是為了確認(rèn)玩家是否輸入的是“1”或者“2”,為了使系統(tǒng)可以穩(wěn)定運(yùn)行,這個(gè)很重要 int i = 0; while (1) { scanf("%d", &i); if (i == 1 || i == 2) { break; } printf("\n輸入無效,請(qǐng)重新輸入:"); } if (i == 1) return 1; return 2; }
這里我們可以看到,返回了 i ,因?yàn)槲以谥骱瘮?shù)里需要借助這個(gè)返回值確定是否進(jìn)入游戲~~
完成面板后,我們就要進(jìn)行我們的核心部分。
函數(shù)Game()的實(shí)現(xiàn)
同樣的,先宏觀操作,根據(jù)需求來寫代碼。
void Game() { //首先需要一個(gè)看起來像棋盤的東西,數(shù)組是個(gè)不錯(cuò)的選擇, //因?yàn)橐话阄覀冇谩畑'和‘o'來表示兩個(gè)玩家的棋子,我們這里把數(shù)組定義成char類型 char arr[3][3] = {{ ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '}}; //以下是花里胡哨的面板~~ printf("##########################\n"); printf("###### #####\n"); printf("###### 1:人機(jī)對(duì)戰(zhàn) #####\n"); printf("###### 2:雙人對(duì)戰(zhàn) #####\n"); printf("###### 3:退出游戲 #####\n"); printf("###### #####\n"); printf("##########################\n"); printf("請(qǐng)選擇:");//提示玩家輸入的窗口 int choose = 0; //這個(gè)循環(huán)同樣是為了優(yōu)化系統(tǒng)的穩(wěn)定,不至于被有些調(diào)皮的玩家搞崩~~ while (1) { scanf("%d", &choose); if (choose == 1 || choose == 2||choose==3) break; printf("\n輸入無效,請(qǐng)重新輸入:"); } //根據(jù)玩家的選擇進(jìn)入相應(yīng)的模式,這里if(choose==3)的時(shí)候顯然Game會(huì)運(yùn)行結(jié)束,到達(dá)主函數(shù)的結(jié)束階段,所以筆者偷了個(gè)懶,并沒寫這個(gè)情況~~,不過這并不影響什么。 if (choose == 1) PVE(); if (choose == 2) PVP(); }
以上都是游戲的基本流程,玩過游戲的老鐵應(yīng)該是爛熟與心的,沒玩過也沒關(guān)系~~,去玩一下就知道了,總之要搞出來一個(gè)游戲,我們總得知道玩的過程吧?
接下來實(shí)現(xiàn)兩個(gè)模式:
先寫人機(jī)吧?(這個(gè)限于筆者能力有限,寫的比較啰嗦,如果讀者有更好的創(chuàng)意,可以去自己實(shí)現(xiàn)~~)
void PVE() { int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} }; //勝負(fù)判別 char win = ' '; //落子的坐標(biāo)定義 int i = 0; int j = 0; //打印棋盤 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); while (1) { //玩家落子 printf("請(qǐng)落子:"); while (1) { scanf("%d%d", &i, &j); if (i < 3 && j < 3 && arr[i][j] == ' ') { arr[i][j] = 'x'; break; } printf("\n請(qǐng)重新輸入:"); } printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); //判定勝負(fù) if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') { win = 'x'; break; } else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') { win = 'x'; break; } else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') { win = 'x'; break; } else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') { win = 'x'; break; } else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') { win = 'x'; break; } else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') { win = '0'; break; } //電腦落子 while (1) { i = (time(0) % 3); j = ((time(0)*time(0)) % 3); if (arr[i][j] == ' ') { arr[i][j] = 'o'; break; } } printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); //判定勝負(fù) if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') { win = 'o'; break; } else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') { win = 'o'; break; } else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'o') { win = 'o'; break; } else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') { win = 'o'; break; } else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') { win = 'o'; break; } else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') { win = '0'; break; } } if (win == 'o') { printf("\n不會(huì)吧?不會(huì)吧!不會(huì)真的有人輸給人工智障吧?\n");//筆者還是個(gè)孩子,也比較調(diào)皮哈~~,不建議這么寫,大家成熟些啊~ } else if (win == 'x') { printf("\n恭喜獲勝?。?!\n"); } else { printf("\n恭喜您與人工智障打成平手?。?!\n");//捂臉~由于電腦走的棋是筆者用時(shí)間戳來隨機(jī)確定的,可能真的有些人工智障. //這里如果筆者有興趣,可以設(shè)計(jì)一個(gè)難度選擇界面,通過感應(yīng)周圍的棋子的位置來確定,或者直接輸入經(jīng)驗(yàn)也可以,憑讀者喜好決定~~ } //這里筆者考慮到再來一局的設(shè)計(jì),覺得可以提供一些便利,于是就有了下面的遞歸 int re = 0; printf("##########################\n"); printf("###### #####\n"); printf("###### 1;返回菜單 #####\n"); printf("###### 2:再來一次 #####\n"); printf("###### #####\n"); printf("##########################\n"); printf("請(qǐng)選擇:"); while (1) { scanf("%d", &re); if (re == 1 || re == 2) break; printf("\n輸入違法,請(qǐng)重新輸入:"); } if (re == 1) { re=Menu(); if (re == 1) { Game(); } } else if (re == 2) { PVE(); } }
好嘞!以同樣的方式寫下PVP模式,思路差不多,就不詳細(xì)解釋了,具體如下
void PVP() { int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} }; //勝負(fù)判別 char win = ' '; //落子的坐標(biāo)定義 int i = 0; int j = 0; //打印棋盤 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); while (1) { //玩家p1落子 printf("P1玩家請(qǐng)落子:"); while (1) { scanf("%d%d", &i, &j); if (i < 3 && j < 3 && arr[i][j] == ' ') { arr[i][j] = 'x'; break; } printf("\nP1玩家請(qǐng)重新輸入:"); } printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); //判定勝負(fù) if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') { win = 'x'; break; } else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') { win = 'x'; break; } else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') { win = 'x'; break; } else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') { win = 'x'; break; } else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') { win = 'x'; break; } else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') { win = '0'; break; } //玩家p2落子 printf("P2玩家請(qǐng)落子:"); while (1) { scanf("%d%d", &i, &j); if (i < 3 && j < 3 && arr[i][j] == ' ') { arr[i][j] = 'o'; break; } printf("\nP2玩家請(qǐng)重新輸入:"); } printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); //判定勝負(fù) if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') { win = 'o'; break; } else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') { win = 'o'; break; } else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == '0') { win = 'o'; break; } else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') { win = 'o'; break; } else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') { win = 'o'; break; } else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') { win = '0'; break; } } if (win == 'o') { printf("\nP2獲得勝利!??!\n"); } else if (win == 'x') { printf("\nP1獲得勝利!??!\n"); } else { printf("\n平手?。?!\n"); } int re = 0; printf("##########################\n"); printf("###### #####\n"); printf("###### 1;返回菜單 #####\n"); printf("###### 2:再來一次 #####\n"); printf("###### #####\n"); printf("##########################\n"); printf("請(qǐng)選擇:"); while (1) { scanf("%d", &re); if (re == 1 || re == 2) break; printf("\n輸入違法,請(qǐng)重新輸入:"); } if (re == 1) { re = Menu(); if (re == 1) { Game(); } } else if (re == 2) { PVP(); } }
這樣,所有我們?cè)O(shè)計(jì)好的細(xì)節(jié)就都被實(shí)現(xiàn)啦,一個(gè)完整的簡(jiǎn)單游戲就大功告成了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲詳解
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法
本文主要介紹了C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08C++ Boost實(shí)現(xiàn)異步端口掃描器詳解
端口掃描是一種用于識(shí)別目標(biāo)系統(tǒng)上哪些網(wǎng)絡(luò)端口處于開放、關(guān)閉或監(jiān)聽狀態(tài)的網(wǎng)絡(luò)活動(dòng),本文將運(yùn)用Boost框架實(shí)現(xiàn)一個(gè)基于TCP的掃描工具,有需要的小伙伴可以參考下2023-11-11C++中如何實(shí)現(xiàn)回調(diào)的方法示例
這篇文章主要給大家介紹了關(guān)于C++中如何實(shí)現(xiàn)回調(diào)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10C++實(shí)現(xiàn)LeetCode(101.判斷對(duì)稱樹)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(101.判斷對(duì)稱樹),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07