柚子快報(bào)激活碼778899分享:C語言——掃雷游戲
柚子快報(bào)激活碼778899分享:C語言——掃雷游戲
? ? ? ?掃雷游戲通常是一個(gè)由方格組成的區(qū)域內(nèi)進(jìn)行的,其中隨機(jī)分布著一定數(shù)量的地雷?。玩家的目標(biāo)是通過點(diǎn)擊方格來標(biāo)記出所有地雷的位置,同時(shí)避免自己點(diǎn)到地雷而導(dǎo)致游戲失敗。游戲開始時(shí),玩家通常只能看到一部分方格,而其余的方格則需要通過點(diǎn)擊來逐漸揭示其內(nèi)容(目前學(xué)的比較低級(jí)請(qǐng)見諒)。
?下面這個(gè)圖是網(wǎng)頁版掃雷的界面:
現(xiàn)在開始講解代碼:
? ? ? ?寫一個(gè)完整代碼首先都是從主函數(shù)開始(前面寫的游戲可以發(fā)現(xiàn)主函數(shù)的流程幾乎不變),do……while(一上來就先進(jìn)行菜單選擇),主函數(shù)包含菜單還有對(duì)菜單的輸入與選擇(這個(gè)沒什么難度,略寫),而且一般游戲都需要菜單,玩家才可以清楚了解和選擇。
void menu()
{
printf("**************************************\n");
printf("*********** 1.play ************\n");
printf("*********** 0.exit ************\n");
printf("**************************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("請(qǐng)輸入你的選擇:");
scanf("%d", &input);
switch (input)
{
case 1:game();
break;
case 0:printf("退出游戲?。?!\n");
break;
default:printf("選擇錯(cuò)誤,請(qǐng)重新選擇!??!\n");
break;
}
} while (input);
return 0;
}
? ? ? ?進(jìn)行選擇:這里為了后續(xù)的寫作當(dāng)然是要選1的,接著跳到game函數(shù)。?
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//PrintBoard(mine, ROW, COL);//這個(gè)不需要打印,不然就看著答案排雷了
PrintBoard(show, ROW, COL);
SetMine(mine, ROW, COL);
PrintBoard(mine, ROW, COL);
FindMine(show, mine, ROW, COL);
}
? ? ? ?掃雷游戲內(nèi)部需要兩個(gè)數(shù)組一個(gè)是屏幕顯現(xiàn)出來(show);另一個(gè)則是藏在我們背后(mine),這就是這個(gè)游戲的巧妙之處。而且這個(gè)數(shù)組顯現(xiàn)出來的是9X9的數(shù)組,但是玩游戲需要計(jì)算坐標(biāo)周圍一圈,假設(shè)想要檢驗(yàn)數(shù)組四條靠邊的坐標(biāo),計(jì)算坐標(biāo)一圈數(shù)組會(huì)越界這時(shí)需要數(shù)組都加二(即四條邊都加一)
#define ROW 9 #define COL 9
#define ROWS ROW+2 #define COLS COL+2
? ? ? ?一開始要對(duì)這兩個(gè)數(shù)組初始化,而且初始化時(shí)需要整個(gè)數(shù)組都初始化而不是只對(duì)顯現(xiàn)出來的數(shù)組初始化,不然后面會(huì)影響。show數(shù)組初始化沒什么要求,然而為了后面計(jì)算【至于為什么后面會(huì)提到】mine數(shù)組初始化為‘0’(即字符0)。這里有一個(gè)簡便的操作,就是數(shù)組設(shè)置為board,這樣不管是show還是mine只需要改變數(shù)組就可以調(diào)用初始化的這個(gè)函數(shù)。
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;
}
}
}
? ? ? ?接下來就是打印數(shù)組,單純只打印數(shù)組的話數(shù)坐標(biāo)有些困難,所以需要在數(shù)組前標(biāo)數(shù)字方便數(shù)數(shù),還需要分界線。
void PrintBoard(char board[ROWS][COLS], int row, int col)
{
printf("--------掃雷-------\n");
int i = 0;
int j = 0;
for (i = 0; i <= row; i++)
{
if (i != 0)
{
printf(" %d", i);
}
else
{
printf(" ");
}
}
printf("\n");
for (i = 0; i <= row; i++)
{
printf("--");
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d|", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
for (i = 0; i <= row; i++)
{
printf("--");
}
printf("\n\n");
}
? ? ? ?下面就到布置地雷,游戲分初級(jí),中級(jí),高級(jí)。我們就先簡單一點(diǎn)的設(shè)置10個(gè)地雷,然后就是隨機(jī)挑選坐標(biāo)(當(dāng)然是沒有地雷的坐標(biāo)中挑選啦),選中一個(gè)那對(duì)應(yīng)的地雷數(shù)要減少一個(gè),這樣才知道地雷是否符合標(biāo)準(zhǔn)。
#define EASY 10
void SetMine(char mine[ROWS][COLS], int row, int col)
{
srand((unsigned int)time(NULL));
int count = EASY;
while (count)
{
int a = rand() % row + 1;
int b = rand() % col + 1;
if (mine[a][b] == '0')
{
mine[a][b] = '1';
count--;
}
}
}
? ? ? ?最后就是重難點(diǎn)排查地雷,先要輸入你要排查的坐標(biāo),討論輸入的坐標(biāo)是否符合數(shù)組范圍,然后再看這個(gè)坐標(biāo)是否有地雷,如若有雷游戲結(jié)束且需要打印mine數(shù)組的地雷位置供玩家參考;相反沒有地雷的話需要打印周圍一圈地雷的數(shù)量,這個(gè)就是mine數(shù)組初始化為字符0的原因,數(shù)字0和字符0之間相差一個(gè)字符0,所以計(jì)算地雷數(shù)量只需將坐標(biāo)周圍的字符分別都減一個(gè)字符0再相加起來就是坐標(biāo)周圍一圈的地雷數(shù)量,show數(shù)組中是字符,所以地雷數(shù)量還需加一個(gè)字符0,在打印show數(shù)組就會(huì)出現(xiàn)地雷數(shù)。
? ? ? ?游戲的勝利是需要把所有的不是地雷的坐標(biāo)找出來才算勝利,所以需要累計(jì)排查的坐標(biāo)是否滿足總的坐標(biāo)減去地雷數(shù),當(dāng)然過程中不能有重復(fù)排查的坐標(biāo),不然滿足但還有坐標(biāo)沒有排查,這就不符合游戲規(guī)則。
int get_round_mine(char mine[ROWS][COLS], int x, int y)
{
int i = 0;
int j = 0;
int ch = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
ch = ch + (mine[i][j] - '0');
}
}
return ch;
}
void FindMine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < ROW * COL - EASY)
{
printf("請(qǐng)輸入你要排查的坐標(biāo):");
scanf("%d %d", &x, &y);
if (x > 0 && x <= ROW && y > 0 && y <= COL)
{
if (show[x][y] != '*')
{
printf("該坐標(biāo)已被排查過\n");
continue;
}
if (mine[x][y] == '1')
{
printf("踩到地雷,游戲結(jié)束?。?!\n");
PrintBoard(mine, ROW, COL);
break;
}
else
{
int n = get_round_mine(mine, x, y);
show[x][y] = n + '0';
PrintBoard(show, ROW, COL);
win++;
}
}
else
{
printf("輸入超過限制,無法檢測(cè)是否有地雷!\n");
}
}
if (win == ROW * COL - EASY)
{
printf("掃雷成功,你太厲害了吧!\n");
}
}
現(xiàn)在這個(gè)代碼還不是很好,和網(wǎng)頁版的還是有差距的。目前能力有限往后就不太會(huì)了,見諒。?
柚子快報(bào)激活碼778899分享:C語言——掃雷游戲
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。