目錄
團風(fēng)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!游戲規(guī)則:
geme.h:
test.c:
geme.c:
? 相信大家都知道三子棋的游戲規(guī)則,但是還是啰嗦一下結(jié)束一下哈哈哈;規(guī)則就是在一個3*3的棋盤中,對應(yīng)的九個格子,只要雙方只要有一方的三顆棋子連成一條線就勝利,要是填滿九個格子還沒有任意一方的三顆棋子連成一條線,那就是平局了。
okok啰嗦完,開始正式話題。
———————————————————————————————————————————
在我們實現(xiàn)三子棋的時候,我們可以想到用模塊化的開發(fā)去完成游戲的實現(xiàn),每一個文件各司其職,比如我們的函數(shù)聲明可以放到一個建立的.h頭文件中,自定義的函數(shù)可以寫到一個新的.c文件中,游戲的運行以及測試可以放在第一個.c文件中。
那這樣下來我們的一個工程中就有以下的三個文件:
geme.h test.c geme.c———————————————————————————————————————————
?????????????????????????????????????????????test.c
在這個.c文件下我們可以先實現(xiàn)我們的游戲菜單:
我們可以在自定義一個函數(shù)void test(),這個函數(shù)是實現(xiàn)我們游戲的函數(shù):
上來我們可以使用do{}while();(實現(xiàn)重復(fù)玩游戲的功能)和switch語句來實現(xiàn),代碼:
#includevoid enmu()
{
printf("************************\n");
printf("*****1、三子棋游戲*******\n");
printf("*****0、退出游戲*********\n");
printf("************************\n");
}
void test()
{
int num1=0;
do
{
enmu();
printf("請選擇:\n");
scanf("%d",&num);
switch(num)
{
case 1:
printf("三子棋游戲\n");
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇有誤請重新輸入:\n");
break;
}
}while(num)
}
int main()
{
test();
return 0;
}
至此我們的菜單就完成了!邏輯通過switch語句也實現(xiàn)了!
———————————————————————————————————————————
? ?geme.c
接著我們可以寫 void game()函數(shù),在這個函數(shù)中我們可以先實現(xiàn)把棋盤打印出來(如圖所示棋盤):
我們從圖中可以看出我們實現(xiàn)這個棋盤只要一個二維數(shù)組便可以實現(xiàn)!
char board[ROW][COL]
其中 RWO和COL是我們定義的全局變量,這樣子的好處就是我們可以隨時修改棋盤的大小不僅僅局限于3*3的棋盤。
對此我們需要先實現(xiàn)這個棋盤即初始化,可以寫一個void int_board(char board[ROW][COL],int row,int col) 這么一個函數(shù)實現(xiàn)。( 其中的小寫的row和col對應(yīng)的是前面所說的全局變量ROW和COL)
代碼:
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] = ' ';
}
}
}
當(dāng)我們的棋盤初始完后,那我們就需要把棋盤打印到棋盤上面,我們同樣是定義一個函數(shù)void print_board(char board[ROW][COL],int row,int col)來打印棋盤:
不過在答應(yīng)這個棋盤之前,需要注意一些問題:
這么一個棋盤我們可以看到
第一行是這樣的:
是由空格%c空格|空格%c空格|空格%c空格組成的
那我們就可以把空格%c空格|作為一個單位來輸出,輸出用循環(huán)控制即可(但是需要注意的是最后一個單位是沒有|)
一個單位:*3
第二行是這樣的:
是由---|---|---組成的并且只是打印兩組
那我們就可以以---|為一個單位打?。ㄗ詈笠粋€單位是沒有|)
一個單位:
那我們上代碼:
void print_board(char board[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for(i=0;i|
接下里我們就需要解決兩個問題:第一個就是玩家下棋;第二個就是電腦下棋
首先我們先解決玩家下棋:
先定義一個函數(shù)void player_move(char board[ROW]COL[,int row,int col])
我們實現(xiàn)這個函數(shù)時候就需要想一些問題,就是你下的這個位置是不是空的,并且是在我們自己寫棋盤范圍內(nèi),不是空那我們就需要重新輸入(我們定義*號為玩家下的棋);還有就是下棋的位置是在數(shù)組中的,而面對玩家群體時,他們可不清楚上面是數(shù)組,所以我們就需要在數(shù)組的位置上+1
代碼:
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("請玩家下棋(輸入棋盤對應(yīng)的坐標(biāo)):>\n");
scanf_s("%d %d",&x,&y);
while (1)
{
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)已被占用,請重新輸入!\n");
}
}
else
{
printf("坐標(biāo)輸入錯誤,請重新輸入!\n");
}
}
}
接著就是電腦下棋:
同樣定義一個函數(shù):void computer_move(char board[ROW][COL],int row,int col)
對于電腦下棋我們也需要思考幾個問題,第一電腦下的位置是隨機的,并且也需要符合玩家下棋的條件。那么對于隨機值我們可以用rand和srand(srand這個函數(shù)還需要一個無符號返回值,這個返回值可以用time函數(shù)數(shù)解決)
這一對函數(shù)(需要包含頭文件:stdlib.h)來解決,可以設(shè)置定義一個整型變量來接收rand生成的隨機值,并且這個隨機值要在數(shù)組的范圍內(nèi),不然會造成數(shù)組越界的問題,對此我們只需要對這個隨機值進行取模3即可。
代碼:
void computer_move(char board[ROW][COL], int row, int col)
{
printf("電腦下棋:\n");
while (1)
{
int x = rand() % row;//0 1 2
int y = rand() % col;//0 1 2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
到這一步游戲已經(jīng)可以走起來了我們可以說以及完成這個游戲的百分之八十了,還有剩下的最后百分之二十,那這最后的百分之二十就是要去判斷這個游戲的輸贏了。
我們可以寫一個函數(shù)char is_win(char board[ROW][COL],int row,int col),通過這個函數(shù)的返回值去判斷誰贏,那么就有以下邏輯:
如果返回值是'*'則玩家贏
如果返回值是'#'則玩家贏
如果返回值是'P'則平局
如果返回值是'C'則游戲繼續(xù)
游戲獲勝可以參考前面的游戲規(guī)則
代碼:
char is_win(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][1]!=' ')
{
return board[i][1];
}
}
for (i = 0; i< row; i++) //判斷列是否贏
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//判斷對角線是否贏
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];
}
}
其實我們看我這段代碼后會發(fā)現(xiàn),沒有平局的情況,對于平局的情況我們其實需要另寫一個函數(shù)int is_full(char board[ROW][COL],int row,int col)的返回值在char is_win(char board[ROW][COL],int row,int col)函數(shù)中實現(xiàn)
代碼:
int is_full(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] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
{
return 1;
}
}
}
}
那完整的char is_win(char board[ROW][COL],int row,int col)函數(shù)如下:
int is_full(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] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
{
return 1;
}
}
}
}
char is_win(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][1]!=' ')
{
return board[i][1];
}
}
for (i = 0; i< row; i++) //判斷列是否贏
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//判斷對角線是否贏
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 'P';
}
}
至此,這個三子棋的小游戲就已經(jīng)完成了。
———————————————————————————————————————————————————————————
? ? ? ? ? ? ? ? ? ? game.h
這里就需要包含一下我們函數(shù)聲明:
#include#define ROW 3
#define COL 3
#include#includevoid 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);
完整程序:
game.c:
#define _CRT_SECURE_NO_WARANINGS 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)
{
int x = 0;
int y = 0;
printf("請玩家下棋(輸入棋盤對應(yīng)的坐標(biāo)):>\n");
scanf_s("%d %d",&x,&y);
while (1)
{
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)已被占用,請重新輸入!\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;//0 1 2
int y = rand() % col;//0 1 2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int is_full(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] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
{
return 1;
}
}
}
}
char is_win(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][1]!=' ')
{
return board[i][1];
}
}
for (i = 0; i< row; i++) //判斷列是否贏
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//判斷對角線是否贏
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 'P';
}
}
game.h:
#define _CRT_SECURE_NO_WARANINGS 1
#include#define ROW 3
#define COL 3
#include#includevoid 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);
test.c:
#define _CRT_SECURE_NO_WARANINGS 1
#include"game.h"
void menu()
{
printf("********************\n");
printf("*****1、play********\n");
printf("*****0、exit********\n");
printf("********************\n");
}
void game()
{
printf("***三子棋***\n");
char ret=' ';
char board[ROW][COL];
//先給定空棋盤的位置
init_board(board, ROW, COL);
//初始化并且打印棋盤
print_board(board, ROW, COL);
//玩家下棋
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//判斷輸贏 //可以讓is_win函數(shù)返回一個字符串判斷輸贏:
//玩家贏返回:* 電腦贏返回:# 平局返回:P 以及繼續(xù)游戲!
ret=is_win(board,ROW,COL);
if (ret == '*')
{
printf("恭喜你贏!\n");
break;
}
else if(ret=='#')
{
printf("抱歉你輸了!\n");
break;
}
else if (ret == 'P')
{
printf("平局!\n");
break;
}
else
{
printf("游戲繼續(xù)!\n");
}
//電腦下棋
computer_move(board,ROW,COL);
print_board(board, ROW, COL);
//判斷輸贏
ret = is_win(board, ROW, COL);
if (ret == '*')
{
printf("恭喜你贏!\n");
break;
}
else if (ret == '#')
{
printf("抱歉你輸了!\n");
break;
}
else if (ret == 'P')
{
printf("平局!\n");
break;
}
else
{
printf("游戲繼續(xù)!\n");
}
}
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("請輸入選項:>\n");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戲已退出!\n");
break;
default:
printf("輸入有誤請重新輸入:>\n");
}
} while (input);
}
int main()
{
//1、創(chuàng)建一個打印菜單的函數(shù)
//2、作為一個游戲我們首先是確定一點就是可以重復(fù)玩。
test();
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
新聞標(biāo)題:小游戲--->三子棋-創(chuàng)新互聯(lián)
文章URL:http://m.rwnh.cn/article8/dopiop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、搜索引擎優(yōu)化、定制開發(fā)、網(wǎng)站制作
聲明:本網(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)
猜你還喜歡下面的內(nèi)容