2013-08-01 8 views
5

Próbuję napisać miniaturową wersję Tetrisa, która przylega do wytycznych Tetris jak najwięcej:Miniaturowe JavaScript Tetris

Dla ścisłości chcę kompletna gra, która będzie zbudowana z maksymalnie 140 bajtów javascript. Pierwszy 140 bajtowy skrypt powinien zwrócić tablicę z 112 liczbami całkowitymi, które reprezentują 4 rzędy z 7 tetrominos w każdej z 4 obróconych pozycji. Dokładna kolejność pozycji obrotów jest bardzo ważna.

mam tak daleko, jak wprowadzanie danych w 16bit znaków Unicode (liczą jako 2 bajty chociaż) i rozpakowywanie w nieco ponad 140 bajtów.

Czy ktoś wie sprytny sposób konstruowania tej tablicy?

var s = "ༀ ∢ð 䑄 ࣠ل âьˠцè ౄ 0000 ۀ ѢlࣄӠѤäӄ ౠɤ Æӈ" m = []; for (i = 0; i < 28; i ++) {c = s.charCodeAt (I); for (j = 4; j> 0;) {m.push (c >> (4 * - j) & 15)} return m}

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

prawdopodobny duplikat [Code Golf: Playing Tetris] (http://stackoverflow.com/questions/3858384/code-golf-playing-tetris) – Blender

+0

Cześć Blender, nie to jest zupełnie inna rzecz. To był konkurs dopasowania tetromino, a nie prawdziwa gra. Pozdrawiam, Jacco – Jacco

+0

Nie jest to bezpośrednio powiązane, ale czy nie masz nic przeciwko temu, gdzie się znajduje konkurs? Nie byłem w stanie znaleźć żadnych aktywnych grup do gry w golfa JS. –

Odpowiedz

2

Czasami warto pamiętać, że bardziej sprytny schemat kodowania dla tej tablicy spowoduje dłuższą logikę dekodowania, więc próba optymalizacji tego zbyt wiele może być grosz mądry i funt głupi. Jednak po napisaniu gry tetris w JavaScript raz (choć nie jest to zoptymalizowany rozmiar), wiem, że nie jest naprawdę trudno napisać funkcję obracania każdego kształtu n razy. Zakładając, że nie masz silnego ograniczenia prędkości, dlaczego nie ma tylko wpisu LUT dla każdego kształtu w domyślnej orientacji i obracaj je prgrammatically? Może się okazać, że spowoduje to zmniejszenie całkowitej ilości miejsca (szczególnie, jeśli rozmiar kodu obrotu/transpozycji jest mniejszy niż 3/4 rozmiaru tablicy).

EDYCJA: Dodatkową korzyścią z robienia tego w ten sposób jest to, że nie musisz śledzić stanu rotacji kształtu na siatce, wystarczy śledzić bieżącą tablicę. Kiedy ktoś się obraca, obróć tablicę swoją funkcją. Eliminuje to konieczność sprawdzania (na przykład, jeśli obrót> 3, obrót = 0).

+0

Dzięki za komentarz! Widziałem takie rozwiązania i nie byłoby trudno, gdyby centra rotacji tetrominos nie były inne dla niektórych tertominos (I i O). – Jacco

+0

Miałem nadzieję, że ktoś wymyśli magiczne liczby z teorii gry polynomino czy coś takiego. Większość tetrominos potrzebuje tylko 3 bitów, które można obracać z jednego stanu do drugiego. Próbowałem wielu rzeczy, ale jak mówisz, trudno jest wymyślić coś, co pasuje do danych o długości 140 bajtów + rozpakowywanie :-) – Jacco

+0

To dobra uwaga. Patrząc wstecz na mój kod, zapisałem każdy duszek kształtu jako własną prostokątną pod-tablicę z większą tablicą, więc każdy był zwymiarowany w najmniejszym prostokącie, który zmieściłby się w środku. Pozwoliło mi to je łatwo obracać, ale nie jestem pewien, czy spełniałby twoje potrzeby. – Troy