本篇文章為大家展示了利用C語(yǔ)言編寫(xiě)一個(gè)掃雷游戲,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
C語(yǔ)言是一門(mén)面向過(guò)程的、抽象化的通用程序設(shè)計(jì)語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā),使用C語(yǔ)言可以以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器。
主要思路:建立兩個(gè)11乘以11的表格,分別為布雷和排雷后的表格,其中我們以字符1表示此處有雷,字符0表示此處無(wú)雷,在布雷時(shí)我們用時(shí)間函數(shù)布置隨機(jī)的10個(gè)雷(具體多少個(gè)雷可自行選擇),在另一個(gè)表格中顯示出所選位置周?chē)椎膫€(gè)數(shù)
建立11*11的表格是因?yàn)楸阌诮y(tǒng)計(jì)四條邊上位置周?chē)椎膫€(gè)數(shù)
用vs建立頭文件game.n和兩個(gè)源文件game.c和test.c
(先分開(kāi)講解,在文章最后有三個(gè)文件的整體顯示)
在頭文件中的聲明有
#include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY 10
time.h和stdlib.h 文件是time.h的庫(kù)函數(shù)
ROW表示行,COL表示列,ROWS表示11列,COLS表示11行,EASY表示(簡(jiǎn)單程度)雷有10個(gè)
首先在test.c文件中建立主函數(shù)
int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); switch (input) { case 1: game();//實(shí)現(xiàn)游戲的過(guò)程 break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n"); break; } } while (input); return 0; }
其中 srand((unsigned int)time(NULL)) 是為了能夠在使用rand函數(shù)時(shí)每次產(chǎn)生不同的隨機(jī)數(shù)
其中包含兩個(gè)函數(shù),分別為菜單函數(shù)menu()和實(shí)現(xiàn)游戲的函數(shù)game()
菜單函數(shù)為
void menu() { printf("************************\n"); printf("***** 1.play *********\n"); printf("***** 0.exit *********\n"); printf("************************\n"); }
主函數(shù)中整形input為輸入的數(shù)字,1進(jìn)行游戲,0退出游戲
進(jìn)行的游戲函數(shù)為
void game() { //創(chuàng)建棋盤(pán)對(duì)應(yīng)的數(shù)組 char mine[ROWS][COLS];//布置好的雷的信息 char show[ROWS][COLS];//排查出雷的信息 //初始化棋盤(pán) initboard(mine, ROWS, COLS, '0'); initboard(show, ROWS, COLS, '*'); //打印棋盤(pán) //displayboard(mine, ROW, COL); displayboard(show, ROW, COL); //布置雷 setmine(mine, ROW, COL, EASY); //displayboard(mine, ROW, COL); //排雷 finemine(mine, show, ROW, COL); }
1、創(chuàng)建棋盤(pán)
在游戲函數(shù)中我們首先創(chuàng)建兩個(gè)11乘以11的棋盤(pán),布置雷的棋盤(pán)為mine[ROWS][COLS],在玩家面前顯示的棋盤(pán)為show[ROWS][COLS]
2、初始化棋盤(pán)
在布置雷的棋盤(pán)中全部填寫(xiě)字符0,在玩家顯示的棋盤(pán)面前全部填寫(xiě)為字符*,
頭文件中聲明
//初始化棋盤(pán) void initboard(char board[ROWS][COLS], int rows, int cols,char set);
game.c中具體寫(xiě)出函數(shù)
void initboard(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } }
3、打印棋盤(pán)
頭文件聲明
//打印棋盤(pán) void displayboard(char board[ROWS][COLS], int row, int col);
game.c中具體寫(xiě)出函數(shù)
//打印棋盤(pán) void displayboard(char board[ROWS][COLS], int row, int col) { int i = 0, j = 0; printf("-----------掃雷游戲-------------\n"); for (i = 0; i <= col; i++) printf("%d ", i); 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"); }
4、布置雷
將mine函數(shù)布置出雷
頭文件
//布置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count);
count為計(jì)數(shù)器,計(jì)算布置雷的個(gè)數(shù),初始值為EASY,在頭文件中設(shè)置為10
game.c中的函數(shù)
//布置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count) { while (count) { int x = rand() % row + 1; //模9為0到8 int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } }
rand函數(shù)產(chǎn)生隨機(jī)數(shù),模上row(9)后的數(shù)為0到8,加上1為1到9的數(shù),棋盤(pán)本為11*11,但我們填充雷在1~9行,1到9列
5、排雷并且在玩家面前顯示出棋盤(pán)
頭文件
//排雷 void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c中的函數(shù)
//統(tǒng)計(jì)x,y坐標(biāo)周?chē)椎膫€(gè)數(shù) int getmine(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y-1] + mine[x-1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'; } //排雷+打印排雷后的棋盤(pán) void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int win = 0; while (win<ROW*COL-EASY) { printf("請(qǐng)輸入要排查雷的坐標(biāo):>"); int x, y; scanf("%d%d", &x, &y); //坐標(biāo)合法性 //坐標(biāo)是不是雷,不是雷,統(tǒng)計(jì)周?chē)椎膫€(gè)數(shù) if (x >= 1 && x <= row&&y >= 1 &&y <= col) { if (mine[x][y]=='1') { printf("很遺憾,你被炸死了\n"); displayboard(mine, row, col); break; } else { //坐標(biāo)不是雷,統(tǒng)計(jì)雷的個(gè)數(shù) int count = getmine(mine, x, y); show[x][y] = count+'0';//數(shù)字加上字符0為字符數(shù)字,轉(zhuǎn)化為字符數(shù)字,因?yàn)榇蛴〉臑樽址? displayboard(show, row, col); //打印排雷后的棋盤(pán) win++; } } else { printf("坐標(biāo)非法,重新輸入!\n"); } } if (win == ROW*COL - EASY) { printf("恭喜你,排雷成功\n"); displayboard(mine, row, col); } }
win為已排查出非雷的個(gè)數(shù)
判斷非雷位置周?chē)?個(gè)位置有雷的個(gè)數(shù)只需要將周?chē)?個(gè)位置中的字符相加再減去8個(gè)0的ascll值,因?yàn)?個(gè)位置中有雷的位置即為字符1,將8個(gè)位置的字符相加轉(zhuǎn)化為實(shí)際的數(shù)字,即為雷的個(gè)數(shù),當(dāng)排除出的非雷的個(gè)數(shù)為ROWSCOLS-EASY(99-10)時(shí),即掃雷成功
game.h中完整文件為
#include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY 10 //初始化棋盤(pán) void initboard(char board[ROWS][COLS], int rows, int cols,char set); //打印棋盤(pán) void displayboard(char board[ROWS][COLS], int row, int col); //布置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count); //排雷 void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c中完整文件為
#define _CRT_SECURE_NO_WARNINGS #include"game.h" //初始化棋盤(pán) void initboard(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } } //打印棋盤(pán) void displayboard(char board[ROWS][COLS], int row, int col) { int i = 0, j = 0; printf("-----------掃雷游戲-------------\n"); for (i = 0; i <= col; i++) printf("%d ", i); 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) { while (count) { int x = rand() % row + 1; //模9為0到8 int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } //統(tǒng)計(jì)x,y坐標(biāo)周?chē)椎膫€(gè)數(shù) int getmine(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y-1] + mine[x-1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'; } //排雷+打印排雷后的棋盤(pán) void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int win = 0; while (win<ROW*COL-EASY) { printf("請(qǐng)輸入要排查雷的坐標(biāo):>"); int x, y; scanf("%d%d", &x, &y); //坐標(biāo)合法性 //坐標(biāo)是不是雷,不是雷,統(tǒng)計(jì)周?chē)椎膫€(gè)數(shù) if (x >= 1 && x <= row&&y >= 1 &&y <= col) { if (mine[x][y]=='1') { printf("很遺憾,你被炸死了\n"); displayboard(mine, row, col); break; } else { //坐標(biāo)不是雷,統(tǒng)計(jì)雷的個(gè)數(shù) int count = getmine(mine, x, y); show[x][y] = count+'0';//數(shù)字加上字符0為字符數(shù)字,轉(zhuǎn)化為字符數(shù)字,因?yàn)榇蛴〉臑樽址? displayboard(show, row, col); //打印排雷后的棋盤(pán) win++; } } else { printf("坐標(biāo)非法,重新輸入!\n"); } } if (win == ROW*COL - EASY) { printf("恭喜你,排雷成功\n"); displayboard(mine, row, col); } }
test.c完整文件為
#define _CRT_SECURE_NO_WARNINGS #include "game.h" void menu() { printf("************************\n"); printf("***** 1.play *********\n"); printf("***** 0.exit *********\n"); printf("************************\n"); } void game() { //創(chuàng)建棋盤(pán)對(duì)應(yīng)的數(shù)組 char mine[ROWS][COLS];//布置好的雷的信息 char show[ROWS][COLS];//排查出雷的信息 //初始化棋盤(pán) initboard(mine, ROWS, COLS, '0'); initboard(show, ROWS, COLS, '*'); //打印棋盤(pán) //displayboard(mine, ROW, COL); displayboard(show, ROW, COL); //布置雷 setmine(mine, ROW, COL, EASY); //displayboard(mine, ROW, COL); //排雷 finemine(mine, show, ROW, COL); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); switch (input) { case 1: game();//實(shí)現(xiàn)游戲的過(guò)程 break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n"); break; } } while (input); return 0; }
上述內(nèi)容就是利用C語(yǔ)言編寫(xiě)一個(gè)掃雷游戲,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁(yè)題目:利用C語(yǔ)言編寫(xiě)一個(gè)掃雷游戲-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://www.aaarwkj.com/article22/dsdojc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、定制開(kāi)發(fā)、網(wǎng)站排名、App開(kāi)發(fā)、小程序開(kāi)發(fā)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容