这篇文章主要介绍了用C语言实现简单版9*9扫雷小游戏,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
一.扫雷的规则
玩家通过点击棋盘上的格子来探雷,如果此处不是雷,则会显示出一个数字代表以此格为中心的3×3的区域的雷数;而如果此处是雷,玩家被炸死,游戏结束。当玩家点击完所有非雷区时,玩家胜利。
二.代码实现前的一些问题
1.棋盘尺寸=数组尺寸?
显然我们会用数组来模拟棋盘。首先我们知道,当玩家点了非雷区时,该区域要反馈附近区域雷数的信息,这就意味着程序需要对以此格为中心的3×3区域的空间进行排查。而这个过程存在一个问题:当程序对以棋盘边角为中心的区域进行搜查时,会出现数组越界的情况。
对于这个问题,有两种解决方法:
(1)为搜查边角写另一种搜查函数
(2)扩大数组的尺寸
很明显,用方法(1)解决问题会比较麻烦。所以我选择方法(2)。方法(2)的实现非常简单。例如有一个55的棋盘,我们只需要用一个7*7的数组模拟它就行了。(实际多出来的部分只会在搜查雷数的时候会用到)
同时方法(2)还有一个好处:数组下标与棋盘坐标可以一一对应,在后续代码实现,我们可以避免考虑数组下标与棋盘坐标的校正问题。我们都知道,数组的下标从0开始,但玩家真正需要访问的是数组下标1-5的部分。
2.一个数组足矣?
这里我们模拟一个棋盘。我们用1代表雷,0代表非雷。
根据当玩家点击二行三列的格子时,这个格子会变成2,没有问题。但当玩家点击二行四列的格子时,这个会变成1。这里会出现歧义。
而且如果只用一个数组,我们难以隐藏雷区信息,所以不妨使用两个数组:一个用来模拟雷区,一个用来模拟排查出雷的信息(提供给玩家)
对于一个5×5的棋盘,我们可以创建两个char类型数组:
char mine[7][7]
char show[7][7]
三.代码实现
在本程序中,我会把代码写在三个文件中,分别是test.c(测试游戏),game.c(游戏相关函数的定义),game.h(库函数引用、函数声明以及#define定义常量)
tips:若代码块第一行未标明所位于的文件,则按以下规定分辨:
(1).函数的使用->test.c
(2).函数的声明->game.h
(3).函数的定义->game.c
0.初步完成头文件
//game.h #include #include #include #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2
如果想更改行和列,直接在此处修改即可。这只是初始版的头文件,在后文会继续补充。
Q:为什么有了ROW,还要定义ROWS?
A:在后续既要用到11×11的数组,也要用到9×9的数组,方便后续使用。
1.游戏的入口-菜单
大致思路:由于菜单至少打印一次,所以在主函数里用do-while循环进行菜单打印,再用switch语句根据玩家的选择进行下一步
//test.c #include "game.h" void menu() { printf("**********************\n"); printf("****** 1.play ******\n"); printf("****** 0.exit ******\n"); printf("**********************\n"<p style="color:transparent">来源gao!%daima.com搞$代*!码网</p>); } void game() { } 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; }
效果如下:
2.棋盘的初始化
大致思路:创建两个char类型的数组,再使用InitBoard()函数为其赋值。
这里我们发现给两个数组初始化的内容不同,可以用两个函数来初始化。
//test.c ... void game() { char mine[ROWS][COLS]; char show[ROWS][COLS]; InitBoard1(mine, ROWS, COLS); InitBoard2(show, ROWS, COLS); } ....
//game.c #include "game.h" void InitBoard1(char board[ROWS][COLS], int rows, int cols) { int i = 0; int j = 0; for (i = 0; i <rows; i++) { for (j = 0; j <cols; j++) { board[i][j] = '0'; } } } void InitBoard2(char board[ROWS][COLS], int rows, int cols) { int i = 0; int j = 0; for (i = 0; i <rows; i++) { for (j = 0; j <cols; j++) { board[i][j] = '*'; } } }
//game.h ... void InitBoard1(char board[ROWS][COLS], int rows, int cols); void InitBoard2(char board[ROWS][COLS], int rows, int cols); ...
但其实只需要
以上就是用C语言实现简单版9*9扫雷小游戏的详细内容,更多请关注gaodaima搞代码网其它相关文章!