52 lines
2.4 KiB
Markdown
52 lines
2.4 KiB
Markdown
# Arbeitsauftrag V: FEHLER - der Hase läuft vom Feld
|
|
|
|
Sie haben vielleicht schon bemerkt, dass die Bewegung nach links und nach unten gut funktioniert. Die Bewegung nach rechts und oben führt aber noch zu einem Fehler.
|
|
|
|
Das ist damit zu erklären, dass wir das gesamte Spielfeld von links oben nach rechts unten ablaufen und den Hasen suchen. Wenn wir nun einen Hasen finden und um ein Feld nach rechts verschieben, finden wir ihn dann ja im nächsten Schritt wieder und verschieben ihn noch einmal und dann wieder…
|
|
|
|
Das Problem können wir lösen, indem wir ein Kontrollfeld (Spielfeld im nächsten Schritt) einführen. Wir setzen die neue Position des Hasen nur auf dem Kontrollfeld. Dann finden wir diesen Hasen auch nicht erneut auf dem eigentlichen Spielfeld. Nach der Doppel-Schleife über das Spielfeld kopieren wir dann den Spielstand im Kontrollfeld auf das Spielfeld.
|
|
|
|
Dazu müssen wir folgendes einfügen:
|
|
|
|
Zu Beginn der Methode `def tasteGedrueckt(self, taste)` wird das Kontrollfeld angelegt:
|
|
|
|
```python
|
|
def tasteGedrueckt(self, taste):
|
|
kontrollfeld = copy.deepcopy(self.spielfeld)
|
|
```
|
|
|
|
Dabei wird das Spielfeld auf das Kontrollfeld kopiert um auch Spielfiguren, die nicht bewegt werden nicht zu verlieren. Für das Kopieren müssen wir noch ganz oben ein `import` ergänzen:
|
|
|
|
```python
|
|
import pygame
|
|
import copy
|
|
|
|
class MeinSpiel:
|
|
...
|
|
```
|
|
|
|
Dann folgt in `tasteGedrueckt()` das Ablaufen des Spielfelds zum Beispiel nach Drücken der Taste `w`:
|
|
|
|
```python
|
|
if pygame.K_w == taste:
|
|
for x in range(len(self.spielfeld)):
|
|
for y in range(len(self.spielfeld[x])):
|
|
if self.spielfeld[x][y] == 1:
|
|
kontrollfeld[x][y-1] = 1
|
|
kontrollfeld[x][y] = 0
|
|
```
|
|
|
|
Im Gegensatz zu vorher, suchen wir immer noch das Spielfeld ab (`if self.spielfeld[][]==1`), aber führen die Änderungen im Kontrollfeld durch (`kontrollfeld[][]=1`). Dadurch wird derselbe Hase beim Durchsuchen nicht ein zweites Mal gefunden.
|
|
|
|
Und am Ende der Methode wird das Spielfeld mit dem Kontrollfeld überschrieben.
|
|
|
|
```python
|
|
self.spielfeld = kontrollfeld
|
|
```
|
|
|
|
Aufgabe 1: Bauen Sie das Kontrollfeld ein. Ergänzen Sie die Bewegung mit `w`/`a`/`s`/`d`.
|
|
|
|
Hinweis 1 und Aufgabe 2: Es werden immer noch Fehler auftauchen, sobald der Hase über den rechten oder unteren Rand läuft. Dies liegt daran, dass Sie dann aus dem Spielfeld hinauslaufen.
|
|
|
|
Bauen Sie hier eine Lösung ein (Tipp: „Wenn der Hase den rechten Rand erreicht, dann….“)
|