大家好,这几天心血来潮想做一个扫雷程序,于是花费我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)
这个程序需要在外面运行才有用,因为在编译器运行会有单击继续,只有在外面才会自动关闭
最后,总体运行效果
如果你觉得这篇文章写的很好,记得关注,点赞,评论,转发