这是我的一个扫雷代码,求dalao帮忙改进一下,就是如果翻开了数字零,就把周围八连通也翻开。
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int n,boom=0,x,y,open_boom=0;
int num[13][13],up_not[13][13];
int what;
void add(int y,int x);
void print_not(int n);
int _boom(int _y,int _x);
void print_true(int n);
int main(){
srand(time(0));
printf("请输入扫雷的边长是几个格子(最多11) ");
scanf("%d",&n);
while(boom!=n){
x=rand()%n+1,y=rand()%n+1;
if(num[y][x]!=66) {
num[y][x]=66;
boom++;
add(x,y);
}
}
for(int i=1;i<=n*n;i++){
print_not(n);
printf("请问要干什么?(翻格子打一/插雷打二) ");
scanf("%d",&what);
if(what==1){
printf("请问要翻哪一个格子? ");
scanf("%d %d",&y,&x);
up_not[y][x]=1;
if(_boom(y,x)) {
printf("Boom!");
print_true(n);
Sleep(10000);
return 0;
}
else up_not[y][x]=1;
system("cls");
}
else if(what==2){
printf("请问要在哪一个格子插雷? ");
scanf("%d %d",&y,&x);
if(_boom(y,x)) {
up_not[y][x]=99;
open_boom++;
if(open_boom==n){
printf("胜利! ");
Sleep(5000);
return 0;
}
}
else up_not[y][x]=99;
system("cls");
}
}
return 0;
}
void add(int y,int x){
if(num[x+1][y+1]!=66) num[x+1][y+1]++;
if(num[x+1][y]!=66) num[x+1][y]++;
if(num[x+1][y-1]!=66) num[x+1][y-1]++;
if(num[x][y+1]!=66) num[x][y+1]++;
if(num[x][y-1]!=66) num[x][y-1]++;
if(num[x-1][y+1]!=66) num[x-1][y+1]++;
if(num[x-1][y]!=66) num[x-1][y]++;
if(num[x-1][y-1]!=66) num[x-1][y-1]++;
}
void print_not(int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if((up_not[i][j]==1)) printf("%d ",num[i][j]);
else if(up_not[i][j]==66) printf("B ");
else if(up_not[i][j]==99) printf("? ");
else printf("* ");
}
printf("\n");
}
}
int _boom(int _y,int _x){
if(num[_y][_x]==66) return 1;
else return 0;
}
void print_true(int n){
printf("正确的是:\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(num[i][j]==66) printf("%c ",num[i][j]);
else printf("%d ",num[i][j]);
}
printf("\n");
}
}