C語言實(shí)現(xiàn)簡單的井字棋游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)簡單井字棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
1.什么是井字棋
井字棋相信大部分人都玩過
規(guī)則:雙方輪流放子,當(dāng)某一方的三個(gè)子連成一線(行,列,對角)時(shí),該方獲勝。
2.游戲前的準(zhǔn)備
1. 菜單
游戲正式開始前我們可以為用戶提供一個(gè)選擇菜單,筆者做了一個(gè)最簡單的游戲開始菜單:
代碼:
/*菜單*/ int menu() { printf("###########################\n"); printf("## 1.Play 2.Exit ##\n"); printf("###########################\n"); return 0; }
2. 打印棋盤
要玩游戲我們首先要有一個(gè)3*3的棋盤,棋子信息則用一個(gè)二維數(shù)組來表示,并進(jìn)行初始化:
char chess[ROW][COL] = { '\0' }; //ROW=3,COL=3
顯示棋盤我們可以寫一個(gè)函數(shù):
/*顯示棋盤*/ int ShowBroad(char chess[][COL]) { system("cls"); //刷新界面 printf(" %c | %c |%c Player: X\n",chess[0][0],chess[0][1],chess[0][2]); printf(" ---------- Computer: O\n"); printf(" %c | %c |%c \n", chess[1][0], chess[1][1], chess[1][2]); printf(" ----------\n"); printf(" %c | %c |%c \n", chess[2][0], chess[2][1], chess[2][2]); }
將棋盤打印出來的同時(shí)在旁邊顯示出玩家和電腦所用的棋子。棋盤效果:
由于電腦是隨機(jī)落子的,這樣我們就會(huì)用到隨機(jī)數(shù),于是可以在后面加上隨機(jī)數(shù)的種子,為之后的隨機(jī)數(shù)做準(zhǔn)備。
至此,準(zhǔn)備工作就完成了,這部分的代碼如下:
int a ,count =0; char chess[ROW][COL] = { '\0' }; menu(); //顯示菜單 printf("Please Enter Your Chose:>\n "); scanf("%d", &a); if (a != 1){ return 0; } ShowBroad(chess); srand((unsigned)time(NULL));
其中count是用來統(tǒng)計(jì)已占用的格子。
3.游戲開始
做完準(zhǔn)備工作后我們開始正式的游戲邏輯編寫。游戲邏輯可以這樣考慮:
先由用戶輸入一個(gè)坐標(biāo),進(jìn)行勝負(fù)和平局判斷,若未產(chǎn)生任何結(jié)果則由電腦落子,之后同樣進(jìn)行勝負(fù)判斷,如此循環(huán)直到產(chǎn)生勝負(fù)或平局。
基于此,我們將所有游戲過程寫在一個(gè)死循環(huán)中,直到產(chǎn)生游戲結(jié)果則跳出。
1. 玩家落子
代碼:
if ((user_x >= 1 && user_x <= 3) && (user_y >= 1 && user_y <= 3)&&\ chess[user_x-1][user_y-1]=='\0'){ //輸入是否合法 chess[user_x - 1][user_y - 1] = 'X'; count++; if (Judge(chess) == 'X'){ //判斷玩家贏 ShowBroad(chess); printf("You Win! :)\n"); break; } else if (count == 9){ //判斷平局 ShowBroad(chess); printf("Draw!\n"); break; }
解釋:當(dāng)用戶輸入坐標(biāo)在棋盤內(nèi)并且該位置尚未被落子時(shí),(user_x >= 1 && user_x <= 3) && (user_y >= 1 && user_y <= 3)&&\ chess[user_x-1][user_y-1]=='\0')將棋盤對應(yīng)坐標(biāo)元素改寫成“X”(chess[user_x - 1][user_y - 1] = 'X';),之后將格子占用數(shù)count+1.
2. 判斷勝平
為了判斷是否勝利,我們可以寫一個(gè)函數(shù),將棋盤現(xiàn)在的數(shù)據(jù)傳入,在里面逐行逐列判斷。
代碼:
/*判斷*/ char Judge(char chess[][COL]) { for (int i = 0; i < COL; i++){ //判斷行 if (chess[i][0] == chess[i][1] && chess[i][1] == chess[i][2] && chess[i][2] != '\0') { return chess[i][0]; } } for (int i = 0; i < COL; i++){ //判斷列 if (chess[0][i] == chess[1][i] && chess[1][i] == chess[2][i] && chess[2][i] != '\0') { return chess[0][i]; } } if (chess[0][0] == chess[1][1] && chess[1][1] == chess[2][2] && chess[2][2] != '\0') { //判斷對角線 return chess[0][0]; } if (chess[0][2] == chess[1][1] && chess[1][1] == chess[2][0] && chess[2][0] != '\0') { return chess[0][2]; } return ' '; }
此時(shí)是玩家落子之后,不會(huì)產(chǎn)生負(fù),所以不需要判斷是否輸了。檢查Judge()的返回值。當(dāng)玩家勝利時(shí)輸出勝利,游戲結(jié)束,當(dāng)平局時(shí)輸出平局,游戲結(jié)束
if (Judge(chess) == 'X'){ //判斷玩家贏 ShowBroad(chess); printf("You Win! :)\n"); break; } else if (count == 9){ //判斷平局 ShowBroad(chess); printf("Draw!\n"); break; }
3. 電腦落子
電腦是隨機(jī)落子的,于是需要給chess()傳入隨機(jī)的x和y,于是這里用到rand()
void computer(char chess[][COL]) { int x, y; while (1){ x = rand() % (COL) + 0; y = rand() % (COL) + 0; if (chess[x][y] == '\0'){ chess[x][y] = 'O'; break; } } ShowBroad(chess); }
這里要注意當(dāng)隨機(jī)的坐標(biāo)未被落子時(shí)才能使用,所以用死循環(huán)來查找一個(gè)合法的坐標(biāo),當(dāng)找到時(shí)電腦才能落子,之后跳出循環(huán),并刷新棋盤。
4. 判斷負(fù)
與上面一樣,我們調(diào)用Judge()函數(shù)來判斷,當(dāng)返回的是“O”時(shí)候,輸出信息,游戲結(jié)束。
if (Judge(chess) == 'O'){ //判斷電腦贏 printf("You Lost!\n"); break; }
最終游戲界面:
結(jié)束
至此,一個(gè)簡單的井字棋游戲就完成了,內(nèi)容簡陋,可以優(yōu)化的地方還有很多,各位可自行擴(kuò)展。由這個(gè)簡單的三子棋我們還能進(jìn)一步發(fā)展成五子棋,做出更多的內(nèi)容,先挖個(gè)五子棋的坑,以后來填。
main函數(shù)代碼:
int main() { int a ,count =0; char chess[ROW][COL] = { '\0' }; menu(); //顯示菜單 printf("Please Enter Your Chose:>\n "); scanf("%d", &a); if (a != 1){ return 0; } ShowBroad(chess); srand((unsigned)time(NULL)); while (1) { int user_x, user_y; printf("Please Enter:<x,y>\n"); scanf("%d%d", &user_x, &user_y); //玩家落子 if ((user_x >= 1 && user_x <= 3) && (user_y >= 1 && user_y <= 3)&&\ chess[user_x-1][user_y-1]=='\0'){ //輸入是否合法 chess[user_x - 1][user_y - 1] = 'X'; count++; if (Judge(chess) == 'X'){ //判斷玩家贏 ShowBroad(chess); printf("You Win! :)\n"); break; } else if (count == 9){ //判斷平局 ShowBroad(chess); printf("Draw!\n"); break; } computer(chess); //電腦落子 count++; if (Judge(chess) == 'O'){ //判斷電腦贏 printf("You Lost!\n"); break; } } else continue; } system("pause"); return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MATLAB全網(wǎng)最全的colormap的使用教程詳解
眾所周知,MATLAB中的colormap只有少得可憐的幾種,有很多應(yīng)用在很特殊的圖形中的colormap幾乎都沒有,而每次寫代碼都要去找顏色的圖屬實(shí)太麻煩。所以本文將包全部集成了進(jìn)來,終于有了這套包含200個(gè)colormap的工具函數(shù),希望對大家有所幫助2023-02-02深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)
本篇文章是對linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05離線安裝visual?studio2022+QT5.12的實(shí)現(xiàn)步驟
近期有需求離線配置C++與QT環(huán)境,本文主要介紹了離線安裝visualstudio2022+QT5.12的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06C語言基于EasyX庫實(shí)現(xiàn)有顏色彈跳小球
這篇文章主要為大家詳細(xì)介紹了C語言基于EasyX庫實(shí)現(xiàn)有顏色彈跳小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01