发布网友
共2个回答
热心网友
会越界的原因在于你使用数组的设定。
i=rand()%9+1,j=rand()%9+1。i和j取值的范围是1到9这9个数字,你把这9个数组作为数组的下标使用,而数组的下标是从0开始的,看你的程序里面,根本没有用到数组a[N][N](N=11)的第一列和第一行,当然也没用到最后一列和最后一行。
如果你想让N=9,而且访问不越界,那么你在统计a[i][j]周围的地雷数目时,应该分成3种情况考虑。
第一种:数组四个角的位置,比如a[0][0],统计的时候只需考察a[0][1],a[1][0],a[1][1]。
第二种:数组四个边界的位置,比如a[0][2],统计的时候只需考察a[0][1],a[0][3],a[1][1],a[1][2],a[1][3]。
第三种:数组其余的位置,比如a[4][4],统计的时候就需要考察周围的8个位置了。
实际上,你在程序里把这三种情况都归为第三种处理的,所以,必然会越界。当然,你让N=11,而只使用中间的9行9列,确实可以避免越界。
而且,你的程序还有一个问题,就是:你在统计地雷数的时候,并不需要对是地雷的位置进行统计,这没有意义,因为在扫雷游戏你踩到雷的话就是结束游戏,而不是显示周围有几颗雷,而且你对是雷的位置进行统计,改变了数据,你设置9表示该位置是地雷,但当有另外一个地雷和它相邻时,9就会加1了,所以你判断一个位置是否是雷的时候就必须改成a[i][j]>=9了,是程序可读性降低。
现在明白了么,可以追问~~
热心网友
!#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 11
void main()
{
int a[N][N]={0},i,j,n;
srand(time(NULL));
n=0;
while(n<10)
{ i=rand()%9+1;
j=rand()%9+1;
if(a[i][j]==0)
{ a[i][j]=9;
n++;
}
}
printf("地雷:\n");
for(i=1;i<10;i++)
{for(j=1;j<10;j++)
printf("%3d",a[i][j]);
printf("\n");
}
for(i=1;i<10;i++)
for(j=1;j<10;j++)
{ if(a[i-1][j-1]>=9)
a[i][j]++;
if(a[i-1][j]>=9)
a[i][j]++;
if(a[i-1][j+1]>=9)
a[i][j]++;
if(a[i][j-1]>=9)
a[i][j]++;
if(a[i][j+1]>=9)
a[i][j]++;
if(a[i+1][j-1]>=9)
a[i][j]++;
if(a[i+1][j]>=9)
a[i][j]++;
if(a[i+1][j+1]>=9)
a[i][j]++;
}
printf( "地雷数:\n");
for(i=1;i<10;i++)
{for(j=1;j<10;j++)
printf("%3d",a[i][j]);
printf("\n");
}
}