AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tetris rotation

Ein Thema von pustekuchen · begonnen am 2. Mär 2011 · letzter Beitrag vom 3. Mär 2011
Antwort Antwort
Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#1

Tetris rotation

  Alt 2. Mär 2011, 13:53
Guten Tag,

ich bin derzeit in C# ein Tetris am Programmieren. Ich suche aber eine Allgemeine Lösung.
Mir stellt sich derzeit eine Frage und ich wollte mal wissen, wie Ihr es machen würdet.

Und zwar geht es um die Rotation der Spielsteine.
Es gibt mehrere Rotationssysteme. Ich habe mich für das SRS(Super Rotation System) entschieden, weil dies mir am vertrautesten vorkommt.
So wie setzte ich das ganze nun am besten um?
Bei meiner Recherche sind mir 2 Wege aufgefallen, entweder Mathematisch oder mit vorher festgelegten Werten z.B. in einem Array in dem alle Rotationsfälle stehen.

Dieses Bild habe ich zur Mathematischen lösung gefunden, doch ganz versteh ich das nicht.

Was sagt Ihr? Vielleicht könnt ihr mir einen kleinen Denkanstoß geben
Delphi programming is awesome.

Geändert von pustekuchen ( 2. Mär 2011 um 14:44 Uhr) Grund: weil ich es kann
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Tetris rotation

  Alt 2. Mär 2011, 15:26
Ich versteh das so, dass ja jede Figur in einen quadratischen Block eingeschlossen wird, der je nach Figur untersch. groß ist. Ein quadratischer Block entspricht einer quadr. Matrix.
Wo in der quadratischen Matrix eine 1 steht, ist im Bild ein Blöckchen der Tetris-Steins. Somit für den langen gereden 4er Tetris-Stein gibt es je eine 4x4 Matrix:

Code:
0010    0000    0100    0000
0010    0000    0100    1111
0010    1111    0100    0000
0010    0000    0100    0000
Wahrsch. ist es aber einfacher, jeweils 4 fertige Bilder in einer Liste zu haben...
Ralph
  Mit Zitat antworten Zitat
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, 15: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 15:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Tetris rotation

  Alt 2. Mär 2011, 15:51
Danke erstmal.

Ihr würdet also auch ehr den Mathematischen weg nehmen?
Ich werde mich morgen damit weiter befassen und das ganze mal umsetzten, jetzt hab ich erstmal Feierabend
Delphi programming is awesome.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

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

AW: Tetris rotation

  Alt 2. Mär 2011, 15:53
Ja, ich würde den mathematischen Weg nehmen!
Have fun!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Tetris rotation

  Alt 3. Mär 2011, 09:31
Hallo,

hab das ganze jetzt mal für den ' ---- '-Stein angepasst.
Nur ein Problem besteht jetzt noch, wenn ich öfters hintereinander nach rechts drehe Bewegt der Spielstein sich nach rechts.
Bei der Linksdrehung bleibt alles okay.

Hier mal die jetzige Methode:
Code:
public override void rotate(RotateDirection rotDir)
        { 
            Point AB;
            int Dimension = 5;

            Mittelpunkt = (Fields[2].X > Fields[1].X || Fields[2].Y > Fields[1].Y) ? Fields[2] : Fields[1];

            bool[] fieldIsRefreshed = {false,false,false,false};
            for (int i = Mittelpunkt.X - 2; i < Mittelpunkt.X - 2 + Dimension - 1; i++)
            {
                for (int j = Mittelpunkt.Y - 2; j < Mittelpunkt.Y - 2 + Dimension - 1; j++)
                {
                    for (int k = 0; k < Fields.Length ; k++)
                    {
                        if (!fieldIsRefreshed[k])
                        {
                            if (i == Fields[k].X && j == Fields[k].Y)
                            {
                                AB = new Point(i - Mittelpunkt.X, j - Mittelpunkt.Y);
                                AB = (rotDir == RotateDirection.Right) ? AB = new Point(-AB.Y, AB.X) : new Point(AB.Y, -AB.X);
                                Fields[k] = new Point(AB.X + Mittelpunkt.X, AB.Y + Mittelpunkt.Y);
                                fieldIsRefreshed[k] = true;
                            }
                        }
                    }
                }
            }
        }
Jetzt nur noch verallgemeinern für die anderen Spielsteine und dann sollte es klappen
Delphi programming is awesome.
  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 01:18 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