C语言编写扫雷,用c++写扫雷
最近又重新拾起了学习C语言的兴趣。复习函数递归的时候,看到了扫雷这个小游戏。我想用这篇文章来纪念我的程序修改过程。写的时候参考了系统自带的扫雷游戏,兴奋的开始写代码,所以写的时候走了很大的弯路。我用的编程软件是cfree5,因为电脑版本是32位Windows7,找不到别的编译器。哈哈哈哈哈哈哈哈。直接去下面源码,200就行。
头文件:game.h这也是我第一次尝试用头文件写代码,第一次感觉写代码的思路这么清晰。
#包含stdio.h
#include stdlib.h //这是屏幕清理函数所属的库。
#include time.h //这个函数库有生成时间戳的功能,用来生成随机数。
#include windows.h //延迟时间函数在这里,为了好看。
#定义恒(20 ^ 2)//顾名思义,这20可以随意改变扫雷接口的长度。
# define Shu(20 ^ 2)//顾名思义,垂直,这个20也是随意改的,表示宽度。
#定义雷20 //顾名思义,雷数哈哈哈哈
void邓璐();//登录界面打印
void游戏();//游戏功能
虚空初十化(char a[恒][舒]);//初始化
void(char a[heng][Shu]);//打印
void panduan(char b[恒][舒]);//判断雷霆周围的数字
void赵荀(char a[恒][舒],char b[恒][舒],char c[恒][舒],int i,int j);
//寻找可以扩散的方块,即最外侧的空白块和数字块
int dianji(char a[恒][舒],char b[恒][舒],char c[恒][舒],int i,int j);
//点击图上的方块(当然是通过写坐标)
void宝扎(char a[恒][舒],char b[恒][舒]);//打雷炸了。
int胜利(char a[恒][舒],char b[恒][舒],int m);//胜利!源文件:game.c这个地方看得出来我英语真的很差。功能名称基本都是拼音,一目了然。永远不会有重复的功能(狗头)。
#包含“game.h”
无效盘端(字符b[恒][舒])
{
int i,j;//记录每个方块的循环
int x,y;//记录当前方块的编号
int c=0;//记录号码大小(雷左右)
for(I=1;我恒-1;我)
for(j=1;j Shu-1;j)
if(b[i][j]!=*)
{
c=0;
for(x=I-1;x I 2;x)
for(y=j-1;y J2;y)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
}
虚空初石华(char a[恒][舒])
{
int r=lei
int i,j;
srand((无符号int)time(NULL));//确保每次产生的雷不一样
while(r)
{
I=rand()%(heng-2)1;
j=rand()%(Shu-2)1;
if(a[i][j]!= * )//雷不能重。
{
a[I][j]= * ;
r-;
}
}
盘端(一);
}
作废(char a[恒][舒])
{
int i,j;
printf( \ n \ t );
for(I=1;我Shu-1;我)
printf( -,I);//这个2d是左对齐还是右对齐?我都忘了
for(I=1;我恒-1;I )//这些步骤主要是为了好看。
{
printf(\n -,I);
for(j=1;j Shu-1;j)
如果(j==1)
printf( %c ,a[I][j]);
其他
printf( %c ,a[I][j]);
如果(我恒-2)
{
printf( \ n \ t );
for(j=1;j Shu-1;j)
printf(- );
}
}
}
void赵荀(char a[恒][舒],char b[恒][舒],char c[恒][舒],int i,int j)
{
int x,y;
if(I==0 j==0 I==heng-1 j==Shu-1);//屏蔽掉边缘的一切。
其他
for(x=I-1;x I 2;x)
for(y=j-1;y J2;y)
If(c[x][y]==0) //为每个搜索到的位置设置“1”以防止浪费堆栈空间。
{
c[x][y]= 1 ;
If(b[x][y]==0)//空白块直接展开,寻找下一个
{
a[x][y]= 0 ;
赵荀(a,b,c,x,y);
}
Else if(b[x][y] 0 b[x][y] 9)//数字块被记录但不被扩展。
a[x][y]=b[x][y];
}
}
int dianji(char a[heng][shu],char b[heng][shu],char c[heng][shu],int i,int j)
{
if(b[i][j]==* )
返回0;
其他
{
赵荀(a、b、c、I、j);
返回1;
}
}
void宝扎(char a[恒][舒],char b[恒][舒])
{
int i,j;
for(I=0;我恒;我)
for(j=0;j舒;j)
if(b[i][j]==* )
a[I][j]=b[I][j];
系统(“cls”);
尹达(a);//这一步是显示炸弹爆炸了。看起来更厉害。
}
int胜利(char a[恒][舒],char b[恒][舒],int m)
{
int i,j;
int s=0;
If(m=10)//这是指当标记位置等于10时的胜利判断
for(I=0;我恒;我)
for(j=0;j舒;j)
If(b[i][j]==* a[i][j]==5)//雷霆的位置与标记的位置相同。
s;
如果(s==10)
{
Printf (\ n \ n \ t \ tVictory!);
返回1;
}
其他
返回0;
}扫雷. c头文件在这里#includegame.h
无效邓璐()
{
printf( \ n \ n \ t \ t欢迎来到扫雷,请选择\ n \ n );
Printf(\t\t1。开始游戏\ n \ n’);
Printf(\t\t2。退出游戏\ n \ n \ t \ t );
}
无效游戏()
{
char a[恒][舒]={0},b[恒][舒]={0},c[恒][舒]={ 0 };
int i,j,l;
int s=1,m=0;//用于判断操作行为
int g=-1;
褚时华(乙);
而(g)
{
系统(“cls”);//每次选择后刷新页面。
尹达(b);
printf( \ n \ n \ t您可以选择一个坐标:);
scanf(%d%d ,I,j);
printf( \ n \ t1 click \ T2 mark \ n \ t您选择的操作是:);
while(s)
{
scanf(%d ,l);
开关(左)
{
案例一:g=点集(a,b,c,I,j);
s=0;
打破;
情况2:a[I][j]=5;ascii码中的符号5主要是因为好看,可以改。
s=0;
m;//标签的数量
打破;
默认值:
printf( \ n \ t请重新输入操作!);
打破;
}
}
s=1;
if(胜利(a,b,m)==1)
打破;
如果(g==0)
{
宝扎(a,b);
printf( \ n \ t幸好您击中了炸弹\ n \ n \ t game over );
}
}
}
int main()
{
int a=0,b,c;
while(1)
{
邓璐();
而(a!=2)
{
scanf(%d ,a);
开关(a)
{
1:printf( \ n \ t \ t开始你的扫雷生涯吧!);
printf( \ n \ n \ t此游戏中有%d个雷霆。玩得开心!,雷);
睡眠(2000);//刷新前等待两秒钟。
系统(“cls”);
game();
c=0;
打破;
案例二:
打破;
默认值:printf(\n\t\t输入错误,请重试\ n \ t \ t );
打破;
}
如果(c==0)
打破;
}
Printf(\n\t1是\t2否);
printf( \ n \ t您想玩另一个游戏吗?);
scanf(%d ,b);
系统(“cls”);
如果(b==2a==2)
打破;
}
系统(“cls”);
printf( \ n \ n \ t \ t感谢您的参与,我们下次再见!\ n \ n’);
返回0;
}思路:最初比较麻烦的思路:最初的思路是界面上显示多少个方块就初始化多少个数组,比如10*10个方块。要求的水平和垂直尺寸分别为10和10。这样的结果就是,你计算雷身边数字的大小,分九种情况讨论,分类分半个多小时,然后因为错别字老而改了半个小时(当然最后都删了,啧啧)。代码如下:
无效盘端(字符b[恒][舒])
{
int i,j;
int x,y;
int c=0;
for(I=1;我恒-1;我)
for(j=1;j Shu-1;j)
if(b[i][j]!=*)
{
c=0;
如果(i==0 j==0)
{
for(x=0;x2;x)
for(y=0;y 2;y)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
else if(i==heng-1 j==0)
{
for(x=恒-1;x恒-3;x -)
for(y=0;y 2;y)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
else if(i==0 j==shu-1)
{
for(x=0;x2;x)
for(y=Shu-1;y舒-3;y -)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
else if(i==heng-1 j==shu-1)
{
for(x=恒-1;x恒-3;x -)
for(y=Shu-1;y舒-3;y -)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
else if(i==0)
{
for(x=0;x2;x)
for(y=j-1;y J2;y)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
else if(j==0)
{
for(x=I-1;x I 2;x)
for(y=0;y 2;y)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
else if(i==heng-1)
{
for(x=I;x I-2;x -)
for(y=j-1;y J2;y)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
else if(j==shu-1)
{
for(x=I-1;x I 2;x)
for(y=Shu-1;y舒-3;y -)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
其他
{
for(x=I-1;x I 2;x)
for(y=j-1;y J2;y)
if(b[x][y]==* )
c,b[I][j]=c 48;
}
}
}这个地方分四面,四角,中间九个方面。某种意义上锻炼了对C语言循环的理解。
一个更方便的想法是:在你的方块周围添加另一层方块,这样当头文件被定义时,恒=20 ^ 2。这个2是指左右各加一层,所以好处是不用分类讨论,只要打印的时候不打印最外层就行。其他具体想法写在笔记里。
显示:
登录界面如图所示
游戏模式如图所示
如图,雷太少了,哈哈哈,都是直接出来的。试试踩雷。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。