【C语言极简自学笔记】项目开发——扫雷游戏
一、项目概述
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);
}
代码整体运行结果如下:
可以看到,已经随机设置了十个雷,而且排查雷的数组所有元素被初始化为*。
欲知后事如何,且看下篇文章!!!!!