Не могу обнаружить ошибку в моей игре Java Tetris - PullRequest
3 голосов
/ 19 мая 2011

Мой друг и я сделали тетрис-подобную игру на Java, и она некоторое время прекрасно работает, а затем неожиданно каждый раз выдает примерно одинаковое количество штук.Например, он может выдавать 42 штуки один раз, 46 - следующий, а 44 - позже.

[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][2][2][ ][ ][ ][ ][ ][ ][7]
[ ][2][2][2][3][3][ ][4][ ][7]
[2][2][1][3][3][1][ ][4][ ][7]

Выше приведен пример того, как это выглядит прямо перед тем, как произошла ошибка.Не пытайтесь читать приведенный выше пример слишком сильно, так как ошибка не зависит от позиций фигур и т. Д.

Вот как выглядит сетка сразу после ошибки ...

[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][2][2][ ][ ][ ][ ][ ][ ][7]
[ ][2][2][2][3][3][ ][4][ ][7]
[2][2][1][3][3][1][ ][4][ ][7]

Заметьте, что двое идут до самого верха сетки?Вот что происходит.

Здесь все становится интереснее.Мы ограничили его конкретной функцией и конкретной строкой кода.

grid[x+legend[piece.type].fetch(i, 0, piece.rotate)]
    [y+legend[piece.type].fetch(i, 1, piece.rotate)]
    .type = piece.type+1;

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

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

i: 0
legend[piece.type].block.length: 4
legend[piece.type].fetch(i, 0, piece.rotate): 0
legend[piece.type].fetch(i, 1, piece.rotate): 0
piece.type: 1
piece.rotate: 3
x: 3
y: 6

Это переменные, которые повлияли на вторую сетку выше.Глючная строка кода выглядела бы так:

grid[3+0][6+0].type = 1+1;

Возможно ли, что мы обнаружили ошибку в самой Java?Я потратил часы на отладку этого кода, и у меня никогда не было ошибки, которую я не смог найти (обычно я пишу на python, хотя ... Java для меня довольно новая)

Кроме того, кажется, чтоНа ошибку влияет размер сетки.Если я установлю высоту сетки на меньшее число, потребуется меньше кусков, чтобы вызвать ошибку.На том же уровне требуется больше элементов, если я сделаю более высокую сетку.

Надеемся, что специалисты по Java могут помочь пролить некоторый свет на ситуацию.

ps Я программирую в Eclipseна Mac с использованием JRE JVM 1.6.Я также пробовал JRE JVM 1.4, и происходит то же самое.

Дополнительная информация:

private Grid grid[][] = new Grid[dimx][dimy];

приведенный выше код при создании сетки.Сетка - это класс:

public class Grid {
    int type;

    public Grid(int type) {
    }
}

Вот часть обширного кода журнала отладки ... Это функция, которая печатает текстовую сетку.

public void printGrid(int line) {
    System.out.print("\n\n\n"+line+":\n");
    for (int y = 0;y < grid[0].length;y++) {
        for (int x = 0;x < grid.length;x++) {
            if (grid[x][y].type == 0) {
                System.out.print("[ ]");
            } else {
                System.out.print("["+grid[x][y].type+"]");
            }

        }
        System.out.println();
    }
    System.out.println("\n\n");
}

Переменная 'line 'не важна и просто говорит нам, с какого номера строки была вызвана функция printGrid ().

Дайте мне знать, если вам, ребята, нужна дополнительная информация.

Дополнительная информация:

Вот все файлы этой программы.

О, и вот выдержка из журнала отладки, чтобы дать вам больше информации.

http://pastebin.com/9VKhF8CR

Включает успешное размещение фигуры (последняя фигура, помещенная перед ошибкой), а затем показывает, что ошибка произошла.Все переменные для функции печатаются, и ни одна из них не появляется не на своем месте.Ошибка происходит с любой частью, помещенной в любое место на сетке.Сетка была напечатана после каждого звонка на линию, о которой я говорил выше.Дайте мне знать, если вам, ребята, нужна дополнительная информация.Я хочу, чтобы эта ошибка была уничтожена.

1 Ответ

4 голосов
/ 19 мая 2011

Из описания вашей проблемы это выглядит как , как будто grid[0], grid[1] - grid[6] - все ссылки на тот же массив строк (но grid[7]и далее ссылки на разные массивы).Это может вызвать описанный вами симптом, когда изменение одного элемента приводит к тому, что он кажется измененным во всех этих строках.

Попробуйте:

System.err.println(grid[0] == grid[1]);

и посмотрите, получите ли вы true илиfalse.Вы, вероятно, получите true.

...