扫雷游戏基本原理

扫雷游戏基本原理那么玩游戏 无非就是这几个情况 1 玩家踩到雷了 那么就退出游戏 并打印一下 mine 数组 让玩家自己确实输了 2 玩家没有踩到雷 那么这是就应该在这个格子里面打印周围 8 个格子里面雷的总数

大家好,欢迎来到IT知识分享网。

扫雷游戏基本原理

目录

一、扫雷的玩法规则:

二、构建游戏

2.1、那么第一步,我们应打印个菜单:

2.2、打印棋盘

2.3、初始化棋盘

2.5打印棋盘

2.6排查雷

三、游戏改进

四、游戏代码


(文章中的代码,只是思路,完整版在文章最后面)

一、扫雷的玩法规则:

在一个方块中,可设置游戏的雷数,玩家选择一个地方,该地方如果有雷的话,游戏失败;若该地方没有雷,则该地方会显示一个数字(表示该地方周围雷的个数)。扫雷游戏基本原理

如上图,被圈中的数字1,证明周围8个方块里会有一个雷,显然可以得出,最左列的三个方块里会有一个雷。

在排雷的过程中,若点到雷,则游戏失败;当玩家把所有的没有雷的地方都找到后(也就是说游戏界面只有雷了,那么该玩家游戏成功。此上为游戏规则。

二、构建游戏

了解我玩规则后,我们开始写一个比较简单的扫雷。

2.1、那么第一步,我们应打印个菜单:

void menu() { printf("*\n"); printf(" 1.play *\n"); printf(" 0.exit*\n"); printf("*\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请输入:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }

利用menu函数,做了一个简单的菜单,并利用switch语句进行了选择,友友们也可以使用if语句这也是可以的,然后为了防止玩家玩完游戏后还想再次玩,我们使用了while语句。以上就是我对该菜单的写法解释,下面我们开始看看游戏的代码。

2.2、打印棋盘

我们想一想,要想玩游戏,那我们就应该有游戏棋盘,怎么去构建一个游戏棋盘呢?从上述图形中我们不难想到——-二维数组!

就比如我们这次写的扫雷就写一个9*9的游戏棋盘吧。

思路的方向有了,我们再想一想,我们应该创建几个数组呢?应该是两个,我们分析一下,第一个数组我们应该要放雷吧,那第二个数组是用来给玩家探索的,我们总不能让玩家看着雷排雷吧。

然后我们在想应该创建一个多大的数组呢?有的友友就会像我们不是要做9*9的扫雷吗?那就创建9*9的数组呗。这个想法我只能说没错,但是很麻烦,为啥呢?我们分析一下:如果是9*9的棋盘,那么边界的格子我们应该怎么去算雷的个数呢?

扫雷游戏基本原理

扫雷游戏基本原理

我采取的方案是在原有的棋盘上,额外加上两行两列,不在添加额外的地方设置雷,这样在统计最外界的格子周围雷数时就变得方便些。

 char mine[11][11]; char show[11][11];

其中mine是设置雷的数组,show时玩家玩游戏的数组。先别急这里有改进,我们这次是9*9的游戏,那如果我以后想玩10*10的或者其他的呢?这里我们可以:

#define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 

这样的话,我们就吧数组中的数字换成

 char mine[ROWS][COLS]; char show[ROWS][COLS];

这样我们以后更改游戏的话只需要更改ROW 和COL 就可以了。那么我们设置雷的个数时,是不是也可以用这个方法呢?想必是可以的,后面会用到。

2.3、初始化棋盘

连个数组,将他们的内容先初始化,比如mine数组将数组初始化成‘0’,后面设置雷的时候将雷表示为‘1’.然后show数组初始化‘*’,也就是说玩家看到的数组是*的,也就是未知的。二维数组设置用两个循环就可以了。

以下是初始化的函数:

void Initboard(char board[ROWS][COLS], int row, int col,char set) { int i = 0; int j = 0; for (i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { board[i][j] = set; } } }

因为2.3初始化数组时,我们将mine数组初始化的是字符0,所以我们用字符1表示雷,那么怎么才能随机设置雷呢?友友们是否想到了rand,对我们用rand函数,还应该用srand,和time函数。这样会使rand函数实验真正的生成随机数。

void LayoutRay(char board[ROWS][COLS], int row, int col) { int count = 10; while (count) { int x = rand() % 9 + 1; int y = rand() % 9 + 1; if (board[x][y] != '1') { board[x][y] = '1'; count--; } } }

这里我写的代码是有10个雷(count表示雷的个数),我们也可以用上面所说的方法,定义雷的个数,这样可以供玩家选择。

2.5打印棋盘

因为每次玩家选择完格子之后我们要将棋盘打印出来,让玩家知道游戏的情况,而且,当玩家踩到雷后,应打印mine数组,让玩家知道自己失败的原因。所以这里我们应考略打印棋盘,那打印棋盘也比较简单,无非就是用两个循环将二维数组打印出来就行了。

以下是打印数组的函数:

void paintboard(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf("------扫雷-------\n"); for (i = 0; i <= col; i++) { printf("%d ", i); } printf("\n"); for (i = 0; i <= col; i++) { printf("- "); } printf("\n"); for (i = 1; i <= row; i++) { printf("%d", i); printf("|"); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } printf("------扫雷-------\n"); }

2.6排查雷

到了这一步,游戏的雷已经埋好了,下面就是玩家开始玩游戏了。那么玩游戏,无非就是这几个情况:1、玩家踩到雷了,那么就退出游戏,并打印一下mine数组,让玩家自己确实输了 2、玩家没有踩到雷,那么这是就应该在这个格子里面打印周围8个格子里面雷的总数。那么这里就要计算雷的数目了。

void number(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int count = 0; int x = 0; int y = 0; while (1) { int a = 0; int count = 0; printf("请输入你将下的位置:"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("你已踩到雷,游戏结束"); paintboard(mine, ROW, COL); break; } else if (mine[x][y] != '1') { int i = 0; int j = 0; for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (mine[i][j] == '1') count++; } } show[x][y] = count + '0'; paintboard(show, ROW, COL); a++; } if (a == 71) { printf("恭喜你,挑战成功"); break; } } else { printf("输入错误,请重新出入\n"); } } }

这样我们的扫雷就简单完成了。

三、游戏改进

1.首先就是游戏的棋盘大小以及雷的总数可以进行改进,改进方法:定义列、行、雷数 ,利用sancf函数,可以让玩家自己选择

2.第二个改进的地方,就是可以标记雷的方法。玩家可以将自己认为是雷的地方用规定的字符表示,比如‘#’。这也是一个方向。

四、游戏代码

game.c

#define _CRT_SECURE_NO_WARNINGS #include"game.h" void Initboard(char board[ROWS][COLS], int row, int col,char set) { int i = 0; int j = 0; for (i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { board[i][j] = set; } } } void paintboard(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf("------扫雷-------\n"); for (i = 0; i <= col; i++) { printf("%d ", i); } printf("\n"); for (i = 0; i <= col; i++) { printf("- "); } printf("\n"); for (i = 1; i <= row; i++) { printf("%d", i); printf("|"); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } printf("------扫雷-------\n"); } void LayoutRay(char board[ROWS][COLS], int row, int col) { int count = 10; while (count) { int x = rand() % 9 + 1; int y = rand() % 9 + 1; if (board[x][y] != '1') { board[x][y] = '1'; count--; } } } void number(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int count = 0; int x = 0; int y = 0; while (1) { int a = 0; int count = 0; printf("请输入你将下的位置:"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("你已踩到雷,游戏结束"); paintboard(mine, ROW, COL); break; } else if (mine[x][y] != '1') { int i = 0; int j = 0; for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (mine[i][j] == '1') count++; } } show[x][y] = count + '0'; paintboard(show, ROW, COL); a++; } if (a == 71) { printf("恭喜你,挑战成功"); break; } } else { printf("输入错误,请重新出入\n"); } } } 

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 //棋盘初始化 void Initboard(char board[ROWS][COLS], int row, int col,char set); //打印棋盘 void paintboard(char board[ROWS][COLS], int row, int col); //布置雷 void LayoutRay(char board[ROWS][COLS], int row, int col); //计算周围雷数 void number(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col); 

learn.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() { //构建棋盘 char mine[ROWS][COLS]; char show[ROWS][COLS]; //棋盘初始化 Initboard( mine, ROW, COL,'0'); Initboard( show, ROW, COL,'*'); 打印棋盘 //paintboard(mine, ROW, COL); //paintboard(show, ROW, COL); //布置雷 LayoutRay(mine, ROW, COL); //打印棋盘 paintboard(show, ROW, COL); //求周围雷数 number(mine,show, ROW, COL); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请输入:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }

希望这个对大家有帮助,喜欢请关注一下,持续更新!!!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/124983.html

(0)
上一篇 2025-10-01 18:15
下一篇 2025-10-01 18:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信