C++实现扫雷(最简单版)
Posted 吴同学132
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现扫雷(最简单版)相关的知识,希望对你有一定的参考价值。
大家好,这几天心血来潮想做一个扫雷程序,于是花费我20分钟时间做了一个,这可能是目前最简单的一个了(也是最简陋的),新手容易理解。
直接上代码
#include<cstdio>
#include<windows.h>
#include<cstdlib>
#include<ctime>
using namespace std;
char a[17][31],c[17][31];
int b[17][31];
int m,n,l,ch=5,flag,l1,l2,sl;
void kg(int x,int y)
if(a[x][y]==*)
return ;
if(x-1!=0&&y-1!=0)
if(c[x-1][y-1]==.)
l2++;
c[x-1][y-1]= ;
if(b[x-1][y-1]==0)
kg(x-1,y-1);
if(x-1!=0)
if(c[x-1][y]==.)
l2++;
c[x-1][y]= ;
if(b[x-1][y]==0)
kg(x-1,y);
if(x-1!=0&&y!=m)
if(c[x-1][y-1]==.)
l2++;
c[x-1][y-1]= ;
if(b[x-1][y-1]==0)
kg(x-1,y-1);
if(y-1!=0)
if(c[x][y-1]==.)
l2++;
c[x][y-1]= ;
if(b[x][y-1]==0)
kg(x,y-1);
if(y!=m)
if(c[x][y+1]==.)
l2++;
c[x][y+1]= ;
if(b[x][y+1]==0)
kg(x,y+1);
if(x!=n&&y-1!=0)
if(c[x+1][y-1]==.)
l2++;
c[x+1][y-1]= ;
if(b[x+1][y-1]==0)
kg(x+1,y-1);
if(x!=n)
if(c[x+1][y]==.)
l2++;
c[x+1][y]= ;
if(b[x+1][y]==0)
kg(x+1,y);
if(x!=n&&y!=m)
if(c[x+1][y+1]==.)
l2++;
c[x+1][y+1]= ;
if(b[x+1][y+1]==0)
kg(x+1,y+1);
int num(int x,int y)
if(a[x][y]==*)
return 0;
int ans=0;
if(x-1!=0&&y-1!=0)
if(a[x-1][y-1]==*)
ans++;
if(x-1!=0)
if(a[x-1][y]==*)
ans++;
if(x-1!=0&&y!=m)
if(a[x-1][y+1]==*)
ans++;
if(y-1!=0)
if(a[x][y-1]==*)
ans++;
if(y!=m)
if(a[x][y+1]==*)
ans++;
if(x!=n&&y-1!=0)
if(a[x+1][y-1]==*)
ans++;
if(x!=n)
if(a[x+1][y]==*)
ans++;
if(x!=n&&y!=m)
if(a[x+1][y+1]==*)
ans++;
return ans;
int main()
srand((unsigned)time(NULL));
for(int i=1;i<=16;i++)
for(int j=1;j<=30;j++)
a[i][j]= ,c[i][j]=.;
while(ch!=1&&ch!=2&&ch!=3&&ch!=4)
printf("1、初级(9X9,10颗雷)\\n");
printf("2、中级(16X16,40颗雷)\\n");
printf("3、高级(30X16,99颗雷)\\n");
printf("4、自定义\\n");
printf("5、图例\\n");
printf("请输入模式编号:");
scanf("%d",&ch);
if(ch==1)
m=9,n=9,l=10;
else if(ch==2)
m=16,n=16,l=40;
else if(ch==3)
m=30,n=16,l=99;
else if(ch==4)
printf("请输入列数(9-30):");
scanf("%d",&m);
if(m>30)
m=30;
else if(m<9)
m=9;
printf("请输入行数(9-16):");
scanf("%d",&n);
if(n>16)
n=16;
else if(n<9)
n=9;
printf("请输入雷数(10-99):");
scanf("%d",&l);
if(l>99)
l=99;
else if(l<10)
l=10;
if(l==n*m)
l--;
else if(ch==5)
printf("加载中...\\n\\n");
system("cls");
printf("\\".\\"-->此格子未被点击过\\n");
printf("\\"*\\"-->雷\\n");
printf("\\" \\"-->空\\n");
printf("\\"&\\"-->被标记为雷\\n");
printf("\\"?\\"-->被标记为不知道\\n\\n\\n");
Sleep(3000);
else
printf("\\n输入有误\\n请重新输入!");
Sleep(500);
system("cls");
printf("加载中...\\n\\n");
sl=l;
system("cls");
printf(" %d X %d , %d 颗雷\\n",m,n,l);
for(int i=1;i<=l;i++)
int x,y;
x=rand()%n;
if(x==0)
x=n;
y=rand()%m;
if(y==0)
y=m;
if(a[x][y]==*)
i--;
a[x][y]=*;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
b[i][j]=num(i,j);
while(1)
printf("剩余%d颗雷\\n\\n",sl);
printf(" ");
for(int i=1;i<=m;i++)
printf("%d ",i/10);
printf("\\n ");
for(int i=1;i<=m;i++)
printf("%d ",i%10);
printf("\\n ┍");
for(int i=1;i<=m-1;i++)
printf("--");
printf("\\n");
for(int i=1;i<=n;i++)
printf("%02d|",i);
for(int j=1;j<=m;j++)
if(flag==1)
printf("%c|",a[i][j]);
continue;
if(c[i][j]==.||c[i][j]==?||c[i][j]==&)
printf("%c|",c[i][j]);
else if(b[i][j]!=0)
printf("%d|",b[i][j]);
else
printf("%c|",a[i][j]);
printf("\\n |");
for(int i=1;i<=m;i++)
printf("--");
printf("\\n");
if(flag==1)
printf("\\n\\n窗口在5秒后自动关闭\\r");
for(int i=5;i>=0;i--)
Sleep(1000);
printf("窗口在%d秒后自动关闭\\r",i);
Sleep(100);
return 0;
printf("\\n\\n");
int x=100,y=100;
while(x>n||x<1)
printf("请输入进行操作的行:");
scanf("%d",&x);
if(x>n||x<1)
printf("请重新输入!\\n");
while(y>m||y<1)
printf("请输入进行操作的列:");
scanf("%d",&y);
if(y>m||y<1)
printf("请重新输入!\\n");
ch=0;
while(ch!=1&&ch!=2&&ch!=3)
printf("请选择进行的操作:\\n1、探查\\n2、排雷\\n3、标记为不确定\\n输入操作:");
scanf("%d",&ch);
if(ch!=1&&ch!=2&&ch!=3)
printf("请重新输入!\\n");
if(ch==1)
if(c[x][y]==&)
sl++;
c[x][y]= ;
system("cls");
if(a[x][y]==*)
printf("游戏结束\\n恭喜您踩到雷了!\\n\\n");
flag=1;
continue;
else
l2++;
if(n*m-l2==l)
printf("游戏结束\\n恭喜您排完了所有雷!\\n\\n");
sl=0;
flag=1;
continue;
if(b[x][y]==0)
kg(x,y);
else if(ch==2)
c[x][y]=&;
system("cls");
sl--;
if(a[x][y]==*)
l1++;
if(l1==l)
printf("游戏结束\\n恭喜您排完了所有雷!\\n\\n");
sl=0;
flag=1;
continue;
else if(ch==3)
if(c[x][y]==&)
sl++;
c[x][y]=?;
system("cls");
return 0;
这里162行和165行随机生成雷时用到了随机数
x=rand()%n;
y=rand()%m;
什么意思呢,就是随机生成一个数并且对n或m取模,因为随机数会非常大,会超过格子的行和宽。
需要用到头文件:
#include<cstdlib>
还需要先播种随机种子
srand((unsigned)time(NULL));
这个需要用到头文件:
#include<cstdlib>
#include<ctime>
在多行还用到了清屏操作
system("cls");
这个需要用到头文件:
#include<cstdlib>
在多行还用到了暂停操作
Sleep(3000); //注意这里“S”要大写,括号里面是暂停时间,单位毫秒(ms)
这个需要用到头文件:
#include<windows.h> //这个头文件不包含在万能头文件里“#include<bits/stdc++.h>”
剩下的内容应该都通俗易懂
对了还有一个
printf("\\n\\n窗口在5秒后自动关闭\\r");
for(int i=4;i>=0;i--)
Sleep(1000);
printf("窗口在%d秒后自动关闭\\r",i);
Sleep(100);
return 0;
这里有个自动关闭窗口的程序,时间可以自行修改(注意for
里面定义的$i$的初始值为时间$-1$)
这个程序需要在外面运行才有用,因为在编译器运行会有单击继续,只有在外面才会自动关闭
==最后,总体运行效果==
如果你觉得这篇文章写的很好,记得==关注,点赞,评论,转发==
==源程序==
以上是关于C++实现扫雷(最简单版)的主要内容,如果未能解决你的问题,请参考以下文章
扫雷游戏(C语言实现)初级版和优化版(增加了自动展开标记地雷功能,同时排除了第一次排到地雷的情况)