目录
1>>前言
感谢大家对之前文章的喜欢,非常感谢!昨天没更新是在写扫雷,我写了6h20m,今天我给大家带来的是扫雷,我也是个小白,代码写的有问题可以提出来,我会吸取教训,做的更好,谢谢大家!后面会附上原代码!
2.1>>扫雷需要做,思路是怎么样的?
首先,我们通常玩的扫雷是点击的,并且功能较为完善,点非炸弹就显示周围有多少炸弹,并且还有难度可以选择,有棋子可以标记,有时间正数。当我刚想写扫雷的时候,我感觉这太难了,至少我现在所学是比较困难的,所以我们现在只能写一个较为简单的版本,后面在优化。这是一个效果图,如果和我一样的小白想做可以尝试一下。
2.1.1>>第一步:菜单
菜单的操作就比较简单了,在前面的猜数字文章我也讲到过,我们在主函数连接一个名为menu的菜单,定义为无返回值,然后在里面进行printf操作即可。
菜单结束我们需要选择,这里选错还是选玩游戏都要重复进行操作,所以我们需要使用循环解决这类问题,然后在使用switch语句判断即可。这里的game是游戏内容的函数,可以自定义。
2.1.2>>第二步:难度选择
前面的图可以看到我的难度有3个,分别是简单、中等、困难,它们对应着不同的行和列,所以我们这里要写if或switch语句判断,再接着数组里要用到不同数字,所以我们用宏定义来解决。
row代表行,col代表列,另外要使x1,y1都能使用在其他地方,就得将它们定义成全局变量!rows在下面解释
2.1.3>>第三步:化繁为简,初始化棋盘
做初始化,我第一个想到的就是数组,这里我们需要用到二维数组,因为它有行和列,所以在这里先定义一个数组,然后写一个函数对该数组进行操作。我选择用两个二维数组,一个放地雷,一个放我们显示的*号和数字。将'1'字符1设置为地雷,字符'0'设置为非雷,我们显示就用'*'。
这边直接叫初始化的中文全拼,其他我也是一样,数组1用雷,数组二用数作为名字,方便自己也方便大家读代码。这边数组行列用rows和cols是因为要加两行,这时候我们定义的非零就有用了,判断雷的时候在边角可能就会越界,所以加两行。这里初始化传参的时候,两个数组大差不差,所以用同一个函数,那要实现分别初始化,我们就得传字符0和字符*号。
这里要注意数组的类型为字符型,行列是整型,set是字符型。
2.1.4>>第四步:显示棋盘看看
这里显示棋盘可以看到我们之前的代码有没有什么问题,并做出相应改变。显示这里比较简单,要注意的就是周围的数字可以一起打印,方便玩家看。
2.1.5>>第五步:插雷
现在需要给第一个数组插上雷,因为我们需要的效果是雷的随机分布,所以也要用到我们前两章讲解的随机数,这边附上链接,不懂的可以看看猜数字完全体?还能优化不?-CSDN博客,每插一个雷,就将需要的雷减减,直至归零。
2.1.6>>第六步:排雷代码
就这里要写的是最多的,大家放心食用,首先,输入要扫的位置,给上scanf输入函数,让玩家输入,然后进行判断(arr1表示雷,arr2表示数),这个坐标在arr1里是否是雷,若是则游戏结束,若不是则计算周围雷数。这里我们需要实现在第二个数组上显示周围雷的数字,就是我们需要判断周围有几个'1'已知这个字符1在ASCII码中是49,而字符0是48。我们只需要计算周围的坐标内容是否等于'1'也就是49就好,理论成立。这里就用函数计算jusuan。最后返回的值用字符s接收,因为我们算出来的是一个整形,所以加上'0'也就是48就可以得到字符型,在我们的字符数组就不会出错。此时已经完成大半,最终胜利条件满足就显示雷棋盘就好。
附:代码
#include<stdio.h>
#include<stdlib.h>//随机数头文件
#include<time.h>//时间头文件
#include<windows.h>
int x1=0;
int y1=0;
int L1=0;
void menu()//菜单
{
printf("******扫雷小游戏******\n");
printf("****** 1.play ******\n");
printf("****** 2.eixt ******\n");
printf("**********************\n");
printf("******作者:feng******\n");
}
void nandu()//难度
{
int m=0;
printf("** 设置游戏难度 **\n");
printf("** 1.简单9乘9,10颗雷 **\n");
printf("** 2.中等16乘16,40颗雷 **\n");
printf("** 3.困难30乘16,99颗雷 **\n");
printf("****** 作者:feng ******\n");
printf("请选择:>") ;
scanf("%d",&m);
if (m==1)
{
x1=9;
y1=9;
L1=10;
}
else if (m==2)
{
x1=16;
y1=16;
L1=40;
}
else if (m==3)
{
x1=30;
y1=16;
L1=99;
}
else
{
printf("输入错误,吴迪了孩纸,返回主菜单\n");
}
#define row x1
#define col y1
#define rows x1+2
#define cols y1+2
}
void chushihua(char arr[rows][cols],int x,int y,char set)//初始化函数
{
int i=0;
for (i=1;i<=x;i++)
{
int j=0;
for (j=1;j<=y;j++)
{
arr[i][j]=set;
}
}
}
void xianshi(char arr[rows][cols],int x,int y)//显示函数
{
int i=0;
printf("00 ");
for (i=1;i<=y;i++)
{
printf("%02d ",i);
}
printf("\n\n");
for (i=1;i<=x;i++)
{
printf("%02d ",i);
int j=0;
for (j=1;j<=y;j++)
{
printf("%c ",arr[i][j]);
}
printf("\n");
}
}
void chalei(char arr[rows][cols],int x,int y)
{
int xx=L1;
while (xx)
{
int h=rand() % x+1;
int l=rand() % y+1;
if (arr[h][l] != '1')
{
arr[h][l] = '1';
xx--;
}
}
}
int jisuan(char arr1[rows][cols],int h,int l)
{
int i=0;
int sum=0;
for (i=h-1;i<h+2;i++)
{
int j=0;
for (j=l-1;j<l+2;j++)
{
if (arr1[i][j] == '1')
{
sum++;
}
}
}
return sum;
}
void pailei(char arr1[rows][cols],char arr2[rows][cols],int x,int y)
{
int win=x*y-L1;
do
{
int h=0,l=0;
printf("请输入你要扫的位置,如\"2 3\":>");
scanf("%d %d",&h,&l);
if (arr1[h][l]=='1')
{
printf("你踩雷了,游戏结束\n");
printf("————————————————————————————\n") ;
xianshi(arr1,row,col);
printf("————————————————————————————\n") ;
break;
}
else
{
char s=jisuan(arr1,h,l)+'0';
arr2[h][l]=s;
win--;
xianshi(arr2,row,col);
}
}while (win);
if (win==0)
{
printf("游戏胜利,太nb啦\n");
printf("这是雷区分布:\n");
printf("————————————————————————————\n") ;
xianshi(arr1,row,col);
printf("————————————————————————————\n") ;
}
}
void game()//游戏内容
{
nandu();
//分为四步:1.初始化棋盘
// 2.显示棋盘
// 3.插雷进去
// 4.排雷开始
//定义两个数组,一个放雷,一个放数字
char lei[rows][cols];
char shu[rows][cols];
chushihua(lei,row,col,'0');
chushihua(shu,row,col,'*');
// xianshi(lei,row,col);
// xianshi(shu,row,col);
chalei(lei,row,col);
// xianshi(lei,row,col);
xianshi(shu,row,col);
pailei(lei,shu,row,col);
}
int main()//主函数
{
srand((unsigned int)time(NULL));
int n=0;
do
{
menu();
printf("请选择:>");
scanf("%d",&n);
switch (n)
{
case 1:
printf("扫雷小游戏开始\n");
game();
break;
case 2:
printf("爱玩不玩,退出游戏\n");
n=0;
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (n);
return 0;
}
3>>总结
简单扫雷到这里也就结束了,没写感觉挺难,但是思路清晰感觉也还可以,没有想象中的那么难,希望这篇文章能给小白一点帮助。这篇文章耗时1h34m,个人感觉写的比前面的好了,但离优质文章还有很长一段路要走,希望大佬多多给点建议,多多指点,小编在此感激不尽!谢谢!
标签:int,代码,详解,扫雷,数组,printf,2.1,col,row From: https://blog.csdn.net/m0_69282950/article/details/141226061