C语言编写扫雷小游戏
1. 引言
学完C语言不久,为加深C语言知识,所以编写了扫雷,这是一个很老并且很经典的小游戏,小时后经常玩,现在学习了C语言,会发现很容易实现它。
- 简述扫雷游戏的玩法和目的
我写的扫雷游戏是一个在9乘9的方格棋盘中,通过输入坐标,排除不是雷的方格的一个小游戏。
2. 项目概述
-
描述扫雷游戏的功能和规则
游戏界面是一个方格状的雷区,每个方格内可能隐藏有雷或者没有雷。
玩家通过输入方格坐标来进行游戏,如果该方格是有雷的方格则游戏结束,如果是没有雷的方格则显示该方格周围的雷的数量。
直到没有雷的方格全部排除了,则游戏通关。 -
讨论设计游戏的初衷和目标用户
设计扫雷游戏的初衷是为了提供一款简单而有趣的休闲娱乐游戏,适合各个年龄段的用户。它可以锻炼玩家的逻辑思维能力和手眼协调能力,同时也可以帮助用户放松心情、缓解压力。但是我的这个可能会越玩越不好,没耐心的人是玩不下去的。 -
说明选择C语言开发的原因
目前我学会了c语言,为了锻炼敲代码的能力,所以我需要用C语言编写程序。
3. 游戏设计
游戏设计:
-
数据结构设计:
- 棋盘使用二维字符数组表示,其中
bomb
数组用于存储地雷的位置,show
数组用于显示玩家看到的棋盘。 ROWS
和COLS
分别表示棋盘的行数和列数,可以根据实际需求进行调整。
- 棋盘使用二维字符数组表示,其中
-
算法逻辑设计:
- 初始化棋盘:通过调用
InitBoard
函数,将bomb
和show
数组中的元素全部初始化为0或’*’。 - 布雷:通过调用
SetBomb
函数,在bomb
数组中随机设置地雷的位置。 - 排雷:通过调用
EliBomb
函数,根据玩家的选择判断是否踩到地雷,并更新show
数组中的显示内容。
- 初始化棋盘:通过调用
关键代码片段解释:
void menu()
{
printf("*****************************\n");
printf("*********** 1. play ********\n");
printf("*********** 0. exit ********\n");
printf("*****************************\n");
}
这段代码定义了一个菜单函数menu
,用于显示游戏的选项。通过打印不同的提示信息,玩家可以选择开始游戏或退出游戏。
void game()
{
char bomb[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
// ...
DisplayBoard(show, ROW, COL);
// ...
EliBomb(bomb,show, ROW, COL);
}
这段代码定义了游戏的主要逻辑。首先,通过初始化两个二维数组bomb
和show
来创建棋盘。然后,通过调用DisplayBoard
函数显示玩家看到的棋盘。接下来,通过调用EliBomb
函数进行排雷操作。
界面设计和用户体验方面的考量:
- 界面设计简洁明了,通过菜单提示用户可以选择开始游戏或退出游戏。
- 用户体验方面,游戏提供了直观的提示信息,让玩家能够清楚地了解当前的游戏状态和可执行的操作。同时,通过合理的布局和颜色搭配,增加了游戏的可玩性和吸引力。
5. 编码实现
初始化棋盘:通过调用InitBoard
函数,将bomb
和show
数组中的元素全部初始化为0或’*’。
//初始化布雷的棋盘,有雷表示1,无雷表示0,初始化全为0
//初始化展示出的棋盘
void InitBoard(char bomb[ROWS][COLS], int rows, int cols, int set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
bomb[i][j] = set;
}
}
}
打印棋盘:打印出当前棋盘的状态,包括已经揭示的位置和未揭示的位置。
//打印棋盘
void DisplayBoard(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);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("---------扫雷---------\n");
}
布置雷:在棋盘上随机布置一定数量的雷。
//布置雷
void SetBomb(char board[ROWS][COLS], int row, int col)
{
int count = 10;//雷数
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
计算周围雷的数量:给定一个位置,计算该位置周围的8个位置中雷的数量。
void GetBombCount(char bomb[ROWS][COLS], int x, int y)
{
return bomb[x - 1][y - 1] + bomb[x][y - 1] + bomb[x + 1][y - 1]
+ bomb[x + 1][y] + bomb[x + 1][y + 1] + bomb[x][y + 1]
+ bomb[x - 1][y + 1] + bomb[x - 1][y] - 8 * '0';
}
排雷游戏:玩家输入一个位置,如果该位置有雷,则游戏结束;否则,揭示该位置并显示周围雷的数量。
//排雷
void EliBomb(char bomb[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<row*col-10)
{
printf("请输入排查坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (bomb[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(bomb, ROW, COL);
break;
}
else
{
//统计周围有几个雷
int c = GetBombCount(bomb, x, y);
show[x][y] = c + '0';
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("输入非法,请重新输入");
}
}
if (win == row * col - 10)
{
printf("恭喜你,通关了");
DisplayBoard(bomb, ROW, COL);
}
}
遇到的挑战和问题以及解决方案:
如何随机布置雷?
解决方案:使用rand()函数生成随机数,根据随机数确定雷的位置。
如何计算周围雷的数量?
解决方案:遍历周围8个位置,统计雷的数量。
6. 测试与调试
- 描述测试策略和调试过程
在编写代码过程中,每完成一个功能模块我都会去进行测试,以确保代码功能正常。不至于在完成最终编写后有一堆错误,这样很影响效率。 - 遇到的问题和bug,以及如何解决它们
- 在功能测试中如果出现错误提示,则根据错误提示修改,如果没有出错提示,运行结果没有到效果,则是逻辑出错。我就会进行逐过程调试去找出问题所在。
7. 结语
这个小游戏我编写了几个小时,主见我对知识的不熟练。
最后加油吧。
8. 附录(可选)
代码见gitee上的开源:
https://gitee.com/Senior-l/bit111/commit/f802a702d35215db75bc1ca741a6fc27b3165788