2.解题思路扫雷是一款经典的小游戏,让我们用C语言来实现一遍吧!
如下图所示,当我们点击一个方块时,如果该方块下方不是雷,那么它就会显示该方块四周有几个雷
如果是雷的话,游戏结束
直到玩家找出所有不是雷的方块,游戏胜利
3.2设置游戏界面为了养成良好的编程习惯,方便代码的管理,创建三个文件
扫雷的实现需要多个模块的功能相互串联,多个文件可以分别处理各自模块的功能,能更好处理各个模块之间的逻辑并且便于后期调试,也使得代码的可读性提高
void menu()
{printf("************************************\n");
printf("*****1.Play 0.exit ******\n");
printf("************************************\n");
}
int main()
{srand((unsigned int)time(NULL));
int input = 0;
do
{menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{case 1:game();
break;
case 0:printf("退出\n");
break;
default:
printf("选择错误,请重新选择:\n");
break;
}
} while (input);
return 0;
}
在game()函数中,调用各个功能
void game()
{char mine[ROWS][COLS] = {'0'};//存放布置好的雷的信息
char show[ROWS][COLS] = {'*'};//存放排查的雷的信息
//初始化
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印
DisPlayBoard(show, ROW, COL);
//DisPlayBoard(mine, ROW, COL);
//布雷
setMine(mine, ROW, COL);
//DisPlayBoard(mine, ROW, COL);
//排查雷
FindMine(mine,show,ROW,COL);
}
3.3雷盘的初始化在此,设置两个雷盘
mine雷盘:只存放雷的信息在未埋雷之前,雷盘中所有位置均为‘0’
show雷盘:存放排查的雷的信息在未排查之前,雷盘中所有位置均为‘*’
//board:传过来的雷盘
//set:雷盘中放的元素
void InitBoard(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;
}
}
}
3.4打印雷盘为了玩家方便选择位置,在雷盘中也要标记出行、列号
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;
int j = 0;
printf("----------扫雷------------\n");
//打印行号
for (i = 0; i<=col; 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");
}
3.5布雷雷的布置是随机的,因此采用rand()函数产生1-9的随机数,来实现随机坐标布雷
雷的布置均在wine雷盘中
void setMine(char mine[ROWS][COLS], int row, int col)
{int count = easy_count;//布置10个雷
while (count)
{int x = rand() % row + 1;
int y = rand() % col + 1;
//判断该位置是否有雷
if (mine[x][y] == '0')
{ mine[x][y] = '1';
count--;
}
//若该位置已有雷,则重新生成随机坐标
3.6排查雷雷的排查首先检查该位置是不是雷
如果是雷:被炸死,游戏结束
如果不是雷:显示该坐标周围雷的个数
//统计周围雷的个数
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return
mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
mine[x][y - 1] + mine[x][y + 1] +
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]
- 8 * '0';
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//1.输入排查的坐标,检查坐标
//2.判断是不是雷
//是,很遗憾你被炸了,游戏结束,打印一下所有雷的位置
//不是,统计该坐标周围有几个雷,然后将雷的数量显示在该坐标上
int x = 0;
int y = 0;
int win = 0;
//判断排完的位置的个数 与雷盘中安全位置的关系
while (winprintf("请输入你要排查的坐标:");
scanf("%d%d", &x, &y);
//判断坐标合法性
if ((x >= 1 && x<= row) && (y >= 1 && y<= col))
{ if (mine[x][y] == '1')
{ printf("很遗憾,你被炸死了\n");
//让你死的明白,打印一下雷区
DisPlayBoard(mine, row, col);
break;
}
else
{ //不是雷,统计周围几个雷
int count = get_mine_count(mine, x, y);
//由于数组中放的是字符,所以要加上‘0’
show[x][y] = count + '0';
DisPlayBoard(show, row, col);
win++;
}
}
else
{ printf("坐标不合法,请重新输入!\n");
}
}
//安全位置全部找到
if (win == row*col - easy_count)
{printf("恭喜你,排雷成功!\n");
printf("雷区分布如下:\n");
DisPlayBoard(mine, row, col);
}
}
4.完整代码
4.1game.h文件#include//显示雷盘的大小
#define ROW 9
#define COL 9
//实际雷盘的大小
#define ROWS ROW+2
#define COLS COL+2
//雷的数量
#define easy_count 79
//初始化雷盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印雷盘
void DisPlayBoard(char board[ROWS][COLS], int row, int col);
//布雷
void setMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
4.2game.c文件#include"game.h"
//初始化雷盘
void InitBoard(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 DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;
int j = 0;
printf("----------扫雷------------\n");
//打印行号
for (i = 0; i<=col; 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 setMine(char mine[ROWS][COLS], int row, int col)
{int count = easy_count;//布置10个雷
while (count)
{int x = rand() % row + 1;
int y = rand() % col + 1;
//判断该位置是否有雷
if (mine[x][y] == '0')
{ mine[x][y] = '1';
count--;
}
//若该位置已有雷,则重新生成随机坐标
}
}
//统计周围雷的个数
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return
mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
mine[x][y - 1] + mine[x][y + 1] +
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]
- 8 * '0';
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//1.输入排查的坐标,检查坐标
//2.判断是不是雷
//是,很遗憾你被炸了,游戏结束,打印一下所有雷的位置
//不是,统计该坐标周围有几个雷,然后将雷的数量显示在该坐标上
int x = 0;
int y = 0;
int win = 0;
//判断排完的位置的个数 与雷盘中安全位置的关系
while (winprintf("请输入你要排查的坐标:");
scanf("%d%d", &x, &y);
//判断坐标合法性
if ((x >= 1 && x<= row) && (y >= 1 && y<= col))
{ if (mine[x][y] == '1')
{ printf("很遗憾,你被炸死了\n");
//让你死的明白,打印一下雷区
DisPlayBoard(mine, row, col);
break;
}
else
{ //不是雷,统计周围几个雷
int count = get_mine_count(mine, x, y);
//由于数组中放的是字符,所以要加上‘0’
show[x][y] = count + '0';
DisPlayBoard(show, row, col);
win++;
}
}
else
{ printf("坐标不合法,请重新输入!\n");
}
}
//安全位置全部找到
if (win == row*col - easy_count)
{printf("恭喜你,排雷成功!\n");
printf("雷区分布如下:\n");
DisPlayBoard(mine, row, col);
}
}
4.3test.c文件#include"game.h"
#include#includevoid menu()
{printf("************************************\n");
printf("*****1.Play 0.exit ******\n");
printf("************************************\n");
}
void game()
{char mine[ROWS][COLS] = {'0'};//存放布置好的雷的信息
char show[ROWS][COLS] = {'*'};//存放排查的雷的信息
//初始化
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印
DisPlayBoard(show, ROW, COL);
//DisPlayBoard(mine, ROW, COL);
//布雷
setMine(mine, ROW, COL);
//DisPlayBoard(mine, ROW, COL);
//排查雷
FindMine(mine,show,ROW,COL);
}
int main()
{srand((unsigned int)time(NULL));
int input = 0;
do
{menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{case 1:game();
break;
case 0:printf("退出\n");
break;
default:
printf("选择错误,请重新选择:\n");
break;
}
} while (input);
return 0;
}
欢迎大家批评指正
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧