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