"Verschiebe-Algorithmus"



  • Mein Problem ist (mal wieder) etwas kompliziert zu erklären, ich versuche es so verständlich wie möglich zu machen.
    Ich habe ein Array mit folgenden Werten (Beispiel)
    x0123456
    00000000
    10200100
    20030000
    30010000
    Das Array ist eine Art Spielbrett, die Zahlen darauf die Steine/Einheiten.
    1 bedeutet nach oben gedreht, 2 um 90° nach rechts gedreht usw, also insgesamt 4 mögliche Werte für ein Feld plus 0 = leer.
    Pro Runde bewegt sich ein Stein ein Feld vorwärts und zwar in die Richtung, in die er zeigt.
    Pro Runde werden immer alle Steine verschoben, stossen zwei Steine zusammen, werden sie gelöscht (=das Feld auf 0 gesetzt)

    Code, den ich bisher dazu habe (in Pseudo-code, da sonst zuviel anderes Zeug verwirrt)

    for (int y = 1; y  < feld.höhe; y++) {
      for (int x = 1; x < feld.breite; x++) {
      try_to_move (x,y)
     }
    }
    
    ---
    
    try_to_move (int x, int y)
    {
    try_to_move_again:
    
    -Wenn der Stein schon bewegt wurde, return.
    -Neue Position berechnen und in neu_x und neu_y speichern
    -Wenn Zielfeld frei: move (x,y,  neu_x ,neu_y)
    -Wenn Zielfeld blockiert und der blockierende Stein schon bewegt wurde: CRASH
    -Wenn Zielfeld blockiert und der blockende Stein noch nicht bewegt 
    wurde: try_to_move (neu_x, neu_y)
    }
    

    Warum die Rekursion?
    030 //5=Richtung nach unten
    020 //3=Richtung nach rechts
    In diesem Fall würden (da das Feld von oben links durchgegangen wird, siehe Schleife) die Steine eigentlich crashen, wenn aber erst der 2er Stein bewegt wird, geht es doch ohne Crash.
    Sollte der 2er Stein ebenfalls blockiert werden, wird versucht diesen Stein zu bewegen usw.

    Das Problem ist jetzt zB folgender Fall:
    030 //nach unten
    010 //nach oben
    In diesem Fall ruft try_to_move sich selbst so lange auf, bis das Programm irgendwann crasht.

    Das könnte man natürlich dadurch verhindern, dass noch ~5 rekursiven Aufrufen abgebrochen wird, aber irgendwie erscheint mir das "zu plumb."
    Freue mich über jeden Vorschlag ( der zum Thema passt 😉 )


Anmelden zum Antworten