Подтвердить что ты не робот

Java Tetris - размышление о частичном вращении

Я строю Тетрис и пытаюсь думать о том, как мне повернуть фигуры.

Они вращаются на одном блоке? Или они должны морфировать... ака менять позиции?

enter image description here

То, как я собираюсь это сделать, - это тип жесткого кода... как (псевдокод):

if (rotateRight()) {

    if (Piece == "T") {
        if (Piece.getCurrRotation() == down (aka.. 180 degrees))
          move each Tile in Piece from the down rotation to the left rotation... each coordinate would be pre-specified for a given condition... aka lot of hardcoding
     }
    if (Piece == "L") { etc...

     }
}
if (rotateLeft()) {
     perform same checks for the Left...
}

Но это, казалось бы, массовое количество кода, чтобы выяснить

), во вращение которого находится текущая деталь (имеется 4 возможных вращения для каждой части)

во-вторых) Оттуда... установите его в новые жестко закодированные координаты на основе этой части

Я должен был бы сделать это для каждой части... это кажется неправильным способом подумать об этом.

Любые другие мысли?

4b9b3361

Ответ 1

У меня, вероятно, было бы 1-4 Ориентационных объекта для каждого объекта PieceType. Каждая Ориентация тогда определяла бы положения фактических блоков (относительно некоторого стержня). Например,

PieceType "L":

    Orientation 1:
    #
    #
    ##

    Orientation 2:
    ###
    #

    Orientation 3:
    ##
     #
     #

    Orientation 4:
      #
    ###

PieceType "I":

    Orientation 1:
    #
    #
    #
    #

    Orientation 2:
    ####

Каждый PieceType может также содержать информацию о пространстве, необходимом для каждой возможной "смены ориентации" (то есть вращения). Это все статическая информация, поэтому на самом деле нет необходимости перемещать блоки во время игры. Просто измените Orientation of Piece и дайте объекту Orientation указать позиции блока.

Ответ 2

Если у вас есть кусочки, хранящиеся в виде матрицы, вы можете вращать матрицу с помощью общей функции. Скажем, вы хотите повернуть [[1, 1, 1], [0, 0, 0], [0, 0, 0]] на 90 градусов влево → [[1,0,0], [1,0, 0], [1,0,0]]. Помогает ли это?

Ответ 3

У вас есть 2 варианта (в зависимости от того, как вы храните свои фигуры):

  • Выполняйте время выполнения вращения (сохраняйте свои фигурные точки в матрице и вращайте вокруг центра) с изменением положения блока формы.
  • Хранить 4 (или для чередующихся по повороту форм, 2 или даже 1) фаз для формы и только увеличивать/уменьшать фазу, в которой находится ваша фигура.

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

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

Я думаю, что второй подход лучше, так как у вас есть фиксированное количество штук и фиксированное количество фаз. Но это зависит от вас.

Ответ 4

Этот примерный код выглядит как кошмар в процессе создания.

Другой способ сделать это, это было бы очень просто, заключалось бы в том, чтобы рассматривать плату как фиксированное количество ячеек, а затем просто рассматривать каждое "вращение" как способ вычисления того, сколько должно быть смещено положение каждой фигуры, то просто переделайте куски, а затем попросите их нарисовать себя, поэтому с точки зрения частей они просто говорят: "Хорошо, вы сейчас на A5".

Если вы посмотрите на свой первый пример, новые местоположения просто являются функцией их текущего смещения от центра и желаемого направления вращения.

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

Ответ 5

IMHO, самый простой способ - не вращать или преобразовывать блок, а запоминать форму блока в каждом из его состояний (нормальный, rotated_90_degrees, rotated_180_degrees, rotated_270_degrees)

Ответ 6

Я бы предположил, что вы определяете кусок как точки относительно одной точки вращения. Затем вы можете (с небольшой матричной алгеброй) применить 3-кратное вращение, чтобы получить другие макеты относительно центральной точки.

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