Einzelnen Beitrag anzeigen

Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Tetris rotation

  Alt 2. Mär 2011, 16:44
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...
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton ( 2. Mär 2011 um 16:49 Uhr)
  Mit Zitat antworten Zitat