大家好,这几天心血来潮想做一个扫雷程序,于是花费我20分钟时间做了一个,这可能是目前最简单的一个了(也是最简陋的),新手容易理解。
直接上代码
#include#include #include #include 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("加载中...nn"); system("cls"); printf(""."-->此格子未被点击过n"); printf(""*"-->雷n"); printf("" "-->空n"); printf(""&"-->被标记为雷n"); printf(""?"-->被标记为不知道nnn"); Sleep(3000); } else{ printf("n输入有误n请重新输入!"); Sleep(500); system("cls"); } } printf("加载中...nn"); 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颗雷nn",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("nn窗口在5秒后自动关闭r"); for(int i=5;i>=0;i--){ Sleep(1000); printf("窗口在%d秒后自动关闭r",i); } Sleep(100); return 0; } printf("nn"); 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恭喜您踩到雷了!nn"); flag=1; continue; } else l2++; if(n*m-l2==l){ printf("游戏结束n恭喜您排完了所有雷!nn"); 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恭喜您排完了所有雷!nn"); 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
还需要先播种随机种子
srand((unsigned)time(NULL));
这个需要用到头文件:
#include#include
在多行还用到了清屏操作
system("cls");
这个需要用到头文件:
#include
在多行还用到了暂停操作
Sleep(3000); //注意这里“S”要大写,括号里面是暂停时间,单位毫秒(ms)
这个需要用到头文件:
#include//这个头文件不包含在万能头文件里“#include ”
剩下的内容应该都通俗易懂
对了还有一个
printf("nn窗口在5秒后自动关闭r");
for(int i=4;i>=0;i--){
Sleep(1000);
printf("窗口在%d秒后自动关闭r",i);
}
Sleep(100);
return 0;
这里有个自动关闭窗口的程序,时间可以自行修改(注意for里面定义的i的初始值为时间-1)
这个程序需要在外面运行才有用,因为在编译器运行会有单击继续,只有在外面才会自动关闭
最后,总体运行效果
如果你觉得这篇文章写的很好,记得关注,点赞,评论,转发
源程序 C++扫雷源程序https://download.csdn.net/download/m0_48463380/85551552


