C語言數(shù)組超詳細(xì)講解下篇掃雷
前言
本文接著復(fù)習(xí)前面所學(xué)知識(shí),以掃雷游戲?yàn)槔?/p>
1、掃雷是什么?
百度百科:《掃雷》是一款大眾類的益智小游戲,于1992年發(fā)行。游戲目標(biāo)是在最短的時(shí)間內(nèi)根據(jù)點(diǎn)擊格子出現(xiàn)的數(shù)字找出所有非雷格子,同時(shí)避免踩雷,踩到一個(gè)雷即全盤皆輸。
2、程序框架
程序整體的框架可以搬用上篇三子棋的,這種框架也可以當(dāng)作一種通用的形式,加以運(yùn)用。
2.1 主函數(shù)
int main() { int input = 0; srand((unsigned int)time(NULL));//產(chǎn)生隨機(jī)數(shù) do { menu();//菜單提示 printf("請(qǐng)輸入 ==> ");//輸入1或0, scanf("%d", &input); switch (input)//根據(jù)輸入選擇是否玩游戲 { case 1: game();//玩游戲的具體實(shí)現(xiàn) break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯(cuò)誤,重新選擇!\n"); break; } } while (input); return 0; }
2.2 函數(shù)menu
輸出提示菜單,提醒玩家,1是玩游戲,0是退出游戲
void menu() { printf("******************************\n"); printf("********* 1. play ********\n"); printf("********* 0. exit ********\n"); printf("******************************\n"); }
2.3 函數(shù)game
數(shù)組mine,初始化后放入字符 ‘0’
- mine數(shù)組后續(xù)放入10個(gè)雷,有雷的位置用字符 ‘1’ 表示,沒有雷的位置仍然是字符 ‘0’
- 10個(gè)雷的位置隨機(jī)生成
數(shù)組show,初始化后放入字符 ‘*’
- 字符 ‘*’ 是將生成雷的位置遮擋住,不讓玩家看見
- show數(shù)組放入棋盤中關(guān)于具體坐標(biāo)周圍的雷的信息
- 如果坐標(biāo)周圍有雷,將統(tǒng)計(jì)雷的個(gè)數(shù),并顯示在這個(gè)坐標(biāo)上
void game() { printf("開始玩游戲!\n"); //掃雷游戲的實(shí)現(xiàn) //mine數(shù)組是用來存放布置好的雷的信息 //就10個(gè)雷在什么位置 char mine[ROWS][COLS] = { 0 };//'0' //show數(shù)組是用來存放排查出的雷的信息 //坐標(biāo)周圍有幾個(gè)雷 char show[ROWS][COLS] = { 0 };//'*' //初始化棋盤 init_board(mine, ROWS, COLS, '0'); init_board(show, ROWS, COLS, '*'); //打印棋盤 //show_board(mine, ROW, COL);//全是字符'0' //show_board(mine, ROW, COL);//全是'*' //布置雷 set_mine(mine, ROW, COL);//雷的數(shù)組 //show_board(mine, ROW, COL);這是顯示10個(gè)雷在哪里 show_board(show, ROW, COL);//輸出*暫時(shí)掩蓋雷在哪里 //排查雷 find_mine(mine, show, ROW, COL); }
2.3.1 函數(shù)init_board
init_board初始化參數(shù)是將棋盤初始化,讓整個(gè)棋盤顯示字符 ‘0’ 和 ‘*’
//初始化棋盤 參數(shù):行數(shù) 列數(shù) 行數(shù) 列數(shù) 字符0或* void init_board(char arr[ROWS][COLS], int rows, int cols, char set) {//set表示初始化傳進(jìn)來的字符是0 還是 * int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { arr[i][j] = set; } } }
2.3.2 函數(shù)show_board
show_board是展示棋盤的,可以看到棋盤里面雷的信息,以及后續(xù)掃雷時(shí),棋盤的具體狀態(tài)
//展示棋盤 void show_board(char arr[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf("------------掃雷------------\n"); for (i = 0; i <= col; i++) { printf("%d ", i);//列號(hào),棋盤首先打印列數(shù) } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i);//行前面的數(shù)字,行號(hào) for (j = 1; j <= col; j++) { printf("%c ", arr[i][j]);//打印棋盤每個(gè)元素 } printf("\n"); } printf("------------掃雷------------\n"); }
2.3.3 函數(shù)set_mine
函數(shù)set_mine是布置雷的,會(huì)在棋盤內(nèi)隨機(jī)在10個(gè)坐標(biāo)位置產(chǎn)生雷
//布置雷 void set_mine(char mine[ROWS][COLS], int row, int col) { int count = EASY_COUNT;//布置10個(gè)雷 int x = 0;//行坐標(biāo) int y = 0;//列坐標(biāo) while (count)//直到10個(gè)雷布置完成,退出循環(huán) { x = rand() % row + 1;//取模是0-8,加1就是1-9 y = rand() % col + 1; if (mine[x][y] == '0')//是空的,就放雷,否則重新隨機(jī)產(chǎn)生坐標(biāo)位置 { mine[x][y] = '1';//布置雷 count--; } } }
2.3.4 函數(shù)find_mine
函數(shù)find_mine是排查雷,每次玩家排雷都先輸入一個(gè)坐標(biāo),然后判斷坐標(biāo)上的字符是否為1:
- 1為雷,游戲結(jié)束
- 不是1,統(tǒng)計(jì)坐標(biāo)周圍8個(gè)位置雷的個(gè)數(shù),以字符放入形式顯示在坐標(biāo)上
//排查雷 void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0;//代表玩家排雷的次數(shù) while (win < row*col - EASY_COUNT)//小于雷的個(gè)數(shù),說明雷還沒排完 { printf("請(qǐng)輸入要排查的坐標(biāo) ==> "); scanf("%d %d", &x, &y);//玩家輸入坐標(biāo) if (x >= 1 && x <= row && y >= 1 && y <= col)//在1-9的坐標(biāo)范圍內(nèi) { if (mine[x][y] == '1')//確定坐標(biāo)為字符'1',就是雷 { printf("很遺憾,被炸死了\n"); show_board(mine, ROW, COL);//顯示所有雷的位置 break; } else//不是字符1,坐標(biāo)就不是雷,顯示坐標(biāo)周圍有雷的個(gè)數(shù) { int count = get_mine_count(mine, x, y);//函數(shù)計(jì)算類的個(gè)數(shù) show[x][y] = count + '0';//周圍有雷的個(gè)數(shù)+'0'就轉(zhuǎn)換成字符了 show_board(show, ROW, COL);//打印出來,每次掃雷后的棋盤 win++;//掃了一次雷就++ } } else//超過坐標(biāo)范圍 { printf("坐標(biāo)非法,重新輸入\n"); } } if (win == row * col - EASY_COUNT)//掃雷次數(shù)==9*9-10 71次就結(jié)束 { printf("恭喜你,排雷成功\n"); show_board(mine, ROW, COL);//顯示雷的信息 } }
2.3.5 函數(shù)get_mine_count
函數(shù)get_mine_count統(tǒng)計(jì)雷的個(gè)數(shù):
- 字符 ’1‘代表有雷,字符 ’0‘代表沒有, ’1‘- ’0‘為數(shù)字1,代表1個(gè)雷
- 坐標(biāo)周圍8個(gè)坐標(biāo)上的字符相加 - 8 * ‘0’,結(jié)果就是有雷的個(gè)數(shù),是整形
//統(tǒng)計(jì)坐標(biāo)周圍有雷的個(gè)數(shù) int get_mine_count(char mine[ROWS][COLS], int x, int y) {//坐標(biāo)周圍的8個(gè)地方減去'0',再相加的個(gè)數(shù)就是類的個(gè)數(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'; }
3、頭文件.h
#include <stdio.h> #include <stdlib.h>//庫函數(shù) #include <time.h>//與系統(tǒng)時(shí)間相關(guān) #define ROW 9//棋盤真實(shí)的行數(shù) #define COL 9 #define ROWS ROW+2 //棋盤放大范圍,便于棋盤邊的位置遍歷 #define COLS COL+2 #define EASY_COUNT 10 //10個(gè)雷的個(gè)數(shù) //初始化 void init_board(char arr[ROWS][COLS], int rows, int cols, char set); //打印 void show_board(char arr[ROWS][COLS], int row, int col); //布置雷 void set_mine(char mine[ROWS][COLS], int row, int col);
4、游戲試玩
運(yùn)行結(jié)果見下圖,基本滿足了游戲功能。
完整代碼放在gitee中:
總結(jié)
本文只涉及了較為基礎(chǔ)的掃雷游戲,等后面學(xué)習(xí)更復(fù)雜的知識(shí)后,可以對(duì)掃雷游戲進(jìn)行完善。掃雷游戲整體編寫思路完全可以參考三子棋來實(shí)現(xiàn)。
到此這篇關(guān)于C語言數(shù)組超詳細(xì)講解下篇掃雷的文章就介紹到這了,更多相關(guān)C語言 三子棋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Windows C++ 應(yīng)用程序通用日志組件的使用詳解
眾所周知,在調(diào)試、跟蹤和執(zhí)行應(yīng)用程序的過程中,程序的日志能為這些工作提供大量有價(jià)值的運(yùn)行信息。因此,程序的日志對(duì)應(yīng)用程序的運(yùn)行、維護(hù)至關(guān)重要2013-05-05Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解
Prim算法能夠在帶權(quán)的圖中搜索出最小生成樹,這也是各大ACM和面試及考研題目中的熱點(diǎn),下面我們就來詳細(xì)看一下Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解2016-06-06C++實(shí)現(xiàn)簡(jiǎn)單班級(jí)成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單班級(jí)成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02詳解C++中vector的理解以及模擬實(shí)現(xiàn)
vector是表示可變大小數(shù)組的序列容器。這篇文章主要為大家詳細(xì)介紹了vector的理解以及模擬實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-03-03c++利用windows函數(shù)實(shí)現(xiàn)計(jì)時(shí)示例
這篇文章主要介紹了c++利用windows函數(shù)實(shí)現(xiàn)計(jì)時(shí)示例,需要的朋友可以參考下2014-05-05