提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
`
扫雷是一款经典的电脑小游戏,它的游戏规则是在一个9×9(初级)、16×16(中级)、16×30(高级)或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个),再由玩家在一定时间内依照翻开方块的提示逐个翻开不是雷方块,以找出所有地雷为最终游戏目标,如果踩到雷游戏就结束。
一、总体思路
1.扫雷游戏要2两个二位数组,一个存放雷的信息,一个存放布置好的雷的信息。
2.将’ 1’ ,'0’放进存放雷的信息的数组中.(用’1’表示雷)。
3.在排雷时输入要排查的坐标,如果不是雷则显示周围8个坐标里雷的个数直到10个雷全被找出。游戏结束。如要排查的坐标是雷,游戏结束。
二、代码实现步骤
1.头文件
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define EASY_COUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void memu();//打印菜单
void game();//游戏主体
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);//初始化游戏棋盘
void PrintfBoard(char board[ROWS][COLS],int row,int col);//打印游戏棋盘
void PutMine(char board[ROWS][COLS],int row,int col); //随机布置雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//玩家排雷
int GetMineCount(char mine[ROWS][COLS],int x,int y);//统计输入要排查的坐标周围8个坐标内雷的个数并返回
2.创建游戏菜单
代码如下(示例):
void menu()
{
printf("*****************************\n");
printf("*********1. play ************\n");
printf("*********0. exit ************\n");
printf("*****************************\n");
}
3.主函数框架
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!");
break;
default:
printf("选择错误,重新选择!");
}
}while(input);
return 0;
}
运用switch语句,输入1进入游戏,输入0退出游戏。通过do while语句先执行,后判断来实现可游玩多次。同时用input控制循环,当选择0时正好不符合while的条件退出循环。
4.初始化游戏棋盘和创建数组
1)创建数组
- 创建mine数组来存放地雷的信息,当玩家输入要排查的坐标时调用mine数组来判断。创建show数组,将棋盘和排查雷的信息显示给玩家。
- 当玩家输入的要查找的棋子坐标在边缘时,排查该坐标周围雷个数会越界访问,因此要将mine和show两个数组同时增加两行两列,由99变成1111**(用宏定义ROW
COL为 9,ROWS和COLS为ROW+2,便于棋盘大小的更改和游戏难度的提升(暂未实现))
2)初始化
有mine和show两个数组,因此同事初始化。将show数组初始化为’*‘,mine数组初始化为’0’.
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
//初始化棋盘
//1.mine数组初始化为'0'
//2.show数组初始化为'*'
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
2)打印棋盘信息
void PrintfBoard(char board[ROWS][COLS],int row,int col)
{
int i = 0;
printf("--------扫雷游戏-------\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%C ", board[i][j]);
}
printf("\n");
}
}
3)设置地雷
通过生成随机数来设置地雷,存放地雷信息的mine数组之前被全被初始化为’0’,现在让电脑随机更改10个mine数组的值为’1’来表示放置地雷。(count表示的是地雷的个数,每次成功生成一个雷时,count就减1,直到count减到0时,跳出循环。雷布置完毕。
void PutMine(char board[ROWS][COLS],int row,int col)
{
//布置10个雷
//生成随机的坐标,布置雷
int count = EASY_COUNT;
while(count)
{
int x = 0,y = 0;
x = rand() % row + 1;
y = rand() % col + 1;
if(board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
4)排查雷
1.首先定义全局变量win,每查找一个坐标win加1,直到win =行数*列数-雷的数量时,玩家排雷成功,并打印出雷的信息。
2.宏定义雷的数量为10,方便后续地雷数量的更改。
3.玩家输入要查找的坐标时,判断在mine函数中,该坐标值是否为’1’。若为1则玩家排雷失败,游戏结束、当该坐标值为’0’时,统计该坐标周围中雷的个数并赋值给show函数对应坐标中。
void FindMine(char mine[ROWS][COLS],char show[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 >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
PrintfBoard(mine, ROW, COL);
break;
}
else
{
//该位置不是雷,就统计这个坐标周围有几个雷
int count=GetMineCount(mine, x, y);
show[x][y] = count + '0';
PrintfBoard(show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
PrintfBoard(mine, ROW, COL);
}
}
5)统计要查找的坐标周围8个坐标中雷的个数
int GetMineCount(char mine[ROWS][COLS],int x,int y)
{
return (mine[x-1][y]+mine[x-1][y-1]+mine[x][y - 1]+mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1] - 8 * '0');
}
三、完整代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define EASY_COUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void memu();//打印菜单
void game();//游戏主体
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);//初始化游戏棋盘
void PrintfBoard(char board[ROWS][COLS],int row,int col);//打印游戏棋盘
void PutMine(char board[ROWS][COLS],int row,int col); //随机布置雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//玩家排雷
int GetMineCount(char mine[ROWS][COLS],int x,int y);//统计输入要排查的坐标周围8个坐标内雷的个数并返回
void menu()
{
printf("*****************************\n");
printf("*********1. play ************\n");
printf("*********0. exit ************\n");
printf("*****************************\n");
}
void game()
{
char mine[ROWS][COLS];//存放布置好的雷
char show[ROWS][COLS];//存放排查雷的信息、
//初始化棋盘
//1.mine数组初始化为'0'
//2.show数组初始化为'*'
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
//打印棋盘
PrintfBoard(show,ROW,COL);
//布置雷
PutMine(mine,ROW,COL);
//排雷
FindMine(mine,show,ROW,COL);
}
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void PrintfBoard(char board[ROWS][COLS],int row,int col)
{
int i = 0;
printf("--------扫雷游戏-------\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%C ", board[i][j]);
}
printf("\n");
}
}
void PutMine(char board[ROWS][COLS],int row,int col)
{
//布置10个雷
//生成随机的坐标,布置雷
int count = EASY_COUNT;
while(count)
{
int x = 0,y = 0;
x = rand() % row + 1;
y = rand() % col + 1;
if(board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
void FindMine(char mine[ROWS][COLS],char show[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 >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
PrintfBoard(mine, ROW, COL);
break;
}
else
{
//该位置不是雷,就统计这个坐标周围有几个雷
int count=GetMineCount(mine, x, y);
show[x][y] = count + '0';
PrintfBoard(show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
PrintfBoard(mine, ROW, COL);
}
}
int GetMineCount(char mine[ROWS][COLS],int x,int y)
{
return (mine[x-1][y]+mine[x-1][y-1]+mine[x][y - 1]+mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1] - 8 * '0');
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!");
break;
default:
printf("选择错误,重新选择!");
}
}while(input);
return 0;
}
总结
以上就是C语言实现简单的扫雷游戏,本文仅仅简单实现了扫雷的基本功能,而改变难度难度,排雷展开等还为未实现。但是比较适合新手练习。如果本文对你起到了帮助,你可以点个赞,谢谢支持。