Делая змею игрой, является ли мое решение, чтобы избежать "пищи/капель" нерест на вершине моей змеи в порядке?


Http://i.stack.imgur.com/P7Ano.png

Надеюсь, название будет несколько информативным. В настоящее время я делаю свою первую игру на Java, и мне нужна помощь с определенным фрагментом кода.

Вот так:

Когда змея перемещается по Красному квадрату (далее "капля"), квадрат перекрашивается новыми, случайно сгенерированными координатами. Поскольку эти координаты генерируются случайным образом, существует вероятность того, что капля будет нарисована поверх моей змеи.

I хотите избежать этого, и я сделал метод, генерирующий случайные координаты, чтобы проверить их на соответствие текущим координатам змеи. Змея состоит из 5x5px сегментов, каждый со своими собственными координатами, хранящимися в 2D-массиве.

Моя логика заключается в следующем: 1) генерируйте координаты X и Y. 2) получить дифференциал координат (например, как далеко они находятся друг от друга) 3) если они находятся в пределах COLLISIONRANGE (5px) друг от друга -> не используйте эти координаты.

Что я на самом деле спрашиваю:

Это правильное решение? Есть ли какие-то вопиющие ошибки в том, как я это проверяю? По мере того как я играю в игру, я получаю больше триггеров системы.из.println ("Log: No-go spawn #" + i); у меня есть там для регистрации, чем я бы предположил, естественно.

Похоже, что случайно сгенерированные координаты слишком часто находятся в пределах диапазона столкновений змеиных сегментов, чтобы все было правильно.

Мой метод:

private void generateBlobCoordinates() {
    Random randomGenerator = new Random();
    boolean isClearSpawn = true;

    int x = randomGenerator.nextInt(BORDER_X_MAX);
    int y = randomGenerator.nextInt(BORDER_Y_MAX);

    int xDiff;
    int yDiff;

    // If generated coords are within COLLISIONRANGE, set isClearSpawn to false
    for(int i = 0; i < snakeSegments.length; i++) {
        if(snakeSegments[i][0] != -1) {
            xDiff = Math.abs(x - snakeSegments[i][0]);
            yDiff = Math.abs(y - snakeSegments[i][1]);

            if(xDiff <= COLLISIONRANGE || yDiff <= COLLISIONRANGE) {
                isClearSpawn = false;
                System.out.println("Log: No-go spawn #" + i);
                break;
            }
        }
        else
            break;
    }

    if(isClearSpawn == true) {
        blobX = x;
        blobY = y;
    }
    else
        generateBlobCoordinates();
}
1 2

1 ответ:

Вы правы, что беспокоитесь. Вы испытываете для условия или, но нужно и. В противном случае вы получите столкновение в любом месте строки или столбца, где есть змея!

Изменение

        if(xDiff <= COLLISIONRANGE || yDiff <= COLLISIONRANGE) {

К

        if(xDiff <= COLLISIONRANGE && yDiff <= COLLISIONRANGE) {