一、游戏的整体逻辑图示
二、程序的总体结构框架
三、游戏功能的整体描述
四、游戏子功能具体实现
五、问题产生和解决方法
序号 | 遇到的问题 | 产生原因 | 解决方法 |
---|
1 | 初始化数组内容函数没有传数组元素内容,倒置两个数组内容都是字符’0’了。 | 两个数组存储类型相同但是存储内容不同,如果不传参的话,要写两个基本一样的函数,费时费力。 | 在定义初始化数组函数时将数组内容元素也作为参数传递过去,简化初始化数组步骤。 |
2 | 电脑随机布雷只布了一颗雷 | 随机坐标的产生未放在循环内,导致只产生了一次随机坐标,所以虽然循环了10次,但是10次的雷都放在了同一个地方。 | 把随机值的产生放在循环内,每进入一次循环,随机值都会改变。 |
3 | 计算周围布雷个数数据不正确 | 返回的值是正确的,但是数组元素的类型是char,所以返回值c+’0’才会显示字符‘0’到字符‘8’。 | 返回值c+’0’。 |
六、源代码分享交流
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINECOUNT 10
#define BLANK ROW*COL-10
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void menu();
void Init_board(char board[ROWS][COLS], int rows, int cols, char ret);
void Display_board(char board[ROWS][COLS], int rows, int cols);
void Radom_mineset(char board[ROWS][COLS], int rows, int cols);
int Count_mine(char Mine_board[ROWS][COLS], int x, int y);
void Mine_clearance(char Mine_board[ROWS][COLS], char Show_board[ROWS][COLS], int rows, int cols);
void Game();
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do {
menu();
printf("请选择0或1:>");
scanf("%d", &input);
switch (input)
{
case 1:
Game();
break;
case 0:
printf("游戏退出,感谢使用\n");
break;
default:
printf("输入值错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
void menu()
{
printf("*******************\n");
printf("******1、PLAY******\n");
printf("******0、EXIT******\n");
printf("*******************\n");
}
void Init_board(char board[ROWS][COLS], int rows, int cols, char ret)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ret;
}
}
}
void Display_board(char board[ROWS][COLS], int rows, int cols)
{
int i = 0, j = 0;
printf("--------扫雷-------\n");
for (i = 0; i <= ROW; i++)
{
printf("%d ", i);
}
printf("—Y轴");
printf("\n");
for (i = 1; i < rows - 1; i++)
{
printf("%d ", i);
for (j = 1; j < cols - 1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("|\n");
printf("X\n");
printf("轴\n");
}
void Radom_mineset(char board[ROWS][COLS], int rows, int cols)
{
int count_mine = MINECOUNT;
while (count_mine)
{
int x = rand() % ROW + 1;
int y = rand() % ROW + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count_mine--;
}
}
}
int Count_mine(char Mine_board[ROWS][COLS], int x, int y)
{
return Mine_board[x - 1][y - 1] +
Mine_board[x - 1][y] +
Mine_board[x - 1][y + 1] +
Mine_board[x + 1][y - 1] +
Mine_board[x + 1][y] +
Mine_board[x + 1][y + 1] +
Mine_board[x][y - 1] +
Mine_board[x][y + 1] - 8 * '0';
}
void Mine_clearance(char Mine_board[ROWS][COLS], char Show_board[ROWS][COLS], int rows, int cols)
{
int x = 0, y = 0;
int c = 0;
int blank = BLANK;
while (blank)
{
printf("请输入排雷坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
if (Mine_board[x][y] == '1')
{
printf("很遗憾,你被炸死了,游戏结束\n");
Display_board(Mine_board, ROWS, COLS);
break;
}
else
{
c = Count_mine(Mine_board, x, y);
Show_board[x][y] = c + '0';
Display_board(Show_board, ROWS, COLS);
blank--;
}
}
else
printf("坐标格式输入错误,请重新输入,参考格式:>9 9;\n");
}
if (blank == 0)
{
printf("游戏结束,玩家胜利\n");
}
}
void Game()
{
char Mine_board[ROWS][COLS] = { 0 };
char Show_board[ROWS][COLS] = { 0 };
Init_board(Mine_board, ROWS, COLS, '0');
Init_board(Show_board, ROWS, COLS, '*');
Display_board(Show_board, ROWS, COLS);
Radom_mineset(Mine_board, ROWS, COLS);
Mine_clearance(Mine_board, Show_board, ROWS, COLS);
}