一、项目概述
1.项目背景
扫雷是一款经典的益智游戏,由于它简单而富有挑战性的玩法深受人们喜爱。在 C 语言学习过程中,开发扫雷游戏是一个非常合适的实践项目,它能够综合运用 C 语言的多种基础知识,如数组、函数、循环、条件判断等,有助于提升编程能力和逻辑思维能力。
2.项目目标
本次项目旨在使用 C 语言开发一个控制台版本的扫雷游戏,实现以下基本功能:
- 初始化游戏棋盘,包括雷区的布置和非雷区域周围雷数的计算。
- 玩家通过输入坐标来翻开棋盘格子,若翻开雷则游戏失败,若翻开所有非雷格子则游戏胜利。
- 提供标记雷的功能,方便玩家识别可能有雷的区域。
- 具备良好的用户交互界面,显示棋盘状态和游戏提示信息。
二.游戏设计
1.界面设置
由于进入游戏之后首先需要显示选择是否进行游戏的界面,因此需要利用do...while循环至少执行一次的特点来显示界面,并根据用户的选择来决定是否进入游戏,对主函数的编码如下所示:
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case 1:
printf("开始游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误请重新选择\n");
break;
}
} while (input);
return 0;
}
通过switch语句,根据输入的值来选择是否进入游戏,若输入0,则退出游戏;若输入1,则开始游戏;若输入其他数字,提醒选择错误请重新输入。
菜单函数编辑如下:
void menu()
{
printf("******************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("******************************\n");
}
2.游戏环节设置
当用户选择开始游戏后,需要进入游戏,因此需要创建一个函数来实现游戏的过程。由于需要同时布置雷和排查雷,因此需要创建两个二维数组来实现对雷的布置与排查。
(1)初始化棋盘
void Initboard(char board[ROWS][COLS], int row, int col, char ret)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ret;
}
}
}
将布置雷的数组的所有元素初始化0,将排查雷的数组的所有元素初始化为*,因此需要一个字符变量来传递参数。
(2)打印棋盘
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("-------------------扫雷-----------------------\n");
for (j = 0; j <= col; j++)
{
printf("%d ",j);
}
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");
}
为了更好的识别数组中的哪一个元素,增加了打印行和列的部分
(3)设置雷
void Setmine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
通过调用srand函数生成随机数的生成起点,然后通过取模运算即可随机设置雷的位置。
此时游戏函数的代码如下:
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
Initboard(mine, ROWS, COLS,'0');
Setmine(mine, ROW, COL);
//Displayboard(mine, ROW, COL);//为了展示设置雷和初始化后的结果,正式游戏不用打印
Initboard(show, ROWS, COLS,'*');
Displayboard(show, ROW, COL);
}
代码整体运行结果如下:
可以看到,已经随机设置了十个雷,而且排查雷的数组所有元素被初始化为*。
欲知后事如何,且看下篇文章!!!!!