在完成這個(gè)游戲之前,我們需要知道這個(gè)游戲的運(yùn)行過程即玩法~在這里我以最簡(jiǎn)單的99矩陣的掃雷模型為大家介紹。在這個(gè)游戲中,在99的矩陣中,我們首先要隨機(jī)布置一些雷(這里我們?cè)O(shè)為10個(gè)),然后玩家隨機(jī)排查雷,而若玩家翻開的坐標(biāo)下沒有雷,則會(huì)顯示出這個(gè)坐標(biāo)周圍位置中所含有的雷的個(gè)數(shù)。(此時(shí)就一定要利用好這個(gè)信息,而進(jìn)行下一步的排查哦)而若不幸翻開的坐標(biāo)就對(duì)應(yīng)雷,則就被炸死,游戲結(jié)束。
在這個(gè)游戲中我們也會(huì)用到三個(gè)文件,分別是
文件名 | 作用 |
---|---|
test.c | 測(cè)試游戲 |
game.h | 聲明游戲 |
game.c | 實(shí)現(xiàn)游戲 |
在進(jìn)入游戲時(shí),我們先會(huì)展現(xiàn)出目錄。之后進(jìn)入游戲,我們?cè)谶@里
①.需要?jiǎng)?chuàng)建兩個(gè)9*9的二維數(shù)組
②.將兩個(gè)數(shù)組均初始化
③.在第一個(gè)數(shù)組中埋雷
④.找到雷的位置
void menu()
{printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("******************\n");
}
void game()
{char mine[ROWS][COLS] = {0 };
char show[ROWS][COLS] = {0 };
InitBoard(mine, ROWS, COLS,'0');
InitBoard(show, ROWS, COLS,'*');
DisplayBoard(show, ROW, COL);
SetMine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);
FindMine(mine,show, ROW, COL);
}
void test()
{srand((unsigned int)time(NULL));
int input = 0;
do
{menu();
printf("請(qǐng)輸入:");
scanf("%d", &input);
switch (input)
{case 1:
//printf("開始游戲\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
break;
}
}
while (input);
}
int main()
{test();
return 0;
}
3.注意事項(xiàng)?在這里我們出現(xiàn)了未定義的ROW,COL以及ROWS,COLS。這是因?yàn)槲覀冊(cè)趃ame.h文件中聲明了它們,方便后續(xù)的修改。那么這里又有一個(gè)疑問就是,我們的游戲應(yīng)該是99的棋盤,而為什么我們創(chuàng)建的數(shù)組卻是1111的呢?
在這里可以看到,當(dāng)我們?nèi)ヅ挪檫吔缱鴺?biāo)的時(shí)候,我們按照我們想的應(yīng)該是排查周圍的八個(gè)坐標(biāo),但在這時(shí),若8個(gè)坐標(biāo)都去檢查一遍,就會(huì)面臨越界訪問的問題。則我們就考慮將這個(gè)數(shù)組的行和列都擴(kuò)大2,這樣就可以避免這個(gè)問題。
在這里我們要聲明
1.定義的ROW等
2.所用到的自定義函數(shù)
還要注意,由于其他兩個(gè)文件中均需要包含game.h這個(gè)文件,則我們將#include
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char mine[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row, int col);
四.game.c實(shí)現(xiàn)游戲💛這里我們需要實(shí)現(xiàn)的函數(shù)就是一中提到的。
①.需要?jiǎng)?chuàng)建兩個(gè)9*9的二維數(shù)組,一個(gè)用來布置雷的位置(用戶不可見),另一個(gè)用來向玩家展示,在這個(gè)數(shù)組中,每個(gè)位置對(duì)應(yīng)的數(shù)字就應(yīng)該是它周圍所有的雷的個(gè)數(shù)。
②.將兩個(gè)數(shù)組均初始化(這里的實(shí)現(xiàn)過程我們放到game.c中去實(shí)現(xiàn),在這里我們只是用它),我們可以將第一個(gè)隱藏的數(shù)組用 ‘ 0 ’來初始化,而當(dāng)我們?cè)谀硞€(gè)位置布置雷之后,這個(gè)位置就變成1。將第二個(gè)數(shù)組(會(huì)展示給玩家看的)用 ‘ * ’來初始化,當(dāng)用戶排查的不是雷時(shí),將這個(gè)坐標(biāo)表示為周圍所含有的雷的個(gè)數(shù)。
③.在第一個(gè)數(shù)組中埋雷,我們隨機(jī)產(chǎn)生十個(gè)坐標(biāo),將這些坐標(biāo)均改為1,即表示這些坐標(biāo)下有雷。
④.找到雷的位置
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;
int j = 0;
for (i = 0; i< rows; i++)
{for (j = 0; j< cols; j++)
{ board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;
int j = 0;
printf("-------掃雷游戲-------\n");
for (j = 0; j<= col; j++)
{printf("%d ", j);
}
printf("\n");
for (i = 1; i<= row; i++)
{printf("%d ", i);
for (j = 1; j<= col; j++)
{ printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-------掃雷游戲-------\n");
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;
while (count)
{int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{ mine[x][y] = '1';
count--;
}
}
}
int get_mine_count(char mine[ROWS][COLS],int x,int y)
{return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{int x = 0;
int y = 0;
int win = 0;
while (win< (row * col) - EASY_COUNT)
{printf("請(qǐng)輸入排雷坐標(biāo)\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x<= row && y >= 1 && y<= col)
{ if (show[x][y] != '*')
{ printf("該坐標(biāo)被排查過了\n");
continue;
}
if (mine[x][y] == '1')
{ printf("很遺憾,你被炸死了\n");
DisplayBoard(mine, ROW,COL);
break;
}
else
{ int n = get_mine_count(mine, x, y);
show[x][y] = n + '0';
DisplayBoard(show, ROW,COL);
win++;
}
}
else
{ printf("輸入的坐標(biāo)非法,請(qǐng)重新輸入\n");
}
}
if (win == (row * col - EASY_COUNT))
{printf("恭喜你排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
🐱🐱🐱以上就是我們這篇的全部?jī)?nèi)容啦~希望大家可以學(xué)會(huì),自己敲一遍效果更佳呀!希望大家可以多多關(guān)注我,一起學(xué)習(xí)一起進(jìn)步,我也會(huì)為大家?guī)砀嘤杏玫牟┛停。。?😆 😆 😆
你是否還在尋找穩(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)查看詳情吧