Einzelnen Beitrag anzeigen

blackfin
(Gast)

n/a Beiträge
 
#2

AW: Array of Word = Spielstein?

  Alt 12. Jul 2010, 10:58
Ganz klar ist es für mich auch noch nicht, aber villeicht hilft ja schon folgende Vermutung:

Ich glaub ich habs:

T_piece beschreibt zeilenweise die einzelnen Spielsteine und ihre ausgefüllten Pixel / Blöcke im 4x4-Raster für alle 4 verschiendenen möglichen Drehungen in Tetris, wenn die Drehrichtung gegen den Uhrzeigersinn verläuft.
Halt, hiergeblieben!! Jetzt noch nicht aufgeben, auch wenn dieser Satz zunächst wohl noch weniger zum Verständnis beiträgt....


Denn die Erklärung folgt gleich auf dem Fuße:
#############################################

Gehen wir erstmal mal die Grundvorraussetzungen von Tetris durch:
Es gibt in Tetris 7 verschiedene Spielsteine in jeweils 4 verschienden Rotationen (90°-Winkel), also insgesamt 28 Zustände (7 Spielsteine a 4 Drehungen), und das deckt sich auch "zufälligerweise" mit der Array-Grösse [0..27] von T_piece.
Ein Spielstein ist zudem maximal 4 Blöcke hoch und maximal 4 Blöcke breit, also ergibt sich ein 4x4-Raster, um beim Zeichnen alle Spielsteine abdecken zu können.

Mit diesem Wissen lautet also die erste Vermutung bei Betrachtung von T_piece:
Die einzelnen, notierten Array-Zeilen in T_piece sind also die verschiedenen Spielsteine mit den zugehörigen (Aus)-Füllungen des 4x4-Rasters bei allen 4 möglichen Drehungen der Spielsteine.
(Eigentlich wäre hier meiner Meinung nach ein Konstrukt wie "array[0..6] of array[0..3] of Word" sinnvoller gewesen, aber anyway...der Autor hat es halt nur visuell im Code nach 4-er Blöcken getrennt...)

Um die Vermutung auch zu bestätigen, schauen wir uns zunächst mal das Array genauer an und betrachten explizit die erste Zeile, die ja laut der Vermutung ein einzelner Spielstein mit alle seinen Drehungen beschreiben soll:
Da hier alle 4 notierten Zahlen gleich sind (52224), liegt die Vermutung nahe, dass es wohl ein Spielstein ist, bei dem alle Drehungen die gleichen Füllungen beinhalten....und das gibts ja nur beim Quadrat.
Also wird die erste Zeile wohl das Quadrat sein.
Aber was sagt diese kryptische Zahl 52224 nun aus? Ich habe nun einfach mal rumprobiert und sie in ihre binäre Schreibweise umgewandelt, und siehe da, nun macht diese Zahl doch etwas mehr Sinn:
Die Zahl selbst beschreibt binär die Füllungen im 4x4-Raster von Tetris, bei einer Drehrichtung gegen den Uhrzeigersinn.
Häh? Wie jetzt??? Nunja, bevor du dich jetzt fragst, was der Kerl hier für komisches Zeug schreibt, gehen wir doch mal die erste Zeile im Array T_piece als Beispiel durch:

1) Erste Array-Zeile (Quadrat):

Hier ist 4x die Zahl 52224 für alle Drehungen geschrieben.
52224 ist binär geschrieben 1100110000000000...mhm, das sieht auf den ersten Blick genauso kryptisch aus.
ABER, halt! Nicht ganz: Teilt man diese Binärzahl "visuell" in ein 4x4-Raster auf, dann sieht das schon ganz anders aus, nämlich so:

Delphi-Quellcode:

// Drehungen des Spielsteins "Quadrat":

{52224 = 1100110000000000}
1100
1100
0000
0000

// ...die 3 weiteren Drehungen sind exakt gleich.
Machts nun "pling"? An den Einsen erkennst du nun das Quadrat!
Und da die Füllungen ja beim Quadrat in allen Drehungen gleich sind, ist hier 4x die gleiche Zahl 52224 notiert worden.
Das "binäre Schaubild" für die übrigen drei Drehungen würde also beim Quadrat gleich aussehen, deswegen habe ich diese übersprungen und gehe lieber weiter zum nächsten Spielstein, bei dem die Drehungen alle unterschiedlich sind:

2) Zeile zwei / Spielstein zwei funktioniert genauso, nur dass hier die Drehungen nicht gleich sind, ergo verschiedene Zahlen notiert sind:
50240,59392,35008,11776

Dann gehen wir diese Zahlen doch mal durch und schreiben diese ebenfalls binär im 4x4-Raster, um herauszufinden, was für ein Spielstein das sein könnte:
Delphi-Quellcode:
// Die 4 Drehungen des nächsten Spielsteins (welcher das wohl ist? :))

{50240 = 1100010001000000}
1100
0100
0100
0000

{59392 = 1110100000000000}
1110
1000
0000
0000

{35008 = 1000100011000000}
1000
1000
1100
0000

{11776 = 0010111000000000}
0010
1110
0000
0000

.....Wenn man sich nun wieder die Einsen ansieht, wird die Sache klar: Man erkennt den berühmten Tetris-Spielstein "L-Block" in all seinen glamourösen Drehungen.
Was man ebenfalls erkennen kann, ist die Drehrichtung gegen den Uhrzeigersinn.
Willst du in die andere Richtung drehen, musst du die Array-Zeilen in T_piece einfach von Hinten nach vorne durchlaufen.
In der Zeichenroutine musst du jetzt nur noch nachsehen, wo in der Binärzahl eine 1 steht und diese Blöcke dann in einem 4x4-Raster ausfüllen, die anderen lässt du leer...und schon hast du deinen Spielstein gezeichnet.
Genauso wie mit dem "L-Block" geht es dann eben auch mit den übrigen Zeilen / Spielsteinen weiter. (Das führe ich nun aber nicht mehr aus )


Und nun zu den anderen Arrays:
##############################

T_Speed ist wahrscheinlich eine Liste der möglichen Spielstein-Geschwindigkeiten (Vermutung: Irgendwelche Timer-Werte).

T_Points ist wahrscheinlich eine Liste der möglichen Erscheinungspunkte der Spielsteine (Vermutung: Mhm...ohne Codeschnipsel, bei dem das verwendet wird, ist das schwer rauszufinden..)

T_Clig ist...keine Ahnung...irgendein Klick-Bereich? Hast du ein Codeschnipsel verfügbar, bei dem T_Clig verwendet wird?


Edit:
Ich hoffe, du kannst mit meiner Erklärung etwas anfangen, auch wenn sie jetzt doch etwas lang geworden ist....
Auf jedenfall hat es mir selbst Spass gemacht, das ganze rauszufinden

Geändert von blackfin (12. Jul 2010 um 14:33 Uhr)
  Mit Zitat antworten Zitat