2013-08-01 4 views
5

Я пытаюсь написать миниатюрную версию тетриса, которая прилипает к руководящим принципам Tetris как можно больше:Миниатюрный Javascript Тетрис

Чтобы быть точным, я хочу полная игра должна быть построена как можно меньше 140 байтов javascript. Первый 140-байтовый скрипт должен возвращать массив с 112 целыми значениями, которые представляют 4 строки из 7 тетроминов в каждом из 4 повернутых позиций. Точный порядок расположения оборотов очень важен.

Я добрался до данных в 16-разрядных символах Unicode (они считаются как 2 байта) и распаковывают чуть более 140 байт.

Кто-нибудь знает умный способ построения этого массива?

вар ы = "ༀ ∢ð 䑄 ࣠ل âьˠцè ౄ 0000 ۀ ѢlࣄӠѤäӄ ౠɤ Æӈ", т = []; для (I = 0; я < 28; я ++) {с = s.charCodeAt (I), ибо (J = 4, J> 0;) {m.push (с >> (4 * - к) & 15)} возвращение м}

I tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │■│ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│■│■│■│  │ │ │■│ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─○─┼─┤  ├─┼─○─┼─┤  ├─┼─○─┼─┤  ├─┼─○─┼─┤ 
    │ │ │ │ │  │ │ │■│ │  │■│■│■│■│  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │ │■│ │  │ │ │ │ │  │ │■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 0F00  Hex: 2222  Hex: 00F0  Hex: 4444 

    J tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│ │ │ │  │ │■│■│ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│●│■│ │  │ │●│ │ │  │■│●│■│ │  │ │●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │■│ │ │  │ │ │■│ │  │■│■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 08E0  Hex: 0644  Hex: 00E2  Hex: 044C 

    L tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │■│ │  │ │■│ │ │  │ │ │ │ │  │■│■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│●│■│ │  │ │●│ │ │  │■│●│■│ │  │ │●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │■│■│ │  │■│ │ │ │  │ │■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 02E0  Hex: 0446  Hex: 00E8  Hex: 0C44 

    O tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │■│■│ │  │ │■│■│ │  │ │■│■│ │  │ │■│■│ │ 
    ├─┼─○─┼─┤  ├─┼─○─┼─┤  ├─┼─○─┼─┤  ├─┼─○─┼─┤ 
    │ │■│■│ │  │ │■│■│ │  │ │■│■│ │  │ │■│■│ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 0660  Hex: 0660  Hex: 0660  Hex: 0660 

    S tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │■│■│ │  │ │■│ │ │  │ │ │ │ │  │■│ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│●│ │ │  │ │●│■│ │  │ │●│■│ │  │■│●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │ │■│ │  │■│■│ │ │  │ │■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 06C0  Hex: 0462  Hex: 006C  Hex: 08C4 

    T tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │■│ │ │  │ │■│ │ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│●│■│ │  │ │●│■│ │  │■│●│■│ │  │■│●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │■│ │ │  │ │■│ │ │  │ │■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 04E0  Hex: 0464  Hex: 00E4  Hex: 04C4 

    Z tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│■│ │ │  │ │ │■│ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │●│■│ │  │ │●│■│ │  │■│●│ │ │  │■│●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │■│ │ │  │ │■│■│ │  │■│ │ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 0C60  Hex: 0264  Hex: 00C6  Hex: 04C8 
+0

Возможный дубликат [Code Golf: Playing Tetris] (http://stackoverflow.com/questions/3858384/code-golf-playing-tetris) – Blender

+0

Привет, Блендер, нет, это совершенно другая вещь. Это был конкурс тетромино, который не был настоящей игрой. С уважением, Jacco – Jacco

+0

Непосредственно, но вы не возражаете, чтобы спросить, где проходит конкурс? Я не смог найти активных групп для гольфа JS. –

ответ

2

Вы могли бы хотеть иметь в виду, что более умная схема кодирования для этого массива приведет к более длинной логике декодирования, поэтому попытка оптимизировать это слишком много может быть мудрой и фунтом глупо. Однако, написав игру на тетрис в JavaScript, как только я (хотя и не оптимизирован по размеру), я знаю, что на самом деле нетрудно написать функцию для вращения каждой фигуры n раз. Предполагая, что вы не сильно ограничены по скорости, почему не только есть запись LUT для каждой фигуры в ориентации по умолчанию, но и повернуть ее программно? Вы можете обнаружить, что это приводит к уменьшению общего пространства (в частности, если размер кода поворота/транспонирования меньше 3/4 от размера массива).

EDIT: Дополнительным преимуществом для этого является то, что вам не нужно отслеживать состояние вращения фигуры на сетке, вам просто нужно отслеживать текущий массив. Когда кто-то вращается, вращайте массив с помощью вашей функции. Это устраняет необходимость делать проверку (например, если вращение> 3, вращение = 0).

+0

Спасибо за ваш комментарий! Я видел такие решения, и было бы непросто, если бы центры вращения тетроминов не были разными для некоторых тертоминосов (I и O). – Jacco

+0

Я надеялся, что кто-то придумает какие-то магические числа из теории игры в полиномине или что-то в этом роде. У большинства тетроминов требуется только 3 бита для поворота из одного состояния в другое. Я пробовал много вещей, но, как вы говорите, трудно найти что-то, что соответствует 140-байтным данным + распаковка :-) – Jacco

+0

Это хороший момент. Оглядываясь на мой код, я сохранил каждый спрайт формы как свою собственную прямоугольную подматрицу с большим массивом, поэтому каждый из них был размером с наименьший прямоугольник, который он поместил бы внутри. Это позволило мне легко их повернуть, но я не уверен, удовлетворит ли это ваши потребности. – Troy

Смежные вопросы