1.扫雷游戏规则
随机点开一个格子,可能会出现雷,数字,若点开的数字是1,则表明该格子周围一圈八个格子有一个雷,如果点到雷游戏结束,如果点完所有非雷部分的格子,则扫雷成功!!
2.游戏各部分功能实现的函数
void menu()//菜单函数
void find_mine(char mine[][11], char show[][11], int row, int col);//排查雷函数
void Initboard(char arr[][11], int rows,int cols,char set);//初始化函数
void Printboard(char arr[][11], int row, int col);//打印函数
void Set_mine(char arr[][11], int row, int col);//设置雷的函数
3.游戏菜单页面
void menu()
void menu()
{
printf("***********************************************\n");
printf("******************扫雷游戏*********************\n");
printf("***********************************************\n");
printf("****************1.开始游戏*********************\n");
printf("***********************************************\n");
printf("****************0.退出游戏*********************\n");
printf("***********************************************\n");
printf("***********************************************\n");
}
4.游戏实现函数
void game()
{
char mine[11][11] = { 0 };
char show[11][11] = { 0 };
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
//Printboard(mine, ROW, COL);
//Printboard(show,ROW, COL);
Set_mine(mine, ROW, COL);
Printboard(mine, ROW, COL);
find_mine(mine, show, ROW, COL);
}
5.测试函数(界面选择测试函数)
void test()
{
int input = 0;
do
{
menu();
printf("请选择->\n");
scanf_s("%d", &input);
switch (input)
{case 1:
game();
break;
case 0:
printf("游戏已退出,谢谢使用!!!!\n");
break;
default:
printf("输入错误,请重新选择\n");
}
} while (input);
}
6.主函数
int main()
{
srand((unsigned int)time(NULL));
test();
return 0;
}
7.游戏实现函数各部分
game.h头文件声明游戏实现函数各部分
#pragma once
#include
#include
#include
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void find_mine(char mine[][11], char show[][11], int row, int col);//排查雷函数
void Initboard(char arr[][11], int rows,int cols,char set);//初始化函数
void Printboard(char arr[][11], int row, int col);//打印函数
void Set_mine(char arr[][11], int row, int col);//设置雷的函数
game.c实现各个游戏功能
void Initboard(char arr[][11], int rows,int cols, char set)//初始化函数
{int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
arr[i][j] = set;}
}
}
游戏的实现方法,mine二维数组里存放的是雷的信息,show二维数组里展示的是游戏的运行信息,首先初始化show数组里面放入字符*表示未点开,而mine数组里存放的全是0,表示还未设置雷。(数组用的为11*11,防止越界,打印只打印中间的9*9
)
void Printboard(char arr[][11], int row, int col)//打印函数
{
int i = 0;
int j = 0;
printf("---------------------扫雷游戏------------------\n");
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <=col; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("---------------------扫雷游戏------------------\n");
}
打印函数,为了更方便确定位置坐标,在打印的前1行,前一列打印出数字。此时加上分割符会更加清晰,美观且容易区分。
void Set_mine(char arr[][11], int row, int col)
{
int count = 10;//雷的个数
int x = 0;
int y = 0;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
设置雷的函数
定义设置雷的横纵坐标x,y;while循环一次只设置一个雷,每次设置完count--;直到十个雷设置完成;随机的产生随机数对9取余得到的是0~8的数,然后+1,得到1~9的数,在mine数组中如果没有设置雷,则为字符0,产生随机数头文件应包括
#include
#include
产生随机数必须在主函数
srand((unsigned int)time(NULL));
图中的1为 随机数生成雷的位置
void find_mine(char mine[][11], char show[][11], int row, int col)
{
int win = 0;
int x = 0;
int y = 0;
while (win= 1 && x <= 9 && y >= 1 && y <= 9)
{
if (mine[x][y] == '1')
{
printf("你踩到雷了\n");
Printboard(mine, ROW, COL);
break;
}
else
{
int num = getcount(mine, x, y);
show[x][y] = num + '0';
Printboard(show, ROW, COL);
win++;
}
}
else
{
printf("输入坐标不合法\n");
}
}
if (win == row * col - 10)
{
printf("扫雷成功,真牛啊你小子\n");
Printboard(show, ROW, COL);
}
}
扫雷函数
电脑输入合法的坐标,如果在mine数组中该坐标有雷,则游戏结束,打印出mine数组让玩家可以看到哪里有雷,并且从循环中退出来,如果该坐标没有雷,则此时调用
int getcount(char mine[][11], int x, int y)
统计该坐标周围一圈八个雷的数目 ,由于设置雷的地方放的是字符‘1’,没放雷的地方是字符‘0’,这里唯一的好处就是将周围八个字符加起来减去8*‘0’得到的数字就是周围一圈的雷数,(‘1’-‘0’=1),然后getcount函数返回雷数,
求取雷数函数
int getcount(char mine[][11], int x, int y)
{
return (mine[x][y - 1] + mine[x][y + 1] +
mine[x - 1][y] + mine[x + 1][y] +
mine[x - 1][y - 1] + mine[x - 1][y + 1] +
mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * '0');
}
然后需要往中间空格填入雷数,因为此时返回的是int类型+‘0’得到字符类型填入中间格子,并打印出show展示出来,因为要不断的循环,直到游戏结束,则扫雷的过程写在循环中,当踩到雷了可以break跳出循环,循环结束的条件是点开所有不是雷的格子,表明所有的雷已经扫完。
为了方便演示count设置成80,也就是80个雷,
8.退出游戏
总结
1.扫雷界面实现
2.扫雷的游戏规则
3.mine数组存放雷的信息,show数组排查出雷的信息,防止越界,数组多开一行一列
4.数组初始化mine函数全是0(未布置雷),show数组全是*;
5.打印棋盘,数组用的是11*11,行列操作为9*9;
6.打印出棋盘,无法准确具体的坐标,在打印棋盘时,先打印一行,一列坐标
7.棋盘格适当加分割符美观容易区分
8.布置雷,随机生成二位的坐标,判断如果没雷就可以填入雷,直到雷布置满,循环
9.排查雷,确定坐标合法性,是雷的话,打印一下雷的mine数组并提示踩到雷了,不是的话,统计一下周围雷的个数,每个字符加起来减去8个字符0,如果是10个雷的话,9*9共八十一次,
如果输入71次坐标没踩到雷,游戏结束了,扫雷成功
如果有不对的地方请大佬纠正, 谢谢啦!!!希望能帮助到大家