我写的扫雷游戏 不知道哪里错了
#include "stdio.h"
#include "stdlib.h"
#define SPA 0 //代表空白
#define BOMB 1 //代表雷
#define SAFE 2 //代表已翻开的空白
#define N 16
void change(int m,int *i,int *j);
int number(int x,int y);
int num=N*N;//可翻的格的数目
int dilei[N+2][N+2]={SPA}; //边界各2
int eye[N][N]={SPA};
void suiji()
{
int i,j;
for(i=1;i<N+1;i++)
for(j=1;j<N+1;j++)
dilei[i][j]=(rand()%2)*(rand()%2)*(rand()%2); //随机分配1或2 到dilei中 且1的概率较小
}
void clear(int x,int y) //清除函数
{
int dir,a,b;//dir代表方向
if(dilei[x+1][y+1]==BOMB||x==N||y==N)//传入的是eye的下标 这里dilei数组都多1
return ;
if(dilei[x+1][y+1]==SPA){
eye[x][y]=SAFE; //如果没有地雷 eye标为SAFE
for(dir=1;dir<=8;dir++){ //判断改点周围8个点
a=x,b=y;
change(dir,&a,&b);//改变方向
clear(a,b); //递归 直至遇到地雷或者达到边界 返回
if(dir%2==0) 复原方向
change(dir-1,&a,&b);
else change(dir+1,&a,&b);
eye[a][b]=number(a,b);通过number函数将周围8点的雷数目存入eye中
}
}
}
void change(int m,int *i,int *j) //改变坐标 从而判断周围8点的方向
{
switch(m)
{
case 1:(*i)++,(*j)++; break;
case 2:(*i)--,(*j)--; break;
case 3:(*i)++,(*j)--;break;
case 4:(*i)--,(*j)++;break;
case 5:(*i)++;break;
case 6:(*i)--;break;
case 7:(*j)++;break;
case 8:(*j)--;break;
}
}
int number(int x,int y)//判断周围雷的数目
{
int m,number=0,a=x,b=y;
for(m=1;m<=8;m++)
{ x=a,y=b; //每次都复原
change(m,&x,&y);
if(dilei[x][y]==BOMB)
number++;
}
return number;
}
void draw()
{
int i,j;
for(i=0;i<16;i++){
for(j=0;j<16;j++)
{
if(eye[i][j]==SPA||eye[i][j]==SAFE||eye[i][j]==BOMB)
{ switch(eye[i][j]) {
case SPA: printf("□");continue;
case SAFE: printf("■"),num--;continue;
case BOMB: printf(" %c",'X');continue;
} }
printf("%2d",eye[i][j]),num--; //不是以上三种就把他的值输出 代表周围的地雷书
}
printf("%d\n",i);
}
}
int main(void)
{
int i,j,x,y,count=0;
suiji();
for(i=1;i<N+1;i++)
for(j=1;j<N+1;j++)
if(dilei[i][j]==BOMB)
count++;
printf("地雷数:%d\n",count); //计算全局地雷书
draw();
while(num==count)//num代表剩余的可翻的数目
{
scanf("%d%d",&x,&y);
clear(x,y);
draw();
}
}
求解啊
到底怎么错了
输入什么数都立即 press any key to continue
我还是个自学的高一生 低级错误大家笑笑就算了。。