回 帖 发 新 帖 刷新版面

主题:[讨论]求大神,老师要我们编一个扫雷的程序,我编出来的为什么总会产生随机数!!求大神!!

老师要我们编一个程序,要求9*9的方格中随机产生十个雷,用“*”表示,

并且周围的无雷格子要用数字表示出该格子周围的雷数,其余周围无雷的空格子用0表示。

下面是我编的,我一运行就出现许多随机数的情况,雷却可以表示出来。

求大神啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#include<stdio.h>

#include<stdlib.h>
#include<time.h>
#define N 9
void bl(int a[9][9]=0)
{   void bz(int a[9][9]);
int i,j,k;
srand(time(NULL));
for(k=0;k<=N;k++)
{
i=rand()%N;
j=rand()%N;
if(a[i][j]==9)
continue;
else
a[i][j]=9;
}
bz(a);


}
void bz(int a[N][N])
{
int i,j;
    for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(a[i][j]==9)
{
if((i-1)>=0&&(j-1)>=0&&a[i][j]!=9) 
  a[i-1][j-1]+=1;
if((i-1)>=0&&a[i][j]!=9)
a[i-1][j]+=1;
if((i-1)>=0&&(j+1)<N&&a[i][j]!=9)
a[i-1][j+1]+=1;
if((j-1)>=0&&a[i][j]!=9)
a[i][j-1]+=1;
if((j+1)<N&&a[i][j]!=9)
a[i][j+1]+=1;
if((i+1)<N&&(j-1)>=0&&a[i][j]!=9)
a[i+1][j-1]+=1;
if((i+1)<N&&a[i][j]!=9)
a[i+1][j]+=1;
if((i+1)<9&&(j+1)<N&&a[i][j]!=9)
a[i+1][j+1]+=1;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(a[i][j]==9)
printf("  *");
else
printf("   %d",a[i][j]);
}
printf("\n");
}





                
}
void main()
{
int a[9][9];
bl(a);
}

回复列表 (共5个回复)

沙发

1、main函数里面,
int a[9][9];
数组a没有初始化。所以会打印随机的值。
建议修改为int a[9][9] = {0};

2、bl这个函数里面,
if(a[i][j]==9) continue;
这可能会导致总的地雷数小于N
建议修改为if(a[i][j]==9) { --k; continue; }

3、bz这个函数里面,
  if(a[i][j]==9)
  {
  if((i-1)>=0&&(j-1)>=0&&a[i][j]!=9) 
    a[i-1][j-1]+=1;
仔细看,在if(a[i][j]==9)里面又写a[i][j]!=9,这已经自相矛盾了。所以a[i-1][j-1]+=1;这一句永远都得不到执行。
建议修改为if((i-1)>=0&&(j-1)>=0&&a[i-1][j-1]!=9)

板凳

使用 gcc4.7.2 加编译参数 -std=c99 编译测试通过

[code=c]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    size_t buf[9][9];

    // 通过随机数产生雷
    srand( (unsigned int)time(NULL) );
    int r = 0;
    size_t rn = 0;
    for( size_t i=0; i<9*9; ++i )
    {
        if( rn == 0 )
        {
            r = rand();
            rn = 15; // C/C++标准要求RAND_MAX至少为32767
        }

        buf[0][i] = r&1;

        r >>= 1;
        --rn;
    }

    // 显示raw雷
    for( size_t i=0; i<9*9; ++i )
    {
        printf( " %d", buf[0][i] );
        if( i%9 == 8 )
            printf( "\n" );
    }
    printf( "\n" );

    // 显示雷
    for( size_t i=0; i<9*9; ++i )
    {
        size_t r = i/9;
        size_t c = i%9;

        if( buf[r][c] )
        {
            printf( " *" );
        }
        else
        {
            size_t n = (r>0&&c>0&&buf[r-1][c-1]) + (r>0&&buf[r-1][c]) + (r>0&&c<8&&buf[r-1][c+1])
                     + (c>0&&buf[r][c-1]) + (buf[r][c]) + (c<8&&buf[r][c+1])
                     + (r<8&&c>0&&buf[r+1][c-1]) + (r<8&&buf[r+1][c]) + (r<8&&c<8&&buf[r+1][c+1]);
            printf( " %d", n );
        }

        if( i%9 == 8 )
            printf( "\n" );
    }

    return 0;
}
[/code]

3 楼

谢谢大神!!!

4 楼

多谢大神!!虽然很多函数我们还没学过,但是我看了一下,大致知道了意思!!!谢谢!!!

5 楼


怎么你的代码我编译不能通过。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册