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