Клон тетриса на Яве, выходящий за пределы при перемещении фигуры? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь написать клон тетриса. Моя доска - это массив целых чисел 10x20, где 0 означает отсутствие плитки, 1-7 означает плитку определенного цвета. Постоянно переводится в графическую интерпретацию. Мои фигуры представляют собой массивы целых 4х4. Я только что пришел к выводу, что хотя выполнение всех форм 4х4 облегчает некоторые вещи, оно также вызывает проблемы при перемещении фигуры влево и вправо. Допустим, у нас есть форма I:

0010
0010
0010
0010

Теперь, если я перенесу его на левую стену, всегда будет большой разрыв в две единицы, так как 0s не могут выйти за пределы массива основной доски. Что было бы самым простым способом, позволяющим единицам перейти на левую стену, не вызывая исключение за пределами границ?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вам нужен способ обнаружения столкновений с границами и существующими частями.

Вероятно, у вас будет фиксированная ручка для каждой фигуры, у вас также будет предложение X и Y для фигуры, которое указывает ее положение при движении вниз по сетке.

Чтобы остановить перемещение детали за пределы, прокрутите матрицу 4 * 4 движущейся детали, и для битов, которые установлены в 1, просто проверьте чтобы убедиться, что позиция X + смещение X равна> = 0 и <= 9, а позиция Y равна> = 0 и <= 19, если любая из этих проверок не удалась тогда ваша фигура будет выходить за пределы массива досок, поэтому остановите изменение на x или y offest в зависимости от ситуации. </p>

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

Вы должны делать эти проверки столкновений, когда часть вращается, как я и думал.

0 голосов
/ 30 августа 2018

Используя описанный вами метод, один из способов просто избежать получения IndexOutOfBoundsException состоит в том, чтобы расширить доску до 18 x 24 вместо 10 x 24, а затем написать дополнительный код, который не позволяет перемещать блок влево / вправо, если в массиве объектов будут какие-либо 1, которые покидают средние 10 квадратов сетки. Добавив этот «отступ» к вашей сетке, вы избежите исключения и все еще сможете его реализовать.

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

Кстати, @assylias делает очень хорошую мысль. Важно иметь хороший дизайн / план, прежде чем вы начнете реализовывать такие вещи, чтобы избежать таких препятствий. Это приходит с опытом, поэтому продолжайте практиковаться, и вы освоите его.

ПРИМЕЧАНИЕ: Как отметил Ник в комментарии, другой способ сделать это - просто проверить, не покидают ли какие-либо единицы из сетки, прежде чем перемещать какой-либо из массивов. Это, безусловно, возможно (и, возможно, более элегантное / простое решение), хотя может быть немного сложнее понять это.

...