在學(xué)習(xí)了數(shù)組之后,我們采用C語(yǔ)言來(lái)去實(shí)現(xiàn)一個(gè)三子棋小游戲,在開(kāi)始游戲之前要先有一個(gè)游戲的菜單來(lái)選擇是否進(jìn)入游戲,按 1?進(jìn)入游戲,按 0?退出程序,按其他數(shù)字則重新進(jìn)行輸入。這時(shí)我們應(yīng)該需要一個(gè)循環(huán)來(lái)進(jìn)行這段邏輯操作,想到了do....while循環(huán),能夠打印菜單,并且不進(jìn)入循環(huán),我們開(kāi)始實(shí)現(xiàn)基本的邏輯,代碼如下
成都創(chuàng)新互聯(lián)專(zhuān)注于泉州企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開(kāi)發(fā),商城開(kāi)發(fā)。泉州網(wǎng)站建設(shè)公司,為泉州等地區(qū)提供建站服務(wù)。全流程按需求定制設(shè)計(jì),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)#includevoid menu()
{
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("******************\n");
}
void game()
{
printf("開(kāi)始游戲\n");
}
int main()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("請(qǐng)重新輸入\n");
break;
}
} while (input);
return 0;
}
這時(shí),基本的邏輯已經(jīng)實(shí)現(xiàn),當(dāng)輸入1時(shí)進(jìn)入游戲,我們此時(shí)需要設(shè)計(jì)游戲的實(shí)現(xiàn)邏輯。三子棋需要3*3的方陣來(lái)進(jìn)行實(shí)現(xiàn),我們可以采用二維數(shù)組來(lái)初始化方陣,最開(kāi)始初始化為空格,當(dāng)玩家下棋時(shí),輸入要下棋的坐標(biāo)來(lái)進(jìn)行,隨后到電腦來(lái)下棋,電腦下棋就又遇到了我們的隨機(jī)數(shù)朋友,srang()函數(shù)和rand()函數(shù),具體用法見(jiàn)下方代碼
我們首先要先創(chuàng)建一個(gè)3*3的數(shù)組當(dāng)做棋盤(pán),為了達(dá)到空白棋盤(pán)的效果,先寫(xiě)一個(gè)初始化棋盤(pán)函數(shù)init_board();使用for循環(huán)來(lái)初始化棋盤(pán)中的元素為空格,代碼如下:
void init_board(char board[ROW][COL], int row, int col)//初始化棋盤(pán)
{
int i = 0;
for (i = 0; i< row; ++i)
{
int j = 0;
for (j = 0; j< col; ++j)
{
board[i][j] = ' ';
}
}
}
初始化之后我們需要看看棋盤(pán)是什么樣,打印出來(lái)看一下,再寫(xiě)一個(gè)打印棋盤(pán)的print_board()函數(shù)代碼如下
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
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");
}
}
}
棋盤(pán)顯示如圖所示,為了能夠方便觀察,我們加入了一些橫線,此時(shí)棋盤(pán)就能夠正常去顯示了。這個(gè)時(shí)候就到了下棋的環(huán)節(jié)了,玩家下棋然后電腦下棋,首先玩家下棋,在玩家下棋的時(shí)候,玩家又不一定全部都了解數(shù)組下標(biāo)從0開(kāi)始的規(guī)則,所以在寫(xiě)程序時(shí)要考慮這個(gè)問(wèn)題,首先進(jìn)行行數(shù)和列數(shù)的輸入,在第一次輸入時(shí)時(shí)空白棋盤(pán),哪都能下,如果后邊再下,是否需要判斷哪些位置已經(jīng)被占,哪些位置空白呢?代碼如下
void player_move(char board[ROW][COL], int row, int col)
{
printf("玩家下棋\n");
while (1)
{
printf("請(qǐng)輸入坐標(biāo)\n");
int x = 0;
int y = 0;
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)已經(jīng)被占用\n");
}
else
printf("坐標(biāo)非法\n");
}
}
采用一個(gè)while循環(huán),只有輸入正確才會(huì)停止,否則會(huì)顯示錯(cuò)誤信息,讓玩家重新輸入。下面就到了電腦下棋的環(huán)節(jié),電腦下棋時(shí)要生成兩個(gè)隨機(jī)數(shù),我們需要使用srand()函數(shù)和rand()函數(shù),但產(chǎn)生的隨即數(shù)字較大,我們需要去%上行數(shù)和列數(shù),保證坐標(biāo)的合法性,這個(gè)產(chǎn)生的數(shù)字也要進(jìn)行判斷,判斷位置是否允許下棋,代碼如下
void computer_move(char board[ROW][COL], int row, int col)
{
printf("電腦下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
邏輯依舊比較簡(jiǎn)單,但是在每一次下棋結(jié)束時(shí),我們應(yīng)該加入一個(gè)能夠用來(lái)判斷輸贏的函數(shù),取名is_win,當(dāng)玩家贏時(shí),返回‘ * ’,當(dāng)電腦贏時(shí),返回‘ # ’,也存在平局的情況,我們讓程序返回? Q,如果不存在以上現(xiàn)象,讓程序返回 C ,代碼繼續(xù)往下進(jìn)行。在判斷輸贏時(shí),我們需要判斷3行,3列和兩個(gè)對(duì)角線元素是否相同,如果相同,則會(huì)返回,代碼實(shí)現(xiàn)如下
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; ++i)//判斷3行
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
int j = 0;
for (j = 0; j< col; ++j)//判斷3列
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//判斷對(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 (is_full(board, row, col) == 1)
{
return 'Q';
}
return 'C';
}
其中的is_full()函數(shù)用來(lái)判斷棋盤(pán)是否下滿,如果棋盤(pán)下滿并且沒(méi)有人贏則為平局,is_full()函數(shù)實(shí)現(xiàn)如下
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; ++i)
{
int j = 0;
for (j = 0; j< col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
當(dāng)有空位時(shí),返回0,否則返回1,返回1時(shí),判斷輸贏的函數(shù)將會(huì)返回Q,程序打印出平局。到這里,基本的幾個(gè)函數(shù)已經(jīng)寫(xiě)完了我們?cè)倩仡^把完整的代碼寫(xiě)出供大家參考主函數(shù)如下
#define _CRT_SECURE_NO_WARNINGS 1
#include#include"game.h"
#include#includevoid menu()
{
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("******************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
char ret = 0;
init_board(board,ROW,COL);//初始化棋盤(pán),使棋盤(pán)最開(kāi)始都為空格
print_board(board, ROW, COL);//打印棋盤(pán),顯示出棋盤(pán)內(nèi)容
while (1)
{
player_move(board, ROW, COL);//玩家下棋
print_board(board, ROW, COL);//打印棋盤(pán),顯示出棋盤(pán)內(nèi)容
//判斷輸贏
ret=is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);//電腦下棋
print_board(board, ROW, COL);//打印棋盤(pán),顯示出棋盤(pán)內(nèi)容
ret=is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏\n");
}
if (ret == '#')
{
printf("電腦贏\n");
}
if (ret == 'Q')
printf("平局\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();//打印菜單
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("請(qǐng)重新輸入\n");
break;
}
} while (input);
return 0;
}
放幾個(gè)函數(shù)的game.c內(nèi)容如下
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void init_board(char board[ROW][COL], int row, int col)//初始化棋盤(pán)
{
int i = 0;
for (i = 0; i< row; ++i)
{
int j = 0;
for (j = 0; j< col; ++j)
{
board[i][j] = ' ';
}
}
}
//打印棋盤(pán)
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
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 player_move(char board[ROW][COL], int row, int col)
{
printf("玩家下棋\n");
while (1)
{
printf("請(qǐng)輸入坐標(biāo)\n");
int x = 0;
int y = 0;
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)已經(jīng)被占用\n");
}
else
printf("坐標(biāo)非法\n");
}
}
//電腦下棋
void computer_move(char board[ROW][COL], int row, int col)
{
printf("電腦下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; ++i)
{
int j = 0;
for (j = 0; j< col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; ++i)//判斷3行
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
int j = 0;
for (j = 0; j< col; ++j)//判斷3列
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//判斷對(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 (is_full(board, row, col) == 1)
{
return 'Q';
}
return 'C';
}
頭文件game.h如下
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col)
有了這些,一個(gè)不太復(fù)雜又具有一定可玩性的三子棋小游戲就完成了。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享名稱(chēng):c語(yǔ)言實(shí)現(xiàn)一個(gè)三子棋小游戲-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://muchs.cn/article2/dhipoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站排名、小程序開(kāi)發(fā)、企業(yè)建站、網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容