深圳專業(yè)網(wǎng)站制作費(fèi)用怎么建一個自己的網(wǎng)站
目錄
一、前言:
二、游戲規(guī)則:
三、游戲前準(zhǔn)備
四、游戲?qū)崿F(xiàn)
1、打印菜單
2、初始化棋盤
3、打印棋盤
4、布置雷
5、排雷
五、完整代碼
一、前言:
用C語言完成掃雷游戲?qū)τ诔鯇W(xué)者來說,難度并不是很大,而且通過編程這個小游戲,會讓你對函數(shù)調(diào)用,分支循環(huán),連續(xù)輸入等有很好的掌握,該過程并不涉及指針及以后的內(nèi)容。
二、游戲規(guī)則:
掃雷游戲規(guī)則十分簡單,比如9*9網(wǎng)格中,就是在81個網(wǎng)格中找到其中的10顆雷,并不被雷炸死。
三、游戲前準(zhǔn)備
我們?yōu)榱俗尨a更加簡潔,將代碼分成三個文件中編寫,如圖所示,在test.c文件中放主函數(shù),
在game.h中放所需的頭文件,在gam.c中放調(diào)用的函數(shù)。
四、游戲?qū)崿F(xiàn)
為了方便下面的講解,我先把主函數(shù)和頭文件放出來
#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10
void Initboard(char board[ROWS][COLS], int rows,int cols,char set);
void Printboard(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS],int row,int col);
void Finemine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
?game.h文件中放入頭文件,并定義全文所需的宏變量,這樣方便改動,比如本篇講述的是9*9網(wǎng)格的,你只需將定義的9改成其他數(shù)據(jù),就可以得到一個10*10或其他的網(wǎng)格
#include"game.h"
void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//第一步,初始化棋盤Initboard(mine, ROWS, COLS,'0');Initboard(show, ROWS, COLS,'*');//第二步,打印棋盤Printboard(show, ROW, COL);//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//第四步,排雷Finemine(mine, show, ROW, COL);
}
void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}
int main()
{int count = 0;srand((unsigned int)time(NULL));do{menu();printf("請輸入你的選擇:");scanf("%d", &count);switch (count){case 1:game();break;case 0:printf("你已選擇退出游戲\n");break;default:printf("這是一個不規(guī)范的選擇,請重新選擇\n");break;}} while (count);return 0;
}
通過主函數(shù),你應(yīng)該能看出來我們實(shí)現(xiàn)這個游戲的邏輯是先打印出菜單,告訴你不同的選擇,然后通過你的選擇來判斷是否進(jìn)入游戲,所以游戲大體分成以下幾步:
1、打印菜單
2、初始化棋盤
3、隨機(jī)布置十顆雷
5、打印棋盤
4、排雷
下面我們逐步實(shí)現(xiàn)這幾點(diǎn):
1、打印菜單
void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}
運(yùn)行后可以打印出菜單
2、初始化棋盤
在game()函數(shù)中,我們定義了兩個字符數(shù)組
char mine[ROWS][COLS];
char show[ROWS][COLS];
//第一步,初始化棋盤
Initboard(mine, ROWS, COLS,'0');
Initboard(show, ROWS, COLS,'*');
其中第一個數(shù)組是雷盤,布置雷在上面,第二個數(shù)組是展示的,告訴玩家游戲進(jìn)行情況,我們用0表示無雷,可以先把雷盤全部初始化為‘0’,展示盤全部初始化為‘*’
具體函數(shù)如下:
void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = set;}}
}
3、打印棋盤
在主函數(shù)中,我們就提到了初始化后打印棋盤,其實(shí)打印棋盤和布置雷兩步可以互換先后順序,但是這里打印棋盤還可以用來檢測上面初始化是否成功
//第二步,打印棋盤Printboard(show, ROW, COL);
代碼如下:
void Printboard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 0; i <=row; i++)printf("%d ", i);printf("\n");for (i = 1; i <= col; i++){printf("%d ", i);for (j = 1; j <= row; j++){printf("%c ", board[i][j]);}printf("\n");}
}
運(yùn)行后結(jié)果如下:
4、布置雷
//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//這步可以用來檢測雷是否布置成功,如果怕出錯可以用上
初始化棋盤之后,就要在雷盤中隨即找十個位置放雷,也就是說要放進(jìn)去十顆雷
void Setmine(char board[ROWS][COLS], int row, int show)
{int num = mine_count;while (num){int i = rand() % 9 + 1;int j = rand() % 9 + 1;if (board[i][j] == '0'){board[i][j] = '1';num--;}}
}
用‘1’表示雷,就是將mine數(shù)組中隨即找十個位置,將‘0’換成‘1’,表示在這里埋雷
5、排雷
排雷過程中只有兩種結(jié)果,一種是正好是雷,那么就會炸死,另一種則是不是雷,如果不是雷,我們應(yīng)該把它周圍有幾個雷判斷出來,不然幾乎不可能通關(guān)
代碼如下:
int lei_count(char mine[ROWS][COLS], int a, int b)
{int count = mine[a - 1][b - 1] + mine[a - 1][b] + mine[a - 1][b + 1] + mine[a][b - 1] + mine[a][b + 1]+ mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] - 8 * '0';return count;
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int a, b;int wulei = row * col - mine_count;while (wulei){printf("請輸入你要檢查的坐標(biāo):");scanf("%d %d", &a, &b);if (a > 0 && a <= row && b > 0 && b <= col){if (mine[a][b] == '1'){printf("抱歉,這是雷,你被炸死了\n");break;}else{//既然不是雷,那就統(tǒng)計(jì)雷的數(shù)量int count = lei_count(mine, a, b);show[a][b] = count + '0';Printboard(show, ROW, COL);wulei--;}}elseprintf("此坐標(biāo)不存在,請重新輸入\n");}
}
五、完整代碼
game.h
#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10
void Initboard(char board[ROWS][COLS], int rows,int cols,char set);
void Printboard(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS],int row,int col);
void Finemine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
test.c
#include"game.h"
void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//第一步,初始化棋盤Initboard(mine, ROWS, COLS,'0');Initboard(show, ROWS, COLS,'*');//第二步,打印棋盤Printboard(show, ROW, COL);//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//第四步,排雷Finemine(mine, show, ROW, COL);
}
void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}
int main()
{int count = 0;srand((unsigned int)time(NULL));do{menu();printf("請輸入你的選擇:");scanf("%d", &count);switch (count){case 1:game();break;case 0:printf("你已選擇退出游戲\n");break;default:printf("這是一個不規(guī)范的選擇,請重新選擇\n");break;}} while (count);return 0;
}
game.c
#include"game.h"
void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = set;}}
}
void Printboard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 0; i <=row; i++)printf("%d ", i);printf("\n");for (i = 1; i <= col; i++){printf("%d ", i);for (j = 1; j <= row; j++){printf("%c ", board[i][j]);}printf("\n");}
}
void Setmine(char board[ROWS][COLS], int row, int show)
{int num = mine_count;while (num){int i = rand() % 9 + 1;int j = rand() % 9 + 1;if (board[i][j] == '0'){board[i][j] = '1';num--;}}
}
int lei_count(char mine[ROWS][COLS], int a, int b)
{int count = mine[a - 1][b - 1] + mine[a - 1][b] + mine[a - 1][b + 1] + mine[a][b - 1] + mine[a][b + 1]+ mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] - 8 * '0';return count;
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int a, b;int wulei = row * col - mine_count;while (wulei){printf("請輸入你要檢查的坐標(biāo):");scanf("%d %d", &a, &b);if (a > 0 && a <= row && b > 0 && b <= col){if (mine[a][b] == '1'){printf("抱歉,這是雷,你被炸死了\n");break;}else{//既然不是雷,那就統(tǒng)計(jì)雷的數(shù)量int count = lei_count(mine, a, b);show[a][b] = count + '0';Printboard(show, ROW, COL);wulei--;}}elseprintf("此坐標(biāo)不存在,請重新輸入\n");}
}
用C語言解決掃雷游戲還是非常有意思的,上面這種還是最簡單的,還有許多有趣的東西值得探索,比如如何搞一個20*20的棋盤,或如何用遞歸的方法實(shí)現(xiàn)快速展開,如果想了解更多,點(diǎn)擊關(guān)注,去學(xué)習(xí)更多C語言的知識。