From 266f3ae1bcbe8a11ec95f300e47453921b8bf38e Mon Sep 17 00:00:00 2001 From: "aron.sommer" Date: Mon, 26 Oct 2026 20:09:06 +0100 Subject: [PATCH] Bewegungslogik umgebaut --- .flake8 | 2 + README.md | 9 +++- main.py | 24 ++++----- meinspiel.py | 139 ++++++++++++++++++++------------------------------- 4 files changed, 73 insertions(+), 101 deletions(-) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..e44b810 --- /dev/null +++ b/.flake8 @@ -0,0 +1,2 @@ +[flake8] +ignore = E501 diff --git a/README.md b/README.md index 6514c0e..5f3229d 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,12 @@ Ein Brettspiel (bei dem später eventuell mehrere Spieler zusammen bzw. abwechse ## Protokoll +## 26.10.2026 (zuhause) + +Ich habe das Problem mit der Bewegung der Figuren gelöst, indem ich die Bewegungslogik so umgebaut habe, dass nicht mehr bei jedem Zug basierend auf der aktuellen x- und y-Position die nächsten Schritte durch if-Abfragen vorgegeben werden. Stattdessen wird jetzt in der `anfangsKonfiguration()` eine Pfad-Variable für die Figuren angelegt und die genauen Koordinaten der Felder, über die die Figuren laufen sollen, in richtiger Reihenfolge mit `range()`-Funktionen in das Array der Pfad-Variable eingefügt (über STRG+Linksklick auf die range-Funktion habe ich herausgefunden, dass man auch einen Stop-Wert für das Zählen eingeben kann und die Zählrichtung mit -1 für ungerade Zeilen umkehren kann). Durch die `min()`-Funktion in der `tasteGedrueckt()`–Funktion bleiben die Figuren außerdem am Ende des Spielfelds stehen und laufen nicht mehr weiter. + +**TODO für den Untericht:** Spielfelddesign, Spezialfelder + Erkennung (so, dass ein besonderes Ereignis ausgelöst werden kann) + ## 07.10.2026 Es besteht weiterhin ein Problem mit steckenbleibenden Figuren, sobald diese in die zweite Zeile wandern. Allerdings habe ich es jetzt geschafft, das Design ein bisschen zu überarbeiten und man kann jetzt auf einen "Würfeln"-Button drücken, statt jedes Mal die Leertaste zum Würfeln zu drücken. @@ -14,8 +20,7 @@ Es besteht weiterhin ein Problem mit steckenbleibenden Figuren, sobald diese in *(heute Doppelunterricht in Vertretungsstunde bei Frau Wilmsen)* -Es gab ein Problem mit der bewegungsrichtung-Variable, das dafür gesorgt hat, dass teilweise die falschen Figuren in die falsche Richtung bewegt wurden, da diese eine Variable für alle Figuren galt. Um das Problem zu beheben, habe ich die bewegungsrichtung-Variable vom Typ "string" zum Typ "dictionary" geändert, sodass Wertzuweisungen wie z. B. `{0: 'rechts', 1: 'rechts', 2: 'rechts', 3: 'rechts'}` entstehen, also jede Figur eine eigene Bewegungsrichtung, unabhängig von den anderen, haben kann. Jedoch führt dies nun am Ende des Spielfelds (rechts) wieder zu einem `IndexError: list index out of range`, den ich noch nicht beheben konnte. - +Es gab ein Problem mit der bewegungsrichtung-Variable, das dafür gesorgt hat, dass teilweise die falschen Figuren in die falsche Richtung bewegt wurden, da diese eine Variable für alle Figuren galt. Um das Problem zu beheben, habe ich die bewegungsrichtung-Variable vom Typ "string" zum Typ "dictionary" geändert, sodass Wertzuweisungen wie z. B. `{0: 'rechts', 1: 'rechts', 2: 'rechts', 3: 'rechts'}` entstehen, also jede Figur eine eigene Bewegungsrichtung, unabhängig von den anderen, haben kann. Jedoch führt dies nun am Ende des Spielfelds (rechts) wieder zu einem `IndexError: list index out of range`, den ich noch nicht beheben konnte ## 30.09.2026 Die Figuren auf dem Spielfeld gehen die gewünschte Anzahl an Zufallsschritten und die Würfelbilder werden auch schon angezeigt (aber noch nicht wieder ausgeblendet nach einer bestimmten Zeit). Jedoch kommt es in der zweiten Zeile an einem Punkt zu einem Fehler, der dazu führt, dass die Figuren sich nicht mehr weiter bewegen (bzw. auch schon beim Wechsel aus der ersten in die zweite Zeile "zu weit laufen"). Ich habe außerdem die erste Zeile des Hintergrunds mit nummerierten Feldern und Pfeilen, die die Bewegungsrichtung verständlicher machen sollen, ausgestaltet. diff --git a/main.py b/main.py index 68c7f29..361a78d 100644 --- a/main.py +++ b/main.py @@ -36,7 +36,7 @@ for fname in meinSpiel.bilder: for fname in meinSpiel.wuerfel: try: wuerfelBilder.append(pygame.image.load(fname)) - except: + except (FileNotFoundError, pygame.error): print("Fehler beim Laden der Würfelbilder") background_img_wood = pygame.image.load( @@ -55,11 +55,10 @@ while True: # Überprüfen, ob Nutzer eine Aktion durchgeführt hat for event in pygame.event.get(): # Beenden bei [ESC] oder [X] - if event.type == QUIT or (event.type == KEYDOWN - and event.key == K_ESCAPE): + if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): pygame.quit() - print(f"{int((pygame.mouse.get_pos()[0])/120)}, " - f"{int((pygame.mouse.get_pos()[1])/120)}") + print(f"{int((pygame.mouse.get_pos()[0]) / 120)}, " + f"{int((pygame.mouse.get_pos()[1]) / 120)}") # Spiellogik if event.type == pygame.MOUSEBUTTONDOWN: meinSpiel.mouseButtonClick(pygame.mouse.get_pos()[0], pygame.mouse.get_pos()[1]) @@ -70,24 +69,21 @@ while True: # Spielfeld löschen for x in range(FelderX): for y in range(FelderY): - screen.blit(hintergrundBilder[meinSpiel.spielfeld[x][y]],(x*Pixel, y*Pixel)) + screen.blit(hintergrundBilder[meinSpiel.spielfeld[x][y]], (x * Pixel, y * Pixel)) for x in range(FelderX): for y in range(FelderY): - for i, figur in enumerate(meinSpiel.spielfiguren[x][y]): # enumerate macht das gleiche wie range(len(meinSpiel.spielfiguren[x][y])), nur mit 2 Zählvariablen + for i, figur in enumerate(meinSpiel.spielfiguren[x][y]): # enumerate macht das gleiche wie range(len(meinSpiel.spielfiguren[x][y])), nur mit 2 Zählvariablen # "i" beginnt bei jedem Feld wieder bei 0 - keine feste if-Abfrage jeder einzelnen Figur, um die Verschiebungsvariablen zu setzen, nötig - xVerschiebung = i * 30 # Verschiebung um 30 Pixel nach rechts, jede Figur im selben Feld etwas weiter + xVerschiebung = i * 30 # Verschiebung um 30 Pixel nach rechts, jede Figur im selben Feld etwas weiter yVerschiebung = 0 - screen.blit(pyGameBilder[figur], (x*Pixel + xVerschiebung, y*Pixel + yVerschiebung)) - #print(meinSpiel.zufallswert) + screen.blit(pyGameBilder[figur], (x * Pixel + xVerschiebung, y * Pixel + yVerschiebung)) + # print(meinSpiel.zufallswert) if meinSpiel.wuerfelBildAnzeigen: screen.blit(pygame.image.load(f"Bilder/wuerfel-{meinSpiel.zufallswert}.png"), (310, 600)) pygame.draw.rect(screen, GRUEN, (290, 770, 200, 60)) screen.blit(pygame.font.Font("Bilder/NunitoSans-VariableFont.ttf", 38).render("WÜRFELN", True, (255, 255, 255)), (300, 775)) - #print(f"[{i}] Figur {figur} auf Feld {x}, {y} mit Verschiebung {xVerschiebung}") - if meinSpiel.am_zug >= 4: - meinSpiel.am_zug = 0 - meinSpiel.figur_entfernt = False + # print(f"[{i}] Figur {figur} auf Feld {x}, {y} mit Verschiebung {xVerschiebung}") # Spielfeld/figuren zeichnen # Fenster aktualisieren diff --git a/meinspiel.py b/meinspiel.py index 718fa96..e81b1bd 100644 --- a/meinspiel.py +++ b/meinspiel.py @@ -8,111 +8,80 @@ class MeinSpiel: "Bilder/Spielfiguren/spielfigur-gelb.png", "Bilder/Spielfiguren/spielfigur-gruen.png", "Bilder/Spielfiguren/spielfigur-blau.png"] - wuerfel = ["Bilder/wuerfel-1.png", - "Bilder/wuerfel-2.png", - "Bilder/wuerfel-3.png", - "Bilder/wuerfel-4.png", - "Bilder/wuerfel-5.png", - "Bilder/wuerfel-6.png"] - hintergrundbilder = [] - spielfeld = [] - spielfiguren = [] + wuerfel = [f"Bilder/wuerfel-{i}.png" for i in range(1, 7)] + # hintergrundbilder = [] + # spielfeld = [] + # spielfiguren = [] - figur_entfernt = False - zeilenversetzt = False - am_zug = 0 - bewegungsrichtung = {0: "rechts", 1: "rechts", 2: "rechts", 3: "rechts"} - zufallswert = int() - wuerfelBildAnzeigen = False + # figur_entfernt = False + # zeilenversetzt = False + # am_zug = 0 + # bewegungsrichtung = {0: "rechts", 1: "rechts", 2: "rechts", 3: "rechts"} + # zufallswert = int() + # wuerfelBildAnzeigen = False def __init__(self, felderX, felderY): + self.felderX, self.felderY = felderX, felderY + self.hintergrundbilder = [] + self.spielfeld = [] + self.spielfiguren = [] + self.am_zug = 0 + self.zufallswert = 0 + self.wuerfelBildAnzeigen = False + for x in range(felderX): self.spielfeld.append([]) self.spielfiguren.append([]) for y in range(felderY): self.hintergrundbilder.append( f"Bilder/Hintergrundpixel/background_{x}-{y}.jpg") - self.spielfeld[x].append((7*x+y)) + self.spielfeld[x].append(7 * x + y) self.spielfiguren[x].append([]) - def anfangsKonfiguration(self): - self.spielfiguren[0][0].append(0) - self.spielfiguren[0][0].append(1) - self.spielfiguren[0][0].append(2) - self.spielfiguren[0][0].append(3) + self.pfad = [] + for y in range(felderY): + if y <= 4: + if y % 2 == 0: + bewegungsrichtung = range(felderX) + else: + bewegungsrichtung = range(felderX - 1, -1, -1) # range funktioniert als range(start, stop, step), bei stop 0 wird die 0 selbst nicht mehr mitgezählt! -> deshalb -1 + for x in bewegungsrichtung: + self.pfad.append((x, y)) - print(self.bewegungsrichtung) + self.positionen = [0, 0, 0, 0] + + def anfangsKonfiguration(self): + # self.spielfiguren[0][0].append(0) + # self.spielfiguren[0][0].append(1) + # self.spielfiguren[0][0].append(2) + # self.spielfiguren[0][0].append(3) + + for figur in range(4): + x, y = self.pfad[0] + self.spielfiguren[x][y].append(figur) def tasteGedrueckt(self, taste): - if taste == pygame.K_SPACE or "mouseevent": - self.zufallswert = random.randint(1, 6) + if taste != pygame.K_SPACE and taste != "mouseevent": + return - self.wuerfelBildAnzeigen = True + self.zufallswert = random.randint(1, 6) + self.wuerfelBildAnzeigen = True - for i in range(self.zufallswert): - self.figur_entfernt = False - print(f"[Schritt {i}] Figur {self.am_zug} geht {self.zufallswert}") - for x in range(len(self.spielfiguren)): - for y in range(len(self.spielfiguren[x])): - try: - if len(self.spielfiguren[x][y]) > 0 and self.figur_entfernt == False: - # print(f"Figuren auf Feld ({x}|{y}): {self.spielfiguren[x][y]}") - self.spielfiguren[x][y].pop(self.spielfiguren[x][y].index(self.am_zug)) - self.figur_entfernt = True + figur = self.am_zug + start = self.positionen[figur] + ziel = (start + self.zufallswert, len(self.pfad) - 1) + print(self.pfad) - if self.bewegungsrichtung[self.am_zug] == "unten": - self.spielfiguren[x][y + 1].append(self.am_zug) - self.zeilenversetzt = True - if x == 6: self.bewegungsrichtung[self.am_zug] = "links" - elif x == 0: self.bewegungsrichtung[self.am_zug] = "rechts" + start_x, start_y = self.pfad[start] + self.spielfiguren[start_x][start_y].remove(figur) - if self.bewegungsrichtung[self.am_zug] == "links": - if self.zeilenversetzt: - self.spielfiguren[x - 1][y].append(self.am_zug) + ziel_x, ziel_y = self.pfad[ziel] + self.spielfiguren[ziel_x][ziel_y].append(figur) - self.spielfiguren[x][y].pop(self.spielfiguren[x][y].index(self.am_zug)) + self.positionen[figur] = ziel - self.zeilenversetzt = False # zurücksetzen - else: self.spielfiguren[x - 1][y].append(self.am_zug) - if x - 1 == 0: self.bewegungsrichtung[self.am_zug] = "unten" - - if self.bewegungsrichtung[self.am_zug] == "rechts": - if self.zeilenversetzt: - self.spielfiguren[x + 1][y + 1].append(self.am_zug) - - self.spielfiguren[x][y + 1].pop(self.spielfiguren[x][y + 1].index(self.am_zug)) - - self.zeilenversetzt = False - else: - self.spielfiguren[x + 1][y].append(self.am_zug) - if x + 1 == 6: self.bewegungsrichtung[self.am_zug] = "unten" - - #if self.bewegungsrichtung[self.am_zug] == "rechts": - # self.spielfiguren[x + 1][y].append(self.am_zug) - # if x == 6: self.bewegungsrichtung[self.am_zug] = "unten" - #if self.bewegungsrichtung[self.am_zug] == "unten": - # self.spielfiguren[x][y + 1].append(self.am_zug) - # if x == 6: self.bewegungsrichtung[self.am_zug] = "links" - # elif x == 0: self.bewegungsrichtung[self.am_zug] = "rechts" - #if self.bewegungsrichtung[self.am_zug] == "links": - # self.spielfiguren[x - 1][y].append(self.am_zug) - # print(f"[!] {x}") - # if x == 1 and self.am_zug == 3: self.bewegungsrichtung[self.am_zug] = "unten" - #if self.bewegungsrichtung[self.am_zug] == "oben": # (wird wahrscheinlich nicht verwendet werden) - # self.spielfiguren[x][y + 1].append(self.am_zug) - # # print(f'Die "bewegungsrichtung"-Variable hat einen ungültigen Wert: {str(self.bewegungsrichtung[self.am_zug])}') - - - print(self.bewegungsrichtung) - else: - # print(f"keine Figuren auf Feld ({x}|{y}): {self.spielfiguren[x][y]}") - break - except ValueError: - # print(f"x: {x}, y: {y}") - break - print("____________") - self.am_zug += 1 - print(self.bewegungsrichtung) + print(f"Figur {figur}: von {start} nach {ziel} (Gewürfelt: {self.zufallswert})") + self.am_zug = (self.am_zug + 1) % 4 # mit Modulo-Operator ist (3 + 1) % wieder 0 def mouseButtonClick(self, x, y): if x >= 270 and y >= 770 and x <= 490 and y <= 830: