2013-08-01 4 views
5

Sto cercando di scrivere una versione in miniatura di Tetris che aderisce alle linee guida Tetris il più possibile:miniatura Javascript Tetris

per essere precisi voglio il gioco completo da costruire il meno possibile 140 byte javascript. Il primo script da 140 byte deve restituire un array con 112 valori interi che rappresentano le 4 righe dei 7 tetrominos in ciascuna delle 4 posizioni ruotate. L'ordine di posizione esatto delle rotazioni è molto importante.

Mi sono spinto a inserire i dati in caratteri unicode a 16 bit (contano comunque 2 byte) e decomprimere in appena 140 byte.

Qualcuno conosce un modo intelligente per costruire questo array?

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

possibile duplicato di [Code Golf: Playing tetris] (http://stackoverflow.com/questions/3858384/code-golf-playing-tetris) – Blender

+0

Hi Blender, non è una cosa completamente diversa lì. Quella era una gara di montaggio di tetromino non un vero gioco. Cordiali saluti, Jacco – Jacco

+0

Non direttamente correlato, ma ti dispiace che mi chieda dove si trova il concorso? Non sono stato in grado di trovare gruppi attivi per JS golf. –

risposta

2

Si potrebbe desiderare di tenere a mente che un altro uno schema di codifica intelligente per questo array si tradurrà in una logica di decodifica più lunga, quindi provare a ottimizzarlo troppo potrebbe essere pessimo e pazzesco. Tuttavia, avendo scritto un gioco di tetris in JavaScript una volta sola (anche se non ottimizzato per le dimensioni), so che non è davvero difficile scrivere una funzione per ruotare ogni forma n volte. Supponendo che tu non sia pesantemente vincolato alla velocità, perché non avere solo una voce LUT per ogni forma nell'orientamento predefinito e ruotarli prrammaticamente? Potresti scoprire che questo si traduce in un minore spazio complessivo utilizzato (in particolare, se la dimensione del codice di rotazione/trasposizione è inferiore a 3/4 della dimensione dell'array).

MODIFICA: Un ulteriore vantaggio di farlo in questo modo è che non è necessario tenere traccia dello stato di rotazione di una forma sulla griglia, è sufficiente tenere traccia della sua matrice corrente. Quando qualcuno ruota, ruota l'array con la tua funzione. Ciò elimina la necessità di eseguire un controllo (ad esempio se rotazione> 3, rotazione = 0).

+0

Grazie per il tuo commento! Ho visto soluzioni del genere e non sarebbe stato difficile se i centri di rotazione dei tetrominos non fossero diversi per alcuni dei tertominos (I e O). – Jacco

+0

Speravo che qualcuno potesse inventare dei numeri magici dalla teoria dei giochi polinomino o qualcosa del genere. La maggior parte dei tetrominos richiede solo 3 bit per essere ruotati da uno stato all'altro. Ho provato un sacco di cose ma, come dici tu, è difficile trovare qualcosa che si adatti ai 140 byte di dati + decompressione :-) – Jacco

+0

Questo è un buon punto. Guardando indietro al mio codice, ho memorizzato ogni sprite di forma come un suo sub-array rettangolare con un array più grande, quindi ognuno di essi era dimensionato nel più piccolo rettangolo che avrebbe potuto contenere all'interno. Questo mi ha permesso di ruotarli facilmente, ma non sono sicuro che soddisferebbe le tue esigenze. – Troy