2016-04-06 10 views
-1

Ich mache derzeit ein Tetris mit SDL als Teil meiner Kursarbeit und ich habe eine Frage. Meine Tetris besteht aus einer Klasse TetrisWindow, die alle nützlichen Funktionen wie DrawLine etc. enthält, aber am wichtigsten ist eine vordefinierte Methode Arbeit, die als Schleife fungiert und das ist, wo ich meine Stücke einfügen, so dass sie fallen Methode Arbeit wird Infinetly genannt, es sei denn, es gibt eine Bedingung, um es zu stoppen. Ich habe auch ein Elternteil Klasse Block, die als eine abstrakte Klasse fungiert und enthält drawBlock Methode. Es ist Kinder alle Stücke von tetris sind, so dass im Grunde ein Stück „I“ würde wie folgt aussehen:Switching Stücke in Tetris mit Polymorphismus

void PieceI::drawPiece() 
{ 
    drawBlock(x1,y1); 
    drawBlock(x2,y2); 
    drawBlock(x3,y3); 
    drawBlock(x4,y4); 
} 

Und bewegen jedes Stück nach unten benutze ich nur:

void PieceI::movePieceDown() 
{ 
    if (y1 !=20 && y2 != 20 && y3 != 20 && y4 != 20) //makes the piece stop at the bottom 
    { 
    drawBlock(x1,y1++); 
    drawBlock(x2,y2++); 
    drawBlock(x3,y3++); 
    drawBlock(x3,y4++); 
} 
} 

zufällig zerpflücken I auch ein Verfahren in Block hat, kehrt das zufällig neuen PieceI oder neuen PieceO:

Block* Block::choosePiece() 
{ 
    srand(time(NULL)); 
    switch(rand() %6) 
    { 
    case 0: return new PieceI; break; 
    case 1: return new PieceO; break; 
    etc...... 
    } 
} 

So im Grunde genommen in Klasse TetrisWindow Ich habe einen Zeiger auf den Klasse-Block, die ich nenne "aktuelle", so in Klasse TetrisWindow ich habe:

void TetrisWindow::work() 
{ 
    counter++ 
    if(counter == 50) 
    { 
    current->choosePiece()->movePieceDown() 
    counter = 0; 
    } 
} 

(Ich benutze den Zähler zu verlangsamen die Arbeitsfunktion, weil ohne sie die Stücke zu schnell fallen.)

Schließlich ist das Problem, dass meine Stücke einfach weiter oben schalten, ohne auch nur eine Änderung zu erhalten, um zu fallen. Also immer choosePiece() gibt einfach eine neuePiece zurück und das war's. Ich weiß einfach nicht, welchen Zustand ich setzen muss, damit die Teile anfangen zu fallen.

+0

'srand (Zeit (NULL));' sollte einmal in 'main()' aufgerufen werden. _ "Also immer ** choicePiece() ** gibt nur eine ** neuePiece ** zurück und das war's." _ Uhm, was würdest du sonst noch erwarten und aus welchem ​​Grund? –

+0

srand (time (NULL)) funktioniert gut, die Methode gibt jedes Mal verschiedene Teile zurück, sie bekommen einfach keine Chance zu fallen, die Teile erscheinen einfach nacheinander oben ohne fallen –

+0

_ "srand (time (NULL)) funktioniert gut "_ Nein ist es nicht. Im Prinzip wird der Zufallsgenerator jedes Mal zurückgesetzt, wenn Sie diese Funktion aufrufen. In kleinen Zeitfenstern erhalten Sie bei jedem Aufruf von 'rand()' den gleichen Wert. [Lesen Sie hier bitte] (http://stackoverflow.com/questions/4926622/how-to-generate-different-random-numbers-in-a-loop-in-c). –

Antwort

0

Das Problem ist in Ihrer Arbeitsweise:

void TetrisWindow::work() 
{ 
    counter++ 
    if(counter == 50) 
    { 
    current->choosePiece()->movePieceDown() 
    counter = 0; 
    } 
} 

Wenn Sie anrufen current->choosePiece()->movePieceDown() Sie eine Instanz der Klasse Block erstellen, dann auf diese Instanz die movePieceDown Methode aufrufen. Wenn Sie dann eine Schleife erstellen, rufen Sie die gleiche Anweisung erneut auf und erstellen eine neue Instanz von Block und verschieben , die down.

Sie müssen:

  • die Referenz auf das Objekt choosePiece-Block zuweisen() erzeugt, um eine variable
  • diese Variable verwenden movePieceDown in einer Schleife für die Stückbewegung
  • Prüfung, wenn das Stück zu nennen hat den Boden getroffen, um die Schleife zu verlassen, wo Sie dieses Stück nach unten bewegten
  • Dann erstellen Sie ein neues Stück mit choosePiece().
+0

Ich habe es :) Danke für die Hilfe, ich werde es ausprobieren, aber ich bin sicher, es wird funktionieren :) Vielen Dank für die Hilfe :))))) –