hi,大家好啊!学习了有一段时间的C语言了。今天我来尝试下独立编写一个扫雷游戏,也是对我这段时间学习的总结啦。在设计的过程中我会尽可能把我的思路分享出来!
1.设计思路
1.1扫雷游戏的功能说明
1.2游戏的分析和设计
我觉得呢,设计的第一步就是需要设计一个棋盘。这个棋盘式9*9的一个棋盘。然后呢这个棋盘中呢我们假设,如果没有雷那存放0,如果有雷就存放1。
空棋盘
char mine[11][11] = {0};//用来存放布置好雷的信息
char show[11][11] = {0};//用来存放排查出雷的个数的信息
1.3文件结构的设计
其实呢,在代码的实现中,对于代码文件的管理是很有必要的。良好的文件结构,可以大大提高我们的工作效率,也可以增加代码的保密性。⼀般情况下,函数的声明、类型的声明放在头⽂件(.h)中,函数的实现是放在源⽂件(.c)⽂件中。
那么这次我们可以,设计三个文件。
test.c //⽂件中写游戏的测试逻辑
game.c //⽂件中写游戏中函数的实现等
game.h//⽂件中写游戏需要的数据类型和函数声明等
大概的思路我们已经理清楚了,接下来的细节就需要在代码中实现啦!我们接下来就开始设计代码。
2.扫雷游戏代码实现
首先,我们先建立一个新的项目,项目中建立三个上面讲过的文件。
1.首先,我觉得我们可以设计一个菜单,让玩家选择是否进入,如果选择进入游戏,再进行扫雷游戏,否则就退出游戏。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu()
{
printf("欢迎来到扫雷游戏\n");
printf("******************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("******************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>\n");
scanf("%d", &input);//输入值
switch (input)
{
case 1:
break;
case 0:
printf("退出游戏\n");
break;
}
} while (input);
2.选择进入游戏后,我们需要开始设计扫雷游戏了。进入后首先我们需要的就是把棋盘初始化,也就是说需要两个11*11的棋盘。第一个用来存放雷,第二个用来存放雷的个数。初始化就是让第一个存放雷的棋盘都是0;第二个存放雷个数的都是*。
3.显示棋盘,其实对于棋盘我们只需要显示9*9个就可以了。
显示效果
4.棋盘布置完成后,我们就需要把雷设计到棋盘中,随机设计雷的位置。首先想到的就是rand()函数来设计随机值,因为rand是随机要把他设计到1-10中,所以我们可以给rand()%10+1。在有了随机值以后其实就很好设计雷了。
5.在布置完成后就是找雷了,也是游戏能否正常运行的关键。其实在找雷的过程中我们需要的是判断,坐标是否是雷,如果是雷就退出游戏,如果不是雷,就判断他周围有几个雷,再把周围雷的个数,写在展示棋盘上。
void FindMine(char mineboard[ROWS][COLS], char showboard[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<row*col- EASY_COUNT)
{
printf("请输入排查的坐标:>");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y> 0 && y <= col)
{
if (showboard[x][y] == '*')
{
if (mineboard[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(mineboard, ROW, COL);
break;
}
else
{
int count = AroundMine(mineboard, x, y);
showboard[x][y] = count + '0';
DisplayBoard(showboard, ROW, COL);
win++;
}
}
else
{
printf("坐标已经排查过了,请重新输入\n");
}
}
else
{
printf("坐标越界,请重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,你赢了\n");
DisplayBoard(mineboard, ROW, COL);
}
}
上面是找雷函数,仅供大家参考。
6.接下来我们把运行效果展示下
7.完整代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu()
{
printf("欢迎来到扫雷游戏\n");
printf("******************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("******************\n");
}
void game()
{
char mine[ROWS][COLS];//存放雷的棋盘
char show[ROWS][COLS];//存放雷个数的棋盘
//初始化棋盘
//mine棋盘上一开始都是'0'
//show棋盘上一开始都是'*’
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘
DisplayBoard(show, 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;
}
} while (input);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
//棋盘初始化
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 mineboard[ROWS][COLS],char showboard[ROWS][COLS], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)//棋盘初始化的函数
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)//显示棋盘内部函数
{
printf("------扫雷游戏------\n");
for (int i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
//判断选择的坐标周围几个雷
static int AroundMine(char mineboard[ROWS][COLS], int x, int y)
{
return (mineboard[x - 1][y] + mineboard[x - 1][y - 1] + mineboard[x][y - 1] + mineboard[x + 1][y - 1] + mineboard[x + 1][y] +
mineboard[x + 1][y + 1] + mineboard[x][y + 1] + mineboard[x - 1][y + 1] - 8 * '0');
}
//找雷
void FindMine(char mineboard[ROWS][COLS], char showboard[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<row*col- EASY_COUNT)
{
printf("请输入排查的坐标:>");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y> 0 && y <= col)
{
if (showboard[x][y] == '*')
{
if (mineboard[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(mineboard, ROW, COL);
break;
}
else
{
int count = AroundMine(mineboard, x, y);
showboard[x][y] = count + '0';
DisplayBoard(showboard, ROW, COL);
win++;
}
}
else
{
printf("坐标已经排查过了,请重新输入\n");
}
}
else
{
printf("坐标越界,请重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,你赢了\n");
DisplayBoard(mineboard, ROW, COL);
}
}