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