您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)C語(yǔ)言實(shí)現(xiàn)掃雷游戲的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
先明確要做什么,選擇合適的語(yǔ)句來(lái)對(duì)想法進(jìn)行實(shí)現(xiàn):
test.c void menu() { printf("*******************\n"); printf("***** 1.play ****\n"); printf("***** 0.exit ****\n"); printf("*******************\n"); } void test() { int input = 0; do { menu(); printf("請(qǐng)選擇:"); scanf("%d",&input); switch (input) { case 1: //掃雷 break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); } int main() { test(); return 0; }
在game函數(shù)重創(chuàng)新建。在test()函數(shù)中case1: 下調(diào)用game。
case 1: //掃雷 game();
這里我們要明白,我們游戲中雷是提前布置好的,呈現(xiàn)在我們眼前的場(chǎng)景是經(jīng)過(guò)遮掩的,那么我們創(chuàng)建兩個(gè)場(chǎng)景,mine 和 show,且都是二維數(shù)組。
在掃雷的時(shí)候我們要計(jì)算輸入坐標(biāo)周圍一圈有沒有雷,因此我們要考慮在邊界坐標(biāo)的越界問題,因此若展現(xiàn)在面前的是x*y的數(shù)組,那么實(shí)際數(shù)組的大小應(yīng)該是(x+2)*(y+2)的大小。
為了改變場(chǎng)景大小方便,我們創(chuàng)建行列時(shí)采用宏定義(在game.h)中。
game.h #include <stdio.h> //為玩家展現(xiàn)的場(chǎng)景大小 #define ROW 9 #define COL 9 //場(chǎng)景真實(shí)大小 防越界 #define ROWS ROW+2 #define COLS COL+2 //函數(shù)聲明 void initboard(char board[ROWS][COLS], int rows, int cols, char set); //初始化
game.c //函數(shù)定義 void initboard(char board[ROWS][COLS], int rows, int cols, char set) //初始化場(chǎng)景 { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; //set接收 test.h 中傳來(lái)的字符 } } }
test.c void game() { //創(chuàng)建數(shù)組 char mine[ROWS][COLS] = { 0 }; //布置雷 char show[ROWS][COLS] = { 0 }; //排查雷 //初始化mine數(shù)組為全'0' initboard(mine,ROWS,COLS,'0'); //初始化show數(shù)組為全'*' initboard(show, ROWS, COLS, '*'); }
game.h #include <stdio.h> //為玩家展現(xiàn)的場(chǎng)景大小 #define ROW 9 #define COL 9 //場(chǎng)景真實(shí)大小 防越界 #define ROWS ROW+2 #define COLS COL+2 //函數(shù)聲明 void initboard(char board[ROWS][COLS], int rows, int cols, char set); //初始化 void displayboard(char board[ROWS][COLS], int row, int col); //打印場(chǎng)景
game.c void displayboard(char board[ROWS][COLS ], int row, int col) //打印場(chǎng)景 { int i = 0; int j = 0; for (i=0;i<=col;i++) { printf("%d ",i); //打印列號(hào) 為了方便玩家快速輸入坐標(biāo) } printf("\n"); //換行打印場(chǎng)景 for (i= 1; i <= row; i++) { printf("%d ",i); //打印行號(hào) 為了方便玩家快速輸入坐標(biāo) for (j = 1; j <= col; j++) { printf("%c ",board[i][j]); } printf("\n"); //每行打印完記得換行 } }
test.c void game() { //創(chuàng)建數(shù)組 char mine[ROWS][COLS] = { 0 };//布置雷 char show[ROWS][COLS] = { 0 };//排查雷 //初始化mine數(shù)組為全'0' initboard(mine,ROWS,COLS,'0'); //初始化show數(shù)組為全'*' initboard(show, ROWS, COLS, '*'); //打印棋盤 displayboard(show,ROW,COL); displayboard(mine, ROW, COL); }
打印如下:
注:玩游戲時(shí)只打印 show 的場(chǎng)景。
game.h #include <stdio.h> #include <stdlib.h> //隨機(jī)埋雷,要用到隨機(jī)數(shù) #include <time.h> //為玩家展現(xiàn)的場(chǎng)景大小 #define ROW 9 #define COL 9 //場(chǎng)景真實(shí)大小 防越界 #define ROWS ROW+2 #define COLS COL+2 //函數(shù)聲明 void initboard(char board[ROWS][COLS], int rows, int cols, char set); //初始化 void displayboard(char board[ROWS][COLS], int row, int col); //打印場(chǎng)景 void setmine(char mine[ROWS][COLS],int row, int col); //布置雷
game.c void setmine(char mine[ROWS][COLS], int row, int col) //布置雷 { int count = 10; while (count) //循環(huán)10次,放10個(gè)雷 { int x = rand() % row + 1; //0~9 int y = rand() % col + 1; //0~9 if (mine[x][y] == '0') //判斷這個(gè)位置有沒有放雷 { mine[x][y] = '1'; //雷為'1' count--; } } }
test.c void game() { //創(chuàng)建數(shù)組 char mine[ROWS][COLS] = { 0 };//布置雷 char show[ROWS][COLS] = { 0 };//排查雷 //初始化mine數(shù)組為全'0' initboard(mine,ROWS,COLS,'0'); //初始化show數(shù)組為全'*' initboard(show, ROWS, COLS, '*'); //打印棋盤 //displayboard(show,ROW,COL); //displayboard(mine, ROW, COL); //布置雷 setmine(mine,ROW,COL); displayboard(show, ROW, COL); //埋完雷后將 show 打印出來(lái),準(zhǔn)備下一步進(jìn)行排雷 }
埋雷這里要用到隨機(jī)數(shù),不要忘了提前使用 srand() 噢
game.h #include <stdio.h> #include <stdlib.h> //隨機(jī)埋雷,要用到隨機(jī)數(shù) #include <time.h> //為玩家展現(xiàn)的場(chǎng)景大小 #define ROW 9 #define COL 9 //場(chǎng)景真實(shí)大小 防越界 #define ROWS ROW+2 #define COLS COL+2 //函數(shù)聲明 void initboard(char board[ROWS][COLS], int rows, int cols, char set); //初始化 void displayboard(char board[ROWS][COLS], int row, int col); //打印場(chǎng)景 void setmine(char mine[ROWS][COLS],int row, int col); //布置雷 void findmine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col); //排雷
這里注意,我們同時(shí)接收 mine 和 show 數(shù)組,用 int row, int col 來(lái)使兩個(gè)場(chǎng)景有鏈接關(guān)系
game.h int get_mine(char mine[ROWS][COLS],int x,int y) //找雷數(shù),該函數(shù)在排雷函數(shù)里使用,直接在 // findmine 外定義即可 { return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + //這8個(gè)坐標(biāo)為x,y周圍一圈 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'; // '數(shù)字' - '0' = 數(shù)字 } 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-10) //判斷雷是否排完 { printf("請(qǐng)輸入要排查的坐標(biāo):"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row&&y >= 1 && y <= col) //判斷坐標(biāo)是否在可視范圍 { //判斷 if (mine[x][y] == '1') //踩雷 { printf("很遺憾,你被炸死了!\n"); displayboard(mine, ROW, COL); break; } else //不是雷 { //計(jì)算x,y坐標(biāo)周圍的雷 int n = get_mine(mine, x, y); //求周圍一圈雷的個(gè)數(shù) if (n != 0) show[x][y] = n + '0'; //并將個(gè)數(shù)通過(guò) show 場(chǎng)景顯示出來(lái) displayboard(show, ROW, COL); //打印 show win++; } } else { printf("輸入坐標(biāo)非法,無(wú)法排雷,請(qǐng)重新輸入:\n"); } } if (win == row*col - 10) { printf("排雷成功\n"); displayboard(mine, ROW, COL); } }
注:數(shù)字 + '0' = '數(shù)字' 詳細(xì)參考ASCII碼表
二進(jìn)制 字符
48 '0'
49 '1'
50 '2'
51 '3'
52 '4'
53 '5'
54 '6'
55 '7'
56 '8'
57 '9'
這樣簡(jiǎn)單版本的掃雷就完成了。
注:頭文件stdio.h在game.c和test.c里面都要引用,我們將stdio.h放入game.h里面,直接用雙引號(hào)引用game.h。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 //函數(shù)聲明 void initboard(char board[ROWS][COLS], int rows, int cols, char set);//初始化 void displayboard(char board[ROWS][COLS], int row, int col); //打印場(chǎng)景 void setmine(char mine[ROWS][COLS],int row, int col); //布置雷 void findmine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col); //排雷
#include "game.h" void initboard(char board[ROWS][COLS], int rows, int cols, char set) //初始化場(chǎng)景 { 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) //打印場(chǎng)景 { int i = 0; int j = 0; for (i=0;i<=col;i++) { printf("%d ",i); //打印列號(hào) } printf("\n"); for (i= 1; i <= row; i++) { printf("%d ",i); //打印行號(hào) for (j = 1; j <= col; j++) { printf("%c ",board[i][j]); } printf("\n"); } } void setmine(char mine[ROWS][COLS], int row, int col) //布置雷 { int count = 10; 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(char mine[ROWS][COLS],int x,int y) //找雷數(shù) { 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-10) { printf("請(qǐng)輸入要排查的坐標(biāo):"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row&&y >= 1 && y <= col) { //判斷 if (mine[x][y] == '1') { printf("很遺憾,你被炸死了!\n"); displayboard(mine, ROW, COL); break; } else { //計(jì)算x,y坐標(biāo)周圍的雷 int n = get_mine(mine, x, y); if (n != 0) show[x][y] = n + '0'; displayboard(show, ROW, COL); win++; } } else { printf("輸入坐標(biāo)非法,無(wú)法排雷,請(qǐng)重新輸入:\n"); } } if (win == row*col - 10) { printf("排雷成功\n"); displayboard(mine, ROW, COL); } }
#include "game.h" void game() { //創(chuàng)建數(shù)組 char mine[ROWS][COLS] = { 0 };//布置雷 char show[ROWS][COLS] = { 0 };//排查雷 //初始化mine數(shù)組為全'0' initboard(mine,ROWS,COLS,'0'); //初始化show數(shù)組為全'*' initboard(show, ROWS, COLS, '*'); //打印棋盤 //displayboard(show,ROW,COL); //displayboard(mine, ROW, COL); //布置雷 setmine(mine,ROW,COL); //displayboard(mine, ROW, COL); displayboard(show, ROW, COL); //排雷 findmine(mine,show, ROW, COL); } void menu() { printf("*******************\n"); printf("***** 1.play ****\n"); printf("***** 0.exit ****\n"); printf("*******************\n"); } void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請(qǐng)選擇:"); scanf("%d",&input); switch (input) { case 1: //掃雷 game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); } int main() { test(); return 0; }
實(shí)戰(zhàn)如下:
對(duì)了,對(duì)埋雷函數(shù)我們還可以進(jìn)行優(yōu)化,將雷的個(gè)數(shù)進(jìn)行宏定義放在game.h里,方便修改雷的數(shù)量。
優(yōu)化到下個(gè)版本時(shí)會(huì)一起修改的
感謝各位的閱讀!關(guān)于“C語(yǔ)言實(shí)現(xiàn)掃雷游戲的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。