2013-08-01 8 views
5

Ich versuche, eine Miniatur-Version von Tetris zu schreiben, so viel wie möglich an die Tetris Richtlinien entspricht:Miniatur Javascript Tetris

Um genau zu sein ich die wollen Komplettes Spiel, das aus so wenig wie möglich 140 Byte Javascript aufgebaut wird. Das erste 140-Byte-Skript sollte ein Array mit 112 ganzzahligen Werten zurückgeben, die die 4 Reihen der 7 Tetrominos in jeder der 4 gedrehten Positionen darstellen. Die genaue Reihenfolge der Drehungen ist sehr wichtig.

Ich habe so weit wie die Daten in 16bit Unicode-Zeichen setzen (sie zählen als 2 Bytes obwohl) und entpacken in etwas mehr als 140 Bytes.

Kennt jemand eine clevere Art, dieses Array zu konstruieren?

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

möglich Duplikat von [Code Golf: Tetris spielen] (http://stackoverflow.com/questions/3858384/code-golf-playing-tetris) – Blender

+0

Hi Blender, nein das ist eine ganz andere Sache da. Das war ein Wettbewerb von Tetromino, der kein richtiges Spiel war. Grüße, Jacco – Jacco

+0

Nicht direkt verwandt, aber stört es mich fragen, wo der Wettbewerb ist? Ich habe keine aktiven Gruppen für JS Golf gefunden. –

Antwort

2

vielleicht möchten Sie im Auge behalten, dass ein Ein cleveres Codierungsschema für dieses Array wird zu einer längeren Decodierungslogik führen, so dass der Versuch, dies zu sehr zu optimieren, möglicherweise penny-weise und plump-töricht ist. Da ich aber selbst einmal ein Tetris-Spiel in JavaScript geschrieben habe (wenn auch nicht größenoptimiert), weiß ich, dass es nicht wirklich schwierig ist, eine Funktion zu schreiben, um jede Form n mal zu drehen. Angenommen, Sie sind nicht stark mit der Geschwindigkeit eingeschränkt, warum haben Sie nicht nur einen LUT-Eintrag für jede Form in der Standardausrichtung und drehen sie prgrammatisch? Sie stellen möglicherweise fest, dass dadurch insgesamt weniger Speicherplatz belegt wird (insbesondere, wenn die Größe des Dreh-/Transponierungscodes weniger als 3/4 der Array-Größe beträgt).

BEARBEITEN: Ein zusätzlicher Vorteil auf diese Weise ist, dass Sie nicht den Rotationsstatus einer Form im Raster verfolgen müssen, Sie müssen nur die aktuelle Anordnung verfolgen. Wenn sich jemand dreht, drehen Sie das Array mit Ihrer Funktion. Dies beseitigt die Notwendigkeit, eine Überprüfung durchzuführen (z. B. wenn Rotation> 3, Rotation = 0).

+0

Danke für Ihren Kommentar! Ich habe Lösungen wie diese gesehen, und es wäre nicht schwer, wenn die Rotationszentren der Tetrominos für einige der Tertiinos (I und O) nicht anders wären. – Jacco

+0

Ich hatte gehofft, jemand würde mit einigen magischen Zahlen aus der Polynomino Spieltheorie oder so etwas kommen. Die meisten Tetrominos brauchen nur 3 Bits, um von einem Zustand zum nächsten gedreht zu werden. Ich habe viele Dinge ausprobiert, aber wie du sagst, ist es schwer, etwas zu finden, das zu den 140 Bytes Daten + Entpacken passt :-) – Jacco

+0

Das ist ein guter Punkt. Wenn ich auf meinen Code zurückblicke, habe ich jedes Shape-Sprite als eigenes rechteckiges Sub-Array mit einem größeren Array gespeichert, so dass jedes auf das kleinste Rechteck zugeschnitten wurde, in das es passen würde. Dadurch konnte ich sie leicht drehen, aber ich bin mir nicht sicher, ob es Ihren Bedürfnissen entspricht. – Troy