Das Ganze ist Teil eines Projekts zur Realisierung eines Tetris-Autopiloten und
deswegen etwas umfangreicher...
die Klasse:
Delphi-Quellcode:
type
tAutoPilot = class(tComponent)
// ...
private
FPossibs: array of tTarget; // Liste der möglichen Ziele
// ...
procedure AddPossib( const nNbr: ShortInt; const oTarget: tTarget ); // fügt der Liste ein Ziel hinzu
end;
Deklarationen:
Delphi-Quellcode:
// Liste, die für jede Steinart speichert, ob etwas wahr/möglich oder falsch/nicht möglich ist
tShapes = array[0..6] of Boolean;
// Liste, die die vertikale Position des obersten Steins jeder Spalte speichert
tColumns = array[0..DISP_WIDTH - 1] of ShortInt;
// Datensatz, der alle relevanten Daten zum Relief einer Karte speichert
tRelief = record
nY : tColumns; // oberster Stein der der jeweiligen Spalte
fAverage, // durchschnittliche Spaltenhöhe*
fDepth : Real; // Summe der Abweichungen von * aller Spalten
nHeight, // Anzahl der (von oben gesehen) gefüllten Reihen mit gleicher freien Spalte
nGap : ShortInt; // Position der "Tetris-Spalte"
bShapes : tShapes; // welche Steinform findet auf Relief Platz (ohne Lücke zu erzeugen!)
bTetris : Boolean; // Tetris möglich oder nicht (unabhängig vom aktuellen Stein)
end;
// Datensatz, der relevante Daten zur Positionierung eines Steins speichert
tBlockState = record
nLeft, nTop, nRot: ShortInt; // Position und Rotationsgrad
end;
// Datensatz, der alle relevanten Daten eines möglichen Ziels speichert
tTarget = record
nEmpty : ShortInt; // entstehende Lücken
nEval : array[0..5] of ShortInt; // Bewertung
oState : tBlockState; // einzunehmende Position und Rotation
oRelief : tRelief; // zugehöriges Relief
end;
..."zur Not" könnte ich die Anzahl der Elemente auch seperat speichern,
was aber nicht unbedingt der (sowieso schon recht katastrophalen) Lesbarkeit
beträgt. Außerdem ist es natürlich immer besser derartige Fehler im eigenen
Programmier-Stil vermeiden zu können...