"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)