Bei Tetris die vollen Reihen löschen ? ( SDL und C ++ )



  • Hallo!

    Ich schreibe gerade ein Tetris-Spiel!
    Ich bin noch nicht ganz fertig. ( Muss noch 5 Steine machen )

    Ich versuche gerade, eine volle Reihe zu löschen, das klappt aber leider nicht 😞

    Mein jetziger Code funktioniert (halb). Er löscht die Reihe, wenn jeder Spalte, außer die erste, voll ist, also ungefähr so:
    | |x|x|x|x|x|x|x|x|
    Das hier würde mein Code löschen (auch, wenn sie ganz voll ist)!

    Das ist der Code zum löschen der Zeilen:

    int currentY_CheckPOS = 3,
    					countLine = 0;
    
    				/* * * * Check, if there's a full Line * * * */
    				for ( int i = 0; i <= 188; i++ ) {
    
    					if ( BlockTYPE[i] > 0 && Block_Y[i] == currentY_CheckPOS ) {
    						countLine++;
    
    						if ( countLine >= 8 ) {
    
    							/* * * * * If there's a full Line * * * */
    
    							for ( int i2=0; i2<= 188; i2++ ) {
    								if ( Block_Y[i2] == currentY_CheckPOS ) 
    									BlockTYPE[i2] = 0;
    								savedBlockTYPE[i2] = BlockTYPE[i2];
    							}
    
    					/* * * * If there's a Line which isn't full * * * */
    					} else { 
    						countLine = 0; 
    						currentY_CheckPOS = Block_Y[i]; 
    					}
    				}
    

    Hoffentlich kann mir jemand helfen, der sich damit gut auskennt!

    Vielen Dank im Voraus! 👍

    Lg
    SFandler



  • Ich hab nur ne ganz vage Vermutung, was du da überhaupt machst (wir haben ja keine Informationen darüber, was currentY_CheckPos, countline, BlockTYPE, Block_Y etc. sind).

    Probier mal Zeile 10 zu ändern in:

    if ( countLine == 9 ) {
    


  • Hi!

    Danke für deine Antwort!

    if (countLine == 9) habe ich schon versucht, aber dann kommt garnichts weg 😕

    Ok hier die Erklärung für die Variabeln:

    countLine = Zählt mit, wie viele Steine auf einer Reihe sind.
    Also eine Reihe hat bei mir 9 Spalten, und wenn
    eine Reihe dann voll ist, müsste countLine den
    Wert 9 haben.

    currentY_CheckPOS = Auf der Y-Koordinate / Zeile wird geprüft, ob
    sie voll oder leer ist.

    BlockTYPE = Art des Blocks (Wenn BlockTYPE größer 0 ist, ist ein Stein
    auf der jeweiligen Posotion ( --> Block_Y und Block_X )

    savedBlockTYPE = Ist nur da, damit die Steine eine Reihe runterfallen, falls
    eine volle Reihe gelöscht wurde.
    Es speichert den Wert von BlockTYPE (Weiß nicht mehr warum 🙄 )

    Ich hoffe, ihr könnt mit dem etwas anfangen.

    Danke!

    Lg
    SFandler



  • Juhu! 😃

    Ich habe gerade noch ein wenig herum probiert, und dann
    ist mir aufgefallen, dass, wenn auf einer Position kein Stein ist (Zeile 7)
    in der else Schleife (Zeile 22) garnicht geprüft wird, ob auf der nächsten
    Zeile der Stein [i] liegt!

    Habe jetzt einfach in diesem else das if von Zeile 7 kopiert und falls es zutrifft,
    wird countLine um 1 erhöht!

    Danke für deine Hilfe, inter2k3! 👍

    Lg
    SFandler


  • Mod

    SFandler, es schaut ja aus als ob du gerade lernst, von daher der tipp, versuch keine nichtssagenden zahlen zu verwenden (auf english magic numbers genannt).

    statt also 0 und 7 und 8 und 9 und 188 usw. verwende konstanten (dafuer sind sie da)
    z.B.

    const int EMPTY_CELL = 0;
    const int FIELD_WIDTH = 8;
    const int FIELD_HEIGHT = 12;
    const int FIELD_SIZE = FIELD_WIDTH*FIELD_HEIGHT;
    ...
    

    auf diese weise wird dein code nicht nur besser zu lesen sein, du kannst auch an einer stelle z.b. die breite aendern und es sollte einfach so ueberall passen. ansonsten muesstest du durch den ganzen code gehen und jede stelle finden.

    desweiteren ist es unueblich i2 fuer als variable fuer loops zu nutzen, man verwendet einfach das alphabet weiter, also entweder a,b,c,d... oder i,j,k,l,m,n... manchmal, wenn man, wie z.B. in deinem falle, ein 2d feld durchgeht, bietet sich auch x,y an.


Log in to reply