编写代码实现简单的扫雷游戏
掃雷
菜單
比較簡(jiǎn)單,代碼如下
void menu() {printf("*******************\n");printf("**** 1. play ****\n");printf("**** 0. exit ****\n");printf("*******************\n"); }效果如圖
然后就是根據(jù)不同的輸入來(lái)執(zhí)行不同的程序,這里用到了switch函數(shù),也比較簡(jiǎn)單,如果想讓這個(gè)游戲可以一直玩的話,我們?cè)偌由弦粋€(gè)循環(huán),這里用了do_while循環(huán)
以上的都比較簡(jiǎn)單,重點(diǎn)是里面game()的實(shí)現(xiàn),對(duì)于初學(xué)者來(lái)說(shuō)可能有一點(diǎn)難。
對(duì)于這個(gè)掃雷呢,我們的思路是設(shè)置兩個(gè)棋盤,一個(gè)棋盤用來(lái)布置雷,也就是存放雷的信息,而另一個(gè)棋盤則用來(lái)展示給玩家看,也就是展示排查出來(lái)雷的信息,于是我們定義這樣的兩個(gè)棋盤。
假設(shè)這是一個(gè)9*9的棋盤我們?cè)陬^文件里面聲明ROW和COL
#define ROW 9 #define COL 9注意上面我們定義棋盤的時(shí)候用的不是ROW和COL,而是ROWS和COLS,這是因?yàn)槲覀冊(cè)谂挪槔椎竭吔琰c(diǎn)的時(shí)候,再往外排查啊會(huì)出現(xiàn)下標(biāo)越界的情況,于是我們上下各加一行,左右各加一列,于是就變成了1111,也就是ROW+2COL+2,于是我們接著在頭文件中定義
#define ROWS ROW+2 #define COLS COL+2代碼實(shí)現(xiàn)
初始化棋盤
定義好棋盤后我們就要對(duì)它進(jìn)行初始化,如圖
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化棋盤因?yàn)槲覀儗?duì)兩個(gè)棋盤進(jìn)行初始化的值不一樣,所有在形參的后面加了一個(gè)返回值set,我們這里將mine棋盤初始化為’0’,將show棋盤初始化為’*’
InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*');接下來(lái)就是這個(gè)函數(shù)的代碼實(shí)現(xiàn)了,比較簡(jiǎn)單
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}} }打印棋盤
將棋盤進(jìn)行初始化之后我們可以來(lái)打印棋盤出來(lái)看看,看是否初始化成功,函數(shù)聲明如下
void PrintBoard(char board[ROWS][COLS], int row, int col);//打印棋盤這里看起來(lái)復(fù)雜,其實(shí)比較簡(jiǎn)單,就是利用循環(huán)打印數(shù)組里的元素,這里為了方便玩家看清還在棋盤的側(cè)面加上了坐標(biāo)
void PrintBoard(char board[ROWS][COLS], int row, int col) {int i = 0;int j = 0;printf("--------掃雷-------\n");//控制列號(hào)for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");} }效果如下
注意在玩的時(shí)候第二個(gè)棋盤是玩家看不到的,也就是不打印的。
出現(xiàn)這樣的界面就說(shuō)明我們的棋盤已經(jīng)初始化成功并且能夠打印棋盤了
布置雷
接下來(lái)我們就要在第一個(gè)棋盤上存放雷的信息了
函數(shù)聲明如下
首先我們假設(shè)一個(gè)簡(jiǎn)單的難度,有10個(gè)雷,這個(gè)可以自己去調(diào)節(jié)
#define EASY_COUNT 10那么思路是什么呢?
首先我們還是要利用rand()函數(shù)來(lái)生成合法的隨機(jī)下標(biāo),然后就是每生成一個(gè)雷后這個(gè)雷的數(shù)量減一,直到變成0,這樣就布置好了10個(gè)雷
寫好之后我們可以來(lái)打印看看
可以看到棋盤上出現(xiàn)了10個(gè)1,也就說(shuō)明成功地布置了10個(gè)雷
排除雷
聲明和之前都比較類似
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排除雷而對(duì)于排雷的過程的思路是在玩家隨機(jī)輸入一個(gè)排雷坐標(biāo)后,若該地方?jīng)]有雷,則顯示周圍八個(gè)格子內(nèi)雷的數(shù)目,若該地方已被排查過,則提示,若該地方為雷,則提示游戲結(jié)束
所以在這個(gè)函數(shù)實(shí)現(xiàn)之前我們需要定義一個(gè)函數(shù)來(lái)返回周圍八個(gè)格子雷的總數(shù)的函數(shù),假設(shè)玩家輸入的坐標(biāo)為x,y,則其周圍八個(gè)格子的坐標(biāo)可以找到
這里的-8 * ‘0’是因?yàn)槠灞P中存放的雷都是以字符1的形式來(lái)存放的,假設(shè)該位置周圍有兩個(gè)雷,即兩個(gè)’1’,那么該位置顯示的數(shù)就是2*‘1’+6*‘0’-8*‘0’,也就是2
再根據(jù)上面排雷的思路,我們可以大概寫出部分代碼的實(shí)現(xiàn)
這里的show[x][y] = n + '0';的意思是把周圍的雷的數(shù)目返回到show[x][y],但是我們?cè)谄聊簧巷@示的是字符2而不是數(shù)字2,但這個(gè)函數(shù)返回的數(shù)字2,十一我們要想辦法把數(shù)字2變成字符2,由ASCII表可知也就是加上48,即加上一個(gè)字符0就可以了
而當(dāng)雷都排完也就是十個(gè)雷都找完后的時(shí)候游戲就結(jié)束了,我們可以定義一個(gè)win,每找到一個(gè)雷win就加一,一直加到對(duì)于我們對(duì)應(yīng)的難度后游戲結(jié)束,所以我們可以對(duì)以上代碼進(jìn)行補(bǔ)充
void FineMine(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 - EASY_COUNT)){printf("請(qǐng)輸入要排查的坐標(biāo)");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("該坐標(biāo)被排查過");continue;}if (mine[x][y] == '1'){printf("很遺憾,踩到雷了\n");PrintBoard(mine, ROW, COL);break;}else{int n = get_mine_count(mine, x, y);show[x][y] = n + '0';PrintBoard(show, ROW, COL);win++;}}else{printf("坐標(biāo)錯(cuò)誤,請(qǐng)重新輸入\n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功\n");} }到這里的話游戲就可以玩了,不好的地方是需要一個(gè)個(gè)去排雷,不能展開沒有雷的地方,要想達(dá)到這個(gè)效果就得用到遞歸的思想了。
下面是運(yùn)行截圖(破解版)
全部代碼
game.h
#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<stdio.h> #include<stdlib.h> #include<time.h>#define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化棋盤 void PrintBoard(char board[ROWS][COLS], int row, int col);//打印棋盤 void SetMine(char mine[ROWS][COLS], int row, int col);//布置雷 void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排除雷game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {int i = 0;for (i = 0; i < rows; i++){int j = 0;for (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;printf("--------掃雷-------\n");//控制列號(hào)for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);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 = EASY_COUNT;while (count){int x = rand() % row + 1;//1-9int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}} } int get_mine_count(char mine[ROWS][COLS], int x, int y) {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 FineMine(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 - EASY_COUNT)){printf("請(qǐng)輸入要排查的坐標(biāo)");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("該坐標(biāo)被排查過");continue;}if (mine[x][y] == '1'){printf("很遺憾,踩到雷了\n");PrintBoard(mine, ROW, COL);break;}else{int n = get_mine_count(mine, x, y);show[x][y] = n + '0';PrintBoard(show, ROW, COL);win++;}}else{printf("坐標(biāo)錯(cuò)誤,請(qǐng)重新輸入\n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功\n");} }text.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h"void menu() {printf("*******************\n");printf("**** 1. play ****\n");printf("**** 0. exit ****\n");printf("*******************\n"); } void game() {char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };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 test() {srand((unsigned int)time(NULL));int input = 0;do{menu();int input = 0;printf("請(qǐng)輸入選項(xiàng)\n");scanf("%d", &input);switch (input){case 1:printf("開始掃雷\n");game();break;case 0:printf("退出游戲\n");break;default:printf("請(qǐng)重新選擇\n");break;}} while (input); } int main() {test();return 0; }總結(jié)
以上是生活随笔為你收集整理的编写代码实现简单的扫雷游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#基础模拟及注释
- 下一篇: UE4 制作一款动画播放器