C語(yǔ)言版的三子棋游戲
本文實(shí)例為大家分享了C語(yǔ)言版三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
一、游戲說(shuō)明
三子棋相信大家都不陌生,小時(shí)候經(jīng)常在紙上畫(huà)出九宮格就可以直接和小伙伴一起玩,規(guī)則就是誰(shuí)先在九宮格中下出同一行三個(gè)一樣,或者同一列三個(gè)一樣,又或者對(duì)角線的三個(gè)一樣的棋子,誰(shuí)就獲勝;其實(shí)在編程中,代碼也能實(shí)現(xiàn)人機(jī)版的三子棋小游戲,讓我們一起來(lái)看看如何實(shí)現(xiàn)的吧!
二、游戲設(shè)計(jì)步驟
將三子棋游戲的實(shí)現(xiàn)邏輯分為以下步驟:
1.創(chuàng)建菜單(選擇玩游戲或者退出游戲)
2.創(chuàng)建和初始化游戲棋盤(pán)(本質(zhì)上為一個(gè)二維數(shù)組)
3.打印出棋盤(pán)
4.玩家下棋(用‘ * '表示棋子)
5.判斷輸贏或者是否平局
6.電腦下棋(用‘ # '表示棋子)
7.判斷輸贏(同第5步)
8.回到第3步直至確定輸贏
三、代碼實(shí)現(xiàn)
1.創(chuàng)建菜單
規(guī)定輸入 1 為玩游戲,輸入 0 為退出游戲
void menu() { printf("******************************\n"); printf("********** 1.play **********\n"); printf("********** 0.exit **********\n"); printf("******************************\n"); }
2.創(chuàng)建和初始化游戲棋盤(pán)
本質(zhì)為創(chuàng)建一個(gè)二維數(shù)組并初始化
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] = ' '; } } }
3.打印出棋盤(pán)
利用循環(huán)的方式將字符排版成棋盤(pán)的樣式(n x n 的棋盤(pán)也同樣可以打?。?/p>
void DisplayBoard(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 < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } } printf("\n"); } }
4.玩家下棋
規(guī)定玩家的棋子為字符‘ * ',同時(shí)需判斷棋子坐標(biāo)的合理性
void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家走\(yùn)n"); printf("請(qǐng)輸入坐標(biāo)>:"); while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3)//判斷游戲合法性 { 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"); } }
5.電腦下棋
規(guī)定電腦的棋子為字符‘ # ',同樣需判斷棋子坐標(biāo)的合理性
void ComputerMove(char board[ROW][COL], int row, int col) { printf("電腦走\(yùn)n"); while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
6.判斷輸贏或者是否平局
規(guī)定電腦贏返回字符‘ # ',玩家贏返回字符‘ * ',游戲繼續(xù)返回字符‘C',平局(即棋盤(pán)滿(mǎn)但還未出現(xiàn)勝負(fù))則返回字符‘Q';而這里我們又需要注意,判斷輸贏的函數(shù)需返回一個(gè)字符,所以判斷棋盤(pán)是否已滿(mǎn)的函數(shù)需在判斷輸贏的函數(shù)中并且能返回一個(gè)字符,這樣才能保證游戲輸贏判斷的完整性
(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][0] != ' ')//判斷行是否相等 return board[i][0]; } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//判斷列是否相等 return board[0][i]; } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判斷對(duì)角線 { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')//判斷對(duì)角線 { return board[0][2]; } int ret = IsFull(board, row , col ); if (ret == 0) { return 'Q'; } else return 'C'; }
(2)判斷棋盤(pán)是否已滿(mǎn)的函數(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 1; } } return 0; }
以上是各各步驟函數(shù)的具體實(shí)現(xiàn),而為了方便,我們將代碼分為三個(gè)文件:
1.game.h------關(guān)于游戲相關(guān)的函數(shù)聲明,符號(hào)聲明及頭文件的包含
2.game.c------游戲相關(guān)函數(shù)的實(shí)現(xiàn)
3.test.c------測(cè)試游戲的邏輯
具體如下:
game.h文件:
#include<stdio.h> #include<time.h> #define ROW 3 #define COL 3 void InitBoard(char board[ROW][COL],int row,int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col);
game.c文件:
#include"game.h" 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] = ' '; } } } void DisplayBoard(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 < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } } printf("\n"); } } void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家走\(yùn)n"); printf("請(qǐng)輸入坐標(biāo)>:"); while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3) { 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"); } } void ComputerMove(char board[ROW][COL], int row, int col) { printf("電腦走\(yùn)n"); while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } 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 1; } } return 0; } 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][0] != ' ') return board[i][0]; } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') return board[0][i]; } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][2] && board[2][0] != ' ') { return board[0][2]; } int ret = IsFull(board, row , col ); if (ret == 0) { return 'Q'; } else return 'C'; }
test.c文件:
#include"game.h" void menu() { printf("******************************\n"); printf("********** 1.play **********\n"); printf("********** 0.exit **********\n"); printf("******************************\n"); } void game() { char board[ROW][COL];//定義棋盤(pán) InitBoard(board, ROW, COL);//初始化棋盤(pán) DisplayBoard(board, ROW, COL);//打印棋盤(pán) char ret = 0; // while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') break; ComputerMove(board, ROW, COL);//電腦下棋 DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') break; } if (ret == '*') { printf("玩家勝利!\n"); } else if (ret == '#') { printf("電腦勝利!\n"); } if(ret=='Q') { printf("平局\n"); } DisplayBoard(board, ROW, COL); } int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戲結(jié)束\n"); break; default: printf(",文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下輸入錯(cuò)誤,請(qǐng)重新輸入\n"); } } while (input); return 0; }
四、運(yùn)行效果
玩游戲的三種情況分別如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)通訊錄系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07C++編程模板匹配超詳細(xì)的識(shí)別手寫(xiě)數(shù)字實(shí)現(xiàn)示例
大家好!本篇文章是關(guān)于手寫(xiě)數(shù)字識(shí)別的,接下來(lái)我將在這里記錄我的手寫(xiě)數(shù)字識(shí)別的從零到有,我在這里把我自己的寫(xiě)代碼過(guò)程發(fā)出來(lái),希望能幫到和我一樣努力求知的人2021-10-10對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用
這篇文章主要介紹了對(duì)比C語(yǔ)言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08C語(yǔ)言實(shí)現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10C++利用棧實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
這篇文章主要為大家詳細(xì)介紹了C++利用棧實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C語(yǔ)言中g(shù)etch()函數(shù)詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了C語(yǔ)言中g(shù)etch()函數(shù)詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03