今天我们写一个小游戏——扫雷来增加我们对编程的兴趣
希望这篇文章对友友们有帮助!
这里我们需要是三个文件
test.c —— 游戏的测试
game.h —— 游戏函数的声明
game.c —— 游戏函数的实现
游戏菜单
游戏菜单,就像名字一样,是为了方便我们对游戏进行选择。
这里我们创建一个 函数menu 来引导我们开始游戏。
menu函数的功能
1.游戏的开始
2.游戏的退出
3.当选择错误时,重新选择
void menu()
{
//目录
printf("*******************************\n");
printf("************* 1.play **********\n");
printf("************* 0.exit **********\n");
printf("*******************************\n");
}
扫雷游戏要存储布置好的雷,需要一个二维数组。
这里我们需要创建两个二维数组
一个用来存放雷 char mine[][]
一个用来展示该点附近八个坐标雷的个数char show[][]
其实本质上我们只需要一个 9 * 9的数组来存放我们的数据
但是当我们想要统计边上坐标附近有几个雷时,我们发现有
一些坐标越界了,所以我们创建一个11*11的数组把边上坐标
附近的空间变成我们自己的。
char mine[ROWS][COLS];//存放布置好的雷 ROWS=11
char show[ROWS][COLS];//存放排查好的雷 COLS=11
这里我们创建一个 Initboard函数 来初始化我们的棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols, char ret)
{
int i = 0;
for (i = 0; i <rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = ret;
}
}
}
然后我们需要把棋盘给打印出来,给玩家进一步游戏。
这里我们创建一个 Displayboad函数 把我们的棋盘打印出来。
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf("--------扫雷游戏-------\n");
for (i = 0; i <= row; i++)
printf(" %d", i);//打印出我们的列标
printf("\n");
for (i = 1; i <= row; i++)
{
int j = 0;
printf(" %d", i);//打印出我们的行标
for (j = 1; j <= 9; j++)
{
printf(" %c", board[i][j]);
}
printf("\n");
}
}
注:因为玩家感知到的棋盘是9行9列的,所以我们只
需要打印出9行9列的棋盘就可以了。
mine数组的棋盘最开始全是‘0’
show数组的棋盘最开始全是*’
想要完成布置雷,我们需要生成随机数。
生成随机数我们需要调用 rand() 函数,而使用rand函数我们又要调用函数 srand((unsignedint)time(NULL)) 这个函数只需要调用一次,我们可以把他放到主函数中
这里我们需要调用这两个头文件
1.
2.
布置雷时需要注意:
1.生成的随机数在1~9之间
x = rand() % row + 1;
y = rand() % row + 1;
2.判断布置的雷是否成功
这里我们创建一个SetMine函数来实现我们的布置雷!
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int x, y;
int count = EasyCount;//布置雷的个数
while (count)
{
x = rand() % row + 1;
y = rand() % row + 1;
if (mine[x][y] == '0')//判断雷是否布置成功
{
mine[x][y] = '1';
count--;
}
}
}
排查雷时我们需要注意:
1.当排查到雷游戏结束
2.当排查到的不是雷时我们需要把该点附近八个坐标雷的
个数放的我们shou数组棋盘中
我们需要创建一个***GetMineCount函数***来计算该点附近
八个坐标雷的个数
int GetMineCount(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');
}
3.判断玩家输入的位置是否正确。
这里我们创建FindMine函数
来实现我们的排查雷
4.判断我们的雷什么时候全部排完
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int win = 0;
while (win<(ROW*COL- EasyCount))//判断雷是否全部排完
{
int x, y;
printf("请输入坐标,中间用空格隔开");
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 = GetMineCount(mine, x, y);
show[x][y] = count + '0';
win++;//成功排完一个雷
Displayboard(show, ROW, COL);
}
}
else
printf("坐标非法,重新输入\n");
}
if (win == (ROW * COL - EasyCount))
{
printf("恭喜你,排雷成功");
Displayboard(mine, ROW, COL);
}
}
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EasyCount 10//设置雷的数量
void Initboard(char mine[ROWS][COLS], int row, int col, char ret);//初始化棋盘
void Displayboard(char mine[ROWS][COLS], int row, int col);//棋盘打印
void SetMine(char mine[ROWS][COLS], int row, int col);//布置雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷
#include"game.h"
//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols, char ret)
{
int i = 0;
for (i = 0; i <rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = ret;
}
}
}
//棋盘打印
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf("--------扫雷游戏-------\n");
for (i = 0; i <= row; i++)
printf(" %d", i);
printf("\n");
for (i = 1; i <= row; i++)
{
int j = 0;
printf(" %d", i);
for (j = 1; j <= 9; j++)
{
printf(" %c", board[i][j]);
}
printf("\n");
}
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int x, y;
int count = EasyCount;
while (count)
{
x = rand() % row + 1;
y = rand() % row + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int GetMineCount(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)
{
int win = 0;
while (win<(ROW*COL- EasyCount))
{
int x, y;
printf("请输入坐标,中间用空格隔开");
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 = GetMineCount(mine, x, y);
show[x][y] = count + '0';
win++;
Displayboard(show, ROW, COL);
}
}
else
printf("坐标非法,重新输入\n");
}
if (win == (ROW * COL - EasyCount))
{
printf("恭喜你,排雷成功");
Displayboard(mine, ROW, COL);
}
}
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//目录
void menu()
{
printf("***************************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("***************************\n");
}
void game()
{
char mine[ROWS][COLS];//存放布置好的雷
char show[ROWS][COLS];//存放排查好的雷、
//初始化棋盘
Initboard(mine, ROWS, COLS, '0');//mine函数最开始全是‘0’
Initboard(show, ROWS, COLS, '*');//show函数最开始全是‘*’
//棋盘打印
Displayboard(show, ROW, COL);
//布置雷
SetMine(mine, ROW, COL);
//排查雷
FindMine(mine, show, ROW, COL);
}
int main()
{
srand((unsigned)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;
}