目录
前言
C语言实现扫雷小游戏,帮我们更进一步的掌握数组、模块化思想等知识。
一、分模块化
对于扫雷小游戏,相信老铁们应该不陌生,根据信息进行排雷,大家可以参考网页版的扫雷游戏:扫雷小游戏
对于扫雷小游戏,虽然是一个小项目,代码量不多,但对于初学者来说,重要的是学习如何分模块开发项目。
本文将该游戏分成三个文件:
- test.c游戏测试文件
- game.c游戏执行逻辑(函数实现)
- game.h游戏声明(函数声明,头文件)
二、准备雷盘
扫雷游戏,首先需要一个雷盘,本文讲解的雷盘为9×9规格。
2.1 游戏菜单
一个游戏,最先呈现给用户看的是游戏菜单,对于游戏菜单,可以用do...while循环 + switch选择语句完成,因为无论用户是否开始还是退出游戏,程序都会运行一次。
test.c文件
#include "game.h"
void menu()
{
printf("********************\n");
printf("***** 1、play ******\n");
printf("***** 0、exit ******\n");
printf("********************\n");
}
int main()
{
int input = 0;
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;
}
game.h文件
#pragma once
#include <stdio.h>
2.2 创建雷盘思路
对于雷盘,使用二维数组存储数据是最合适的,符合行列。那一个雷盘就可以了吗?
我们规定:雷用字符1表示,非雷用字符0表示。
因此冲突点就出现了,如果对某个位置进行排雷,统计雷数时,正好也为1,那究竟是雷还是雷数呢?
为此,这里用了一个很巧妙的方法,我们定义两个大小一致的二维数组,也就是两个雷盘,一个雷盘用于布置雷,一个雷盘用于存放统计后雷的个数。
因此,我们有以下规定:
- 布置雷的二维数组叫mine。
- 存放雷数的二维数组叫show。因为要展示给用户看选择的位置周围的雷数,因此叫show。
- mine雷盘中字符0为非雷,字符1为雷。
- show雷盘中字符*表示未排查,字符数字表示该位置已被排查。
前面说过,我们的雷盘是一个9×9的规格,那相对于的两个数组的大小也是9×9吗?
其实不是,应该为11×11,因为当我们对最上、最下、最左、最右中的位置进行排雷时,统计周围有几颗雷时,会造成数组越界的情况,因此我们定义多2行2列的数据,这部分位置不存放雷,将雷存放在9×9的雷盘中,多定义的2行2列只是为了防止数组越界。
2.3 构建雷盘
对于数组的大小,我们不能写死,应该用#define标识符常量来表示,方便以后想扩大雷盘。并且我们需要分别定义9×9和11×11的标识符,因为在布置雷、打印雷盘、排雷的功能中只需要用到9×9的区域,而在初始化雷盘时,需要用到11×11区域。
test.c文件
#include "game.h"
void menu()
{
printf("********************\n");
printf("***** 1、play ******\n");
printf("***** 0、exit ******\n");
printf("********************\n");
}
void game()
{
//定义两个大小相同的二维数组
//这里的数组大小最好用#define标识符表示,后续想改变就该#define就好了
//用于布置雷,用字符数组的原因是规定字符0为非雷,字符1为雷
char mine[ROWS][COLS] = { 0 };
//用于存放排查雷的信息(主要给用户看的页面
//用字符数组的原因是规定雷数用字符数字表示,其它位置用字符*表示
char show[ROWS][COLS] = { 0 };
}
int main()
{
int input = 0;
do
{
//游戏菜单
menu();
printf("请选择:>");
scanf("%d