使用随机数生成器将“@”随机放置在数组中有时会生成并被数组中生成的其他字符替换

Using random number generator to place '@' randomly in an array is sometimes spawning and being replaced by other chars spawning in the array

对于 uni 作业,我需要用 C 编写一个基本的蛇游戏。我们提供了一个随机数生成器(我不允许 change/edit,我们必须使用它)每次启动游戏时,在地图周围随机生成蛇 'food' ((@) 食物 <<<)。我遇到 'food' 有时不生成的问题,我相信这是因为它生成在蛇“#---->”(蛇 <<<)的 space 中,然后因为我在食物之后生成了蛇,所以它完全取代了食物。我相当确定它不会在地图外或地图边界内生成,而只是被边界取代,因为我已经确保它不会在边界内或地图外生成。就像你知道的那样,蛇必须在地图的左上角生成(根据任务描述的要求)。 所以我的问题是; 我怎样才能在地图上生成食物并在生成之前进行检查以确保它根本不会在蛇所在的地方生成,同时仍然使用随机数我得到了发电机。

还有一些事情我忘记说了:

随机数生成器:

#include<stdlib.h>
#include<time.h>
#include"random.h"

void initRandom()
{
    srand(time(NULL));
}

int random(int low, int high)
{
    int number = -1;

    if(low <= high)
    {
        number = (rand() % (high-low+1)) + low;
    }

    return number;
}

我当前尝试反作用的代码(不会阻止“@”在蛇中产卵):

void makeMap(char **playerboard, int rowMap, int colMap, int snakeLength)
{
    int i, j;
    int x, y;

    initRandom();

    for(i = 0; i < rowMap; i++)
    {
        for(j = 0; j < colMap; j++)
        {
            playerboard[i][j] = ' ';
            playerboard[i][0] = '*';
            playerboard[i][colMap-1] = '*';
            playerboard[0][j] = '*';
            playerboard[rowMap-1][j] = '*';
        }
    }
    if(playerboard[1][snakeLength] == '#' || playerboard[1][snakeLength] == '-' || playerboard[1][snakeLength] == '>')
    {
        x = random(3, rowMap - 2);
        y = random(snakeLength, colMap - 2);
        playerboard[x][y] = '@';
    }
    else
    {
        x = random(1, rowMap - 2);
        y = random(1, colMap - 2);
        playerboard[x][y] = '@';   
    }
    
    loadSnake(playerboard, snakeLength);
}

在我试图解决这个问题之前我所拥有的:

void makeMap(char **playerboard, int rowMap, int colMap, int snakeLength)
{
    int i, j;
    int x, y;

    initRandom();
    x = random(1, rowMap - 2);
    y = random(1, colMap - 2);

    for(i = 0; i < rowMap; i++)
    {
        for(j = 0; j < colMap; j++)
        {
            playerboard[i][j] = ' ';
            playerboard[i][0] = '*';
            playerboard[i][colMap-1] = '*';
            playerboard[0][j] = '*';
            playerboard[rowMap-1][j] = '*';
        }
    }
    playerboard[x][y] = '@';
    
    loadSnake(playerboard, snakeLength);
}

欢迎任何帮助。

您只能将食物放在空白方块上,因此请检查:

x = random(1, rowMap - 2);
y = random(1, colMap - 2);

if (playerboard[x][y] == ' ') {
    playerboard[x][y] = '@';
}

当然,这意味着当你产生一个已经被占据的位置时,你将不会放置任何食物,所以你必须重试直到找到一个空闲的瓷砖:

do {
    x = random(1, rowMap - 2);
    y = random(1, colMap - 2);
} while (playerboard[x][y] != ' ');

playerboard[x][y] = '@';