程序结构
程序结构图
程序入口模块
main
函数主要用来作为整个程序的入口,它的功能是打印菜单并接受用户的输入。如果用户输入0
则直接退出程序。如果用户输入1
则进入游戏控制模块。当用户输入其他的值的时候,告诉用户输入有误,请重新输入。
#define EASY 10
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
void menu()
{
printf("****************************\n");
printf("** 1. play 0. exit **\n");
printf("****************************\n");
}
int main()
{
int input = 0;
do {
menu();
printf("请选择:> ");
scanf("%d", &input);
switch (input)
{
case 1:
play();
break;
case 0:
printf("游戏已退出!\n");
break;
default:
printf("选择有误!请重新输入");
break;
}
} while (input);
return 0;
}
游戏控制模块
- 游戏控制模块的主要功能是实现游戏的整个逻辑控制。它做的事情主要是将
初始化模块
、打印地图模块
、布雷模块
、统计雷的数量模块
以及扫雷模块
合理的组织起来进而实现整个游戏的逻辑控制。
void play()
{
char bomb[ROWS][COLS];
char show[ROWS][COLS];
srand((unsigned)time(NULL));
//1.初始化
init_board(bomb, ROWS, COLS, '0');
init_board(show, ROWS, COLS, '*');
display_board(show, ROW, COL);
//2.布雷
set_bomb(bomb, ROW, COL);
display_board(bomb, ROW, COL);
//3.扫雷
find_bomb(bomb, show, ROW, COL);
}
初始化模块
- 初始化模块的主要功能是将模拟地图的数组
char board[ROWS][COLS]
中的每个元素都初始化为参数ch
指定的字符。
void init_board(char board[ROWS][COLS], int rows, int cols, char ch)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ch;
}
}
}
打印地图模块
- 打印棋盘模块的主要功能是在DOS界面下,根据数组
char board[ROW][COL]
中的内容模拟打印出一个地图。
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("--------------------\n");
printf("0 1 2 3 4 5 6 7 8 9\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");
}
布雷模块
- 布雷模块的主要功能是通过随机数函数rand()产生合法的随机坐标
(x, y)
,并在地图上随机地布上EASY
个雷,其中EASY
是一个宏定义常量。
void set_bomb(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (count < EASY) {
x = rand() % row + 1;
y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count++;
}
}
}
统计雷的数量模块
- 统计雷的数量模块的主要功能是计算坐标
(x, y)
周围的格子上有多少个雷,并将雷的个数作为函数的返回值。
char get_bomb_num(char board[ROWS][COLS], int x, int y)
{
return board[x - 1][y] + board[x - 1][y - 1]
+ board[x][y - 1]+ board[x + 1][y - 1]
+ board[x + 1][y]+ board[x + 1][y + 1]
+ board[x][y + 1]+ board[x - 1][y + 1] - 7 * '0';
}
扫雷模块
- 扫雷模块的主要功能是获得用户输入的位置
(x, y)
并判断用户的输入是否合法。如果用户的输入是合法的就接着判断看用户是否踩到了雷,如果踩到了雷,就告诉用户游戏结束 ,并将雷的分布图打印出来。如果用户没有踩到雷,就通过调用get_bomb_num(bomb, x, y)
来获得雷的个数,并将show
地图的对应位置置为相应的值,然后更新地图。继续这个过程,直到踩到雷或者把雷扫光,游戏才会结束。
void find_bomb(char bomb[ROWS][COLS],\
char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (count < row * col - EASY)
{
printf("请输入要排雷的位置:> ");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (bomb[x][y] == '1')
{
printf("恭喜你!你被炸死了!~");
display_board(bomb, ROW, COL);
break;
}
else
{
show[x][y] = get_bomb_num(bomb, x, y);
display_board(show,ROW,COL);
count++;
}
}
else
{
printf("输入位置不合法,请重新输入!~");
}
}
if (count == row * col - EASY)
printf("恭喜你排雷成功!");
}
程序源码
-
点击下面的
程序源码
可以查看并下载我的程序代码