C語言實現(xiàn)井字棋游戲
本文實例為大家分享了C語言實現(xiàn)井字棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
首先,我們需要一個大體的思路,先進行宏觀規(guī)劃,再對細節(jié)進行實現(xiàn)。
比如:
1、首先需要一個菜單面板作以修飾,在這個面板上,玩家可以選擇進入游戲或者退出游戲。
2、需要一個游戲程序,這個是核心。
差不多就是這兩個了,我們可以先把這個寫下來,這樣也可以方便后面使用,像這樣:
void Game(); int Menu();//這里Menu之所以用int,是為了用返回值來確定是否退出游戲,并非唯一,也非最佳,讀者自己嘗試
為了豐富游戲內(nèi)容,我們可以加入一個選項在函數(shù)Game()里,比如PVE模式、PVP模式。
void PVP(); void PVE();
接下來,我們就可以用主函數(shù)把這些東西連起來啦!如下:
int main() {
int i=Menu();
if (i == 1) {
Game();
}
printf("再見");
return 0;
}
這樣就大功告成啦~~(最后哪個再見可以不要,這個代碼中,筆者為了優(yōu)化玩家游戲體驗,加入了很多不必要的東西,讀者均可以不寫,主要視讀者興趣而定)
接下來我們來實現(xiàn)細節(jié),先來寫菜單:(如下)
int Menu() {
//以下是修飾用的菜單面板
printf("##########################\n");
printf("###### #####\n");
printf("###### 1:開始游戲 #####\n");
printf("###### 2:退出游戲 #####\n");
printf("###### #####\n");
printf("##########################\n");
printf("請選擇:");
//下面這個循環(huán)的目的是為了確認玩家是否輸入的是“1”或者“2”,為了使系統(tǒng)可以穩(wěn)定運行,這個很重要
int i = 0;
while (1) {
scanf("%d", &i);
if (i == 1 || i == 2) {
break;
}
printf("\n輸入無效,請重新輸入:");
}
if (i == 1)
return 1;
return 2;
}
這里我們可以看到,返回了 i ,因為我在主函數(shù)里需要借助這個返回值確定是否進入游戲~~
完成面板后,我們就要進行我們的核心部分。
函數(shù)Game()的實現(xiàn)
同樣的,先宏觀操作,根據(jù)需求來寫代碼。
void Game() {
//首先需要一個看起來像棋盤的東西,數(shù)組是個不錯的選擇,
//因為一般我們用‘x'和‘o'來表示兩個玩家的棋子,我們這里把數(shù)組定義成char類型
char arr[3][3] = {{ ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '}};
//以下是花里胡哨的面板~~
printf("##########################\n");
printf("###### #####\n");
printf("###### 1:人機對戰(zhàn) #####\n");
printf("###### 2:雙人對戰(zhàn) #####\n");
printf("###### 3:退出游戲 #####\n");
printf("###### #####\n");
printf("##########################\n");
printf("請選擇:");//提示玩家輸入的窗口
int choose = 0;
//這個循環(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輸入無效,請重新輸入:");
}
//根據(jù)玩家的選擇進入相應的模式,這里if(choose==3)的時候顯然Game會運行結束,到達主函數(shù)的結束階段,所以筆者偷了個懶,并沒寫這個情況~~,不過這并不影響什么。
if (choose == 1)
PVE();
if (choose == 2)
PVP();
}
以上都是游戲的基本流程,玩過游戲的老鐵應該是爛熟與心的,沒玩過也沒關系~~,去玩一下就知道了,總之要搞出來一個游戲,我們總得知道玩的過程吧?
接下來實現(xiàn)兩個模式:
先寫人機吧?(這個限于筆者能力有限,寫的比較啰嗦,如果讀者有更好的創(chuàng)意,可以去自己實現(xiàn)~~)
void PVE() {
int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} };
//勝負判別
char win = ' ';
//落子的坐標定義
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("請落子:");
while (1) {
scanf("%d%d", &i, &j);
if (i < 3 && j < 3 && arr[i][j] == ' ') {
arr[i][j] = 'x';
break;
}
printf("\n請重新輸入:");
}
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");
//判定勝負
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");
//判定勝負
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不會吧?不會吧!不會真的有人輸給人工智障吧?\n");//筆者還是個孩子,也比較調(diào)皮哈~~,不建議這么寫,大家成熟些啊~
}
else if (win == 'x') {
printf("\n恭喜獲勝!?。n");
}
else {
printf("\n恭喜您與人工智障打成平手?。。n");//捂臉~由于電腦走的棋是筆者用時間戳來隨機確定的,可能真的有些人工智障.
//這里如果筆者有興趣,可以設計一個難度選擇界面,通過感應周圍的棋子的位置來確定,或者直接輸入經(jīng)驗也可以,憑讀者喜好決定~~
}
//這里筆者考慮到再來一局的設計,覺得可以提供一些便利,于是就有了下面的遞歸
int re = 0;
printf("##########################\n");
printf("###### #####\n");
printf("###### 1;返回菜單 #####\n");
printf("###### 2:再來一次 #####\n");
printf("###### #####\n");
printf("##########################\n");
printf("請選擇:");
while (1) {
scanf("%d", &re);
if (re == 1 || re == 2)
break;
printf("\n輸入違法,請重新輸入:");
}
if (re == 1) {
re=Menu();
if (re == 1) {
Game();
}
}
else if (re == 2) {
PVE();
}
}
好嘞!以同樣的方式寫下PVP模式,思路差不多,就不詳細解釋了,具體如下
void PVP() {
int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} };
//勝負判別
char win = ' ';
//落子的坐標定義
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玩家請落子:");
while (1) {
scanf("%d%d", &i, &j);
if (i < 3 && j < 3 && arr[i][j] == ' ') {
arr[i][j] = 'x';
break;
}
printf("\nP1玩家請重新輸入:");
}
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");
//判定勝負
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玩家請落子:");
while (1) {
scanf("%d%d", &i, &j);
if (i < 3 && j < 3 && arr[i][j] == ' ') {
arr[i][j] = 'o';
break;
}
printf("\nP2玩家請重新輸入:");
}
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");
//判定勝負
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("請選擇:");
while (1) {
scanf("%d", &re);
if (re == 1 || re == 2)
break;
printf("\n輸入違法,請重新輸入:");
}
if (re == 1) {
re = Menu();
if (re == 1) {
Game();
}
}
else if (re == 2) {
PVP();
}
}
這樣,所有我們設計好的細節(jié)就都被實現(xiàn)啦,一個完整的簡單游戲就大功告成了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++數(shù)據(jù)結構與算法的基礎知識和經(jīng)典算法匯總
終是到了標志著大二結束的期末考試了,對于《算法設計與分析》這門課,我需要總結一下學過的所有算法的思想以及老師補充的關于兩個復雜度和遞歸的概念思想,以及更深層次的理解,比如用畫圖的方式表達出來,我覺得可以用博客記錄總結一下,分享給大家,希望能有所幫助2022-05-05
在C++中高效使用和處理Json格式數(shù)據(jù)的示例代碼
最近的項目在用c處理后臺的數(shù)據(jù)時,因為好多外部接口都在使用Json格式作為返回的數(shù)據(jù)結構和數(shù)據(jù)描述,如何在c中高效使用和處理Json格式的數(shù)據(jù)就成為了必須要解決的問題,需要的朋友可以參考下2023-11-11
C++實現(xiàn)LeetCode(111.二叉樹的最小深度)
這篇文章主要介紹了C++實現(xiàn)LeetCode(111.二叉樹的最小深度),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

