Алгоритм вращения части Тетриса

Golfscript: разумеется, предназначенный для игры в гольф

~),1>{*}*
  • ~ вычисляет входную строку (в целое число)
  • ) увеличивает число
  • , является диапазоном (4, становится [0 1 2 3])
  • 1> выбирает значения, индекс которых равен 1 или больше
  • {*}* складывает умножение по списку
  • Содержимое стека печатается после завершения программы.

Для запуска:

echo 5 | ruby gs.rb fact.gs
45
задан MrBoJangles 24 October 2008 в 15:01
поделиться

3 ответа

Если вы делаете это в Python, на основе ячеек, а не пар координат, очень просто повернуть вложенный список.

rotate = lambda tetrad: zip(*tetrad[::-1])

# S Tetrad
tetrad = rotate([[0,0,0,0], [0,0,0,0], [0,1,1,0], [1,1,0,0]])
2
ответ дан 26 November 2019 в 21:05
поделиться

Я вывел алгоритм вращения на основе матричных вращений здесь . Подводя итог: Если у Вас есть список координат для всех ячеек, составляющих блок, например [(0, 1), (1, 1), (2, 1), (3, 1)] или [(1, 0), (0, 1), (1, 1), (2, 1)]:

 0123       012
0....      0.#.
1####  or  1###
2....      2...
3....

Вы можете вычислить новые координаты, используя

x_new = y_old
y_new = 1 - (x_old - (me - 2))

для вращения по часовой стрелке и

x_new = 1 - (y_old - (me - 2))
y_new = x_old

для вращения против часовой стрелки. me - это максимальная протяженность блока, т.е. 4 для I-блоков, 2 для O-блоков и 3 для всех остальных блоков.

3
ответ дан 26 November 2019 в 21:05
поделиться

Повернуть матрицу можно только путем применения к ней математических операций. Если у вас есть матрица, скажем:

Mat A = [1,1,1]
        [0,0,1]
        [0,0,0]

Чтобы повернуть ее, умножьте ее на ее транспонирование, а затем на эту матрицу ([I]dentity [H]orizontaly [M]irrored):

IHM(A) = [0,0,1]
         [0,1,0]
         [1,0,0]

Тогда вы получите:

Mat Rotation = Trn(A)*IHM(A) = [1,0,0]*[0,0,1] = [0,0,1]
                               [1,0,0] [0,1,0] = [0,0,1]
                               [1,1,0] [1,0,0] = [0,1,1]

Примечание: Центр вращения будет центром матрицы, в данном случае в точке (2,2).

7
ответ дан 26 November 2019 в 21:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: