Du kannst dir ein Array of Array of Boolean mit einer Dimension von n*n definieren, wobei n = ungerade.
Beispiel: n = 5:
Array[0..4, 0..4] of Boolean;
Hier wäre die Mitte [2,2]. Dh. diese Stein wird nicht geändert.
Beim Rotieren kannst du einfach von diesem Punkt aus Vektoren zu den einzelnen Feldern aufstellen und dazu jeweils die passende Normale nehmen (kippen nach links [-y|x] oder rechts [y|-x]).
Dieser Vektor addiert auf [2,2] ergibt die Koordinaten des Zielfeldes.
Codemäßig dürfte das wie folgt aussehen:
Delphi-Quellcode:
const
BrickDimension = 5;
type
TTetrisBrick = Array[0..BrickDimension-1, 0..BrickDimension-1] of Boolean;
const
// die Waagrechte
Brick1: TTetrisBrick= (
(False, False, False, False, False),
(False, False, False, False, False),
(True, True, True, True, True),
(False, False, False, False, False),
(False, False, False, False, False)
);
// weitere
{...}
procedure RotateBrick(var B: TTetrisBrick);
var
i, j: Integer;
M, AB: TPoint;
R: TTetrisBrick;
begin
M := Point( BrickDimension div 2, BrickDimension div 2 );
for i := 0 to BrickDimension - 1 do
for j := 0 to BrickDimension - 1 do
begin
AB := Point( i - M.X, j - M.Y );
// normale(nach links kippen):
AB := Point( -AB.Y, AB.X );
R[M.X+AB.X,M.Y+AB.Y] := B[i,j];
end;
B := R;
end;
Ich habs sogar grad getestet (habs ja nur ausm Kopf hingeschrieben gehabt) und das funzt wie es soll...