AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Array of Word = Spielstein?
Thema durchsuchen
Ansicht
Themen-Optionen

Array of Word = Spielstein?

Ein Thema von Mr.Wrong · begonnen am 12. Jul 2010 · letzter Beitrag vom 14. Jul 2010
Antwort Antwort
Mr.Wrong

Registriert seit: 16. Jun 2010
6 Beiträge
 
Delphi 2 Desktop
 
#1

Array of Word = Spielstein?

  Alt 12. Jul 2010, 09:46
Guten Morgen,

mir wurde in diesem Forum schon einmal toll geholfen, deshalb hoffe ich, hier auch eine Antwort auf diese aktuelle Frage zu finden.
Ich habe hier einen Quellcode von dem allseits bekannten Spiel "Tetris", den ich versuche, nachzuvollziehen. Bis auf eine Stelle ist das auch kein Problem. Aber in den Constanten werden offenbar die Spielsteine wie folgt deklariert:

Code:
const T_piece : array[0..27] of word = (52224,52224,52224,52224,
                                         50240,59392,35008,11776,
                                         51328,36352,17600,57856,
                                         35904,27648,35904,27648,
                                         19584,50688,19584,50688,
                                         19968,19520, 3648,17984,
                                         17476,61440,17476,61440);
      T_Speed : array[1..10] of word = (350,320,290,260,230,200,170,140,110,80);
      T_Points : array[0..4] of word = (0,100,300,600,1000);
      T_Clig  : array[0..1] of Word = (100,150);
Wie gesagt, das obere sind die Spielsteine. Was mir komplett verborgen bleibt: woher hat der Autor die Zahlen genommen? Was bedeuten sie? Wie kann man diese Zahlen "auslesen"?? Ehrlich gesagt, blicke ich absolut nicht, woher die Zahlen genommen wurden und was sie zu bedeuten haben.
Könnte mir hier jemand weiterhelfen? Der Code, den ich hier habe, ist zwar zum Üben gedacht, aber leider in französisch und der Sprache bin ich jetzt nicht so unbedingt mächtig...
Wäre schön, wenn mir jemand auf die Sprünge helfen könnte. In der Spiele-Programmierung kenne ich mich leider nicht so aus.

Viele "erfrischende" Grüsse,
Mr.Wrong
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: Array of Word = Spielstein?

  Alt 12. Jul 2010, 09: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 13:33 Uhr)
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#3

AW: Array of Word = Spielstein?

  Alt 14. Jul 2010, 08:56
*mal hochpushen, falls der Threadhersteller nicht gemerkt hat, dass mein Beitrag, der anfänglich kaum Informationen geboten hat, wesentlich verändert wurde*
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz