规则:根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
在文件方面,仍然需要创建多个文件,避免因一个文件里面内容太多而造成混乱
这里创建
一个头文件game.h用来存放函数的声明,头文件的包含,以及一直符号的处理
一个源文件game.c用来实现函数的显示逻辑
一个源文件work.c用来测试游戏的运行逻辑
三个文件处于并列关系
下面开始设计这个游戏
首先是开始界面,开始界面可以选择难度以及是否开始游戏
int main()
{
test();//进入test函数
return 0;
}
void test()
{
do//循环进行游戏选择
{
option = 0;
menu();
scanf("%d",&option);
swtich()
{
case 1:
play();
break;
case 0:
printf("退出游戏\n");
default:
printf("选择错误,请重新选择\n");
}
}while(option);
}
void menu()
{
printf("****************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("****************\n");
printf("请选择:>");
}
上面三个部分就是游戏最开始的界面:选择是否进入游戏,完成后是这样的:
然后就是进入游戏后的部分,也就是play函数
在这里我们就要思考在游戏里面有哪些重要的点以及步骤把逻辑确定好之后在play函数中实现
void play()
{
srand((unsigned)time(NULL));
printf("开始\n");
char mine[ROWS][COLS] = {
0 };
char show[ROWS][COLS] = {
0 };//这里创建了两个除名字外都相同的数组
//初始化
init_board(mine, ROWS, COLS, '0');
init_board(show, ROWS, COLS, '*');//对两个数组分别初始化
//布置雷
set_mine(mine, ROW, COL);
//打印
//Mul_exp(mine, ROWS, COLS);
display_board(show, ROW, COL);
//进行排查的操作
sweeper(mine, show, ROW, COL);
//最后在进行到某一步时游戏终止
//游戏终止后回到test()函数中,接着到break语句,再次选择是否进行游戏
}
这样work.c里面的内容就布置好了
不过对于两个数组及其初始化有以下问题:
其中一个数组是用来展示给玩家的,另一个数组则是进行放置雷的操作,两个数组在后面会关联,比如玩家界面看到的是show数组的内容,但是对于排雷的一系列操作时在mine数组里面实现的
如果使用整形数组的话,就会在判断周围有多少雷与是否踩中雷两种情况下产生误解
这样的话就分不清7-8这个位置是雷还是说7-8周围有1个雷
另外,采用字符数组的话,在计算周围有多少个雷的时候,可以运用加法,每一个字符’1’相加,最后转换一下了
#define ROW 3//
使用#define的操作可以方便后续更改模式难度,要提高难度的时候,只需要更改一次3的值,不至于去将所有的3 更改,大大提高了效率
然后是几个函数的实现——放在game.c源文件中
void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void set_mine(char board[ROWS][COLS], int row, int col)
{
int count = 0;
while (count < EASY_MODE)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count++;
}
}
}
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);
}
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 sweeper(char mine[ROWS][COLS],char show[ROWS][COLS] ,int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win <col*row-EASY_MODE)
{
printf("请输入要检查的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
display_board(mine, ROW, COL);
break;
}
else
{
int n = get_mine_num(mine, x, y);
show[x][y] = n + '0';
display_board(show, ROW, COL);
win++;
}
}
else
{
printf("坐标输入错误,请重新输入\n");
}
}
if (win == col * row - EASY_MODE)
{
printf("排雷成功\n");
}
}
此外,因为game.c与work.c的内容处于不同文件,所以我们需要利用game.h是的两个文件有关联
//文件包含
#include
#include
#include
//符号处理
#define ROWS 11
#define COLS 11
#define ROW ROWS-2
#define COL COLS-2
#define EASY_MODE 10//9*9
//函数声明
//初始化数组
void init_board(char board[ROWS][COLS], int rows, int cols, char set);
//展示棋盘
void display_board(char board[ROWS][COLS], int rows, int cols);
//布置雷
void set_mine(char board[ROWS][COLS], int row, int col);
//操作
void sweeper(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
下面是我传在码云里面的完整代码网址
https://gitee.com/tang-mi-77/c_project/tree/master/minesweeper