扫雷(简易版):
游戏规则:电脑随机生成雷,玩家随机扫一个坐标,如果该坐标是生成雷的位置,则踩到雷。如果没有则显示该坐标附近八个坐标雷的总数,一直循环至所有不是雷的坐标全部扫完
下面图片红色代表雷,黑色代表非雷
思路:
一、创建两个二维数组存放棋盘(一个为玩家操作棋盘,另一个用来存放雷的棋盘)
二、初始化棋盘
三、打印玩家操作棋盘
四、电脑随机生成雷
五、玩家操作并判断该坐标周围有多少雷,如果玩家操作的坐标在存放雷的棋盘中是雷,那么就踩到雷,是否踩到雷需要两个棋盘比较,如果没有踩到雷,则打印出操作后的棋盘。
六、胜利的条件为操作的步数等于棋盘的总格数减去雷占用的格数,即如果全部非雷的坐标都被扫过并没有踩到雷,那么就胜利
#include
#include
#include
#define hang 10
#define lie 10
#define hangs hang+2
#define lies lie+2
void chushi(char arr[hangs][lies], int h, int l,char set);//初始化
void print(char arr[hangs][lies], int h, int l);//打印棋盘
void computer(char arr[hangs][lies],int p);//电脑随机生成雷
int jud(char arr[hangs][lies], int x, int y);//判断坐标周围雷的总数
void play(char arr[hangs][lies], char arr2[hangs][lies], int h, int l,int p);//玩家操作
首先初始化棋盘函数,将两个棋盘全部初始化
void chushi(char arr[hangs][lies], int h, int l,char set)//初始化棋盘
{
int x, y;
for (x = 0; x < h; x++)
{
for (y = 0; y < l; y++)
{
arr[x][y] = set;
}
}
}
打印棋盘函数,根据自己想要的效果可修改
void print(char arr[hangs][lies], int h, int l)//打印棋盘
{
int x = 0, y = 0;
for (y = 1; y < l - 1; y++)
{
printf(" %d ", y);
}
printf("\n");
printf("|");
for (y = 1; y < l - 1; y++)
{
printf("---|");
}
printf("\n");
for (x = 1; x < h - 1; x++)
{
printf("|");
for (y = 1; y < l - 1; y++)
{
printf(" %c |", arr[x][y]);
}
printf("%d", x);
printf("\n");
printf("|");
for (y = 1; y < l - 1; y++)
{
printf("---|");
}
printf("\n");
}
}
棋盘效果如下
接着电脑随机生成雷的坐标,这里用1来表示雷,以下代码中 p为玩家自定义雷的总数
void computer(char arr[hangs][lies], int p)//电脑布置雷
{
//p为雷的总数,由玩家赋值
do
{
//电脑随机生成雷的位置的下标
int x = rand() % hang + 1;
int y = rand() % lie + 1;
if (arr[x][y] == '#')
{
arr[x][y] = '1';
p--;
}
} while (p);
}
判断玩家操作的坐标附近有多少个雷,如果附近的其中一个坐标是雷(雷用1来表示),则总数加1(变量i为总数)
int jud(char arr[hangs][lies], int x, int y)//判断扫雷的坐标附近八个坐标一共有多少个雷
{
int i = 0;
if (arr[x - 1][y - 1] == '1')
i++;
if (arr[x - 1][y] == '1')
i++;
if (arr[x - 1][y + 1] == '1')
i++;
if (arr[x][y - 1] == '1')
i++;
if (arr[x][y + 1] == '1')
i++;
if (arr[x + 1][y - 1] == '1')
i++;
if (arr[x + 1][y] == '1')
i++;
if (arr[x + 1][y + 1] == '1')
i++;
return i;
}
最后玩家操作
void play(char arr[hangs][lies], char arr2[hangs][lies], int h, int l,int p)//玩家操作
{
int x = 0, y = 0;
int a, win = 0;
//胜利的条件为操作的步数等于棋盘的总格数减去雷占用的格数
while (win= 1 && x <= h && y >= 1 && y <= l)//判断输入的坐标是否有效
{
a = jud(arr2, x, y);//记录坐标附近有多少雷
//如果该坐标上存放雷的棋盘为1,则踩到雷
if (arr2[x][y] == '1')
{
printf("踩到雷了\n");
break;
}
//如果该坐标上操作的棋盘还未扫过,则记录并打印附近雷的总数
if (arr[x][y] == '*')
{
arr[x][y] = a + '0';
print(arr, hangs, lies);
win++;
}
//若该坐标已被占用
else
printf("这个坐标已被占用\n");
}
//判断输入的坐标是否有效
else
printf("输入坐标有误\n");
}
if (win == hang * lie - p)
printf("恭喜你,赢了\n");
}
以上代码就是游戏功能所用到的函数,接下来是主函数部分
void meu()//打印选择菜单
{
printf("*****************************\n");
printf("***1、玩游戏 0、退出游戏***\n");
printf("*****************************\n");
}
void game()
{
int p;
printf("请输入雷的总数:");
scanf("%d", &p);
//创建数组
char arr1[hangs][lies] = { 0 };//操作棋盘
char arr2[hangs][lies] = { 0 };//存放雷的棋盘
//初始化数组
chushi(arr1, hangs, lies, '*');
chushi(arr2, hangs, lies, '#');
//打印棋盘
print(arr1, hangs, lies);
//电脑生成随机雷
computer(arr2, p);
//玩家操作
play(arr1, arr2, hang, lie, p);
}
int main()
{
int i = 0;
srand((unsigned)time(NULL));//设置随机种子
do
{
meu();
printf("请输入你的选择:");
scanf("%d", &i);
switch (i)
{
case 0:
printf("退出成功\n");
break;
case 1:
game();
break;
default:
printf("输入错误\n");
break;
}
} while (i);
return 0;
}
这就是一个完整的简易版扫雷过程,可以在单个c文件里完成,不过建议分文件完成。
进阶版:利用递归实现坐标展开功能
C语言--扫雷进阶版,实现周围坐标展开_标仔22的博客-CSDN博客