今天我们用C语言实现一个扫雷游戏,升级版哦
可以展开,标记,取消标记,记录已排查坐标数。
直接来看看效果吧
除了没用鼠标点以外,是很接近原版的。
目录
扫雷主体思路
需要实现扫雷游戏,我们可以先看看别人的扫雷是如何实现的,
可以看出,棋盘是具有两层的,第一层是我们想让玩家直接可以看到的,第二层则是隐藏起来的,存放的是雷。
所以我们需要生成两个二维数组,一个二维数组,用来存放棋盘,另一个二维数组用来存放雷(可以称为雷盘)。
棋盘初始化为*
雷盘初始化为0 然后随机放入雷(随机就可以想到用rand函数)
然后再进行排查雷,展开雷区等功能的实现。
可能有点抽象,我们来实现看看吧。等实现完就会觉得其实并不难啦,很好理解的。
扫雷游戏主体的实现
我们先创建三个文件
1.游戏菜单的实现
我们需要打印一个简单的游戏菜单,就像我们平时玩游戏也是有菜单的,让玩家选择。
使用do while循环语句与switch 选择语句 实现
代码实现如下:
void menu()
{
// \033[34m \033[0m 是实现字体颜色 34代表蓝色 31代表红色
printf("*********************\n");
printf("******\033[34m 1.play\033[0m *******\n");
printf("******\033[31m 0.exit\033[0m *******\n");
printf("*********************\n");
}
void test()
{
int input = 0;
do
{
//菜单
menu();
printf("请选择:>");
scanf("%d", &input);
system("cls");//输入后清理屏幕
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误!\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
这里的菜单 1.play 0.exit 字体颜色 进行了设置,我觉得这样看起来有趣一些,不那么的枯燥。
2.初始化棋盘/雷盘
我们需要创建两个char类型二维数组
一个用于存放展示给玩家看的棋盘,另一个用于存放雷。
为了方便后期的更改,我们可以用#define 定义常量 作为数组大小。
我们创建个9*9的棋盘吧
但是这里有一个问题,如果我们创建 9*9的,想要展示给玩家看的就是9*9的棋盘,如果玩家要查找棋盘边缘的坐标,周围的雷的数量,
像上面图中那样,就会出现数组越界访问的问题,所以我们最好把数组创建大一点,打印的时候仍然打印9*9的,但是创建数组,可以创建11*11的这样就避免了数组越界的情况。
所以可以这样定义
现在来看看代码实现:
test.c里
//扫雷游戏的实现
void game()
{
//创建棋盘
//mine数组是用来存放布置好的雷的信息
char mine[ROWS][COLS] = { 0 };//'0'
//show数组是存放排查出的雷的信息
char show[ROWS][COLS] = { 0 };// '*'
//创建棋盘初始化
InisBoard(mine, ROWS, COLS,'0');//传个字符'0'过去,代表把雷盘初始化为全'0'
InisBoard(show, ROWS, COLS, '*'); //传个字符'*'过去,代表把雷盘初始化为全'0'
}
game.c里
//初始化mine雷盘/show棋盘 都可以调用这个函数实现
void InisBoard(char board[ROWS][COLS],int rows,int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
gama.h里
#define ROW 9 // 展示给玩家看的行
#define COL 9 //
#define ROWS ROW+2 //实际创建的行
#define COLS COL+2
//初始化雷盘的声明
void InisBoard(char arr[ROWS][COLS], int rows, int cols,char set);
头文件别忘了引用哦,我代码块里没有加进去,但是文章末尾的完整代码里都会有的。
3.打印棋盘/雷盘
实际游戏中雷盘不会打印给玩家看的。
为了方便玩家识别行列位置,我们可以加上打印行号 和列号
为了更加接近平时玩的扫雷,我设置了不同数字以不同颜色显示,1 蓝色 2白色 3黄色 标记(!)雷红色显示
来看看代码吧: