import random BREITE = 4 HOEHE = 3 # Alternative Eingabe per Unicode-Nummer gelb = '🟡' # '\U0001f7e1' blau = '🔵' # '\U0001f535' leer = '⬜' # '\u2b1c' randfeld = '⬛' # '\u2b1b' def startaufstellung(): '''Erzeugt ein Spielfeld in Startaufstellung als Array (= Liste von Listen) brett und liefert dieses als Rückgabewert zurück. Empfehlung: Um das eigentliche Spielfeld einen Rand aus Randfeldern anlegen. Dies hat Vorteile beim Prüfen, ob ein Zug erlaubt ist (denn sonst muss man checken, ob man am Rand ist.) Dann ist es ein Array der Form (BREITE+2)x(HOEHE+2). Beispiel: Für BREITE=4 und HOEHE=3 soll das Spielfeld so aussehen: ⬛⬛⬛⬛⬛⬛ ⬛🟡🟡🟡🟡⬛ ⬛⬜⬜⬜⬜⬛ ⬛🔵🔵🔵🔵⬛ ⬛⬛⬛⬛⬛⬛ Das blau besetze Feld links unten ist das Feld a1, das blau besetze Feld rechts unten ist d1. Der Wert von brett[4][1] wird also auf blau gesetzt. ''' # Leeres Spielfeld. brett = [[leer for y in range(HOEHE+2)] for x in range(BREITE+2)] # Setze die blauen und gelben Steine und die schwarzen Randfelder. def spielbrett_als_string(): '''Liefert als Rückgabewert das aktuelle Spielbrett als String (inklusive Zeilenumbrüche).''' def gegner(s): '''Liefert den Gegner von s als Rückgabewert, also blau für s==gelb und sonst gelb.''' def vorwaerts(s): '''Liefert die Vorwärtsrichtung von s, also -1 für s==gelb und sonst 1.''' def info_spielanfang(): '''Gibt Anfangsinformation zum Spiel aus.''' def info_spielende(): '''Gibt aus, dass das Spiel zu Ende ist, und nennt die Gewinnerfarbe.''' def zug_erlaubt(ax, ay, bx, by): '''Gibt True oder False zurück, je nachdem, ob der Spielzug vom Feld (ax, ay) zum Feld (bx, by) erlaubt ist oder nicht. Beachte, dass die Variable am_zug speichert, welcher Spieler an der Reihe ist.''' def fuehre_zug_aus(ax, ay, bx, by): '''Führt den Spielzug vom Feld (ax, ay) zum Feld (bx, by) aus, d. h. die globalen Variablen brett und am_zug werden entsprechend aktualisiert. Deswegen muss man diese beiden Variablen als global deklarieren.''' global brett, am_zug def schachnotation_aus_koordinaten(x, y): '''Liefert etwa für (x, y) = (3, 1) die zugehörige Schachnotation 'c1' als String. Verwende chr(Nummer) und ord(Zeichen), um ASCII-Code-Nummern in Zeichen umzurechnen und umgekehrt.''' def gib_zuginformation_aus(ax, ay, bx, by): '''Gibt den Spielzug von (ax, ay) nach (bx, by) in Schachnotation aus und davor, wer zieht. Beispiel: Zug von 🟡: a3-a2. Verwende die Funtkion schachnotation_aus_koordinaten''' def endstellung(): '''Liefert True oder False, je nachdem, ob das Spielbrett in einer Endstellung ist oder nicht. Also True, falls ein Spieler die gegnerische Endreihe erreicht hat oder der Spieler, der aktuell am Zug ist, keinen erlaubten Zug durchführen kann (verwende die Funktion zug_erlaubt).''' def koordinaten_aus_schachnotation(s): '''Erwartet eine String s aus zwei Zeichen, etwa 'c2', und liefert als Rückgabewert die beiden zugehörigen Koordinaten, etwa 4, 2.''' def ermittle_zug_von_benutzer(): '''Fragt den Benutzer (der am Zug ist) nach seinem Zug und liefert diesen Zug als Tupel von 4 Zahlen zurück. Der Zug soll in Schachnotation eingegeben werden. Beispiel: a3-a2 liefert das Rückgabetupel 1, 3, 1, 2. Verwende die Funktionen koordinaten_aus_schachnotation und zug_erlaubt. Wir nehmen an, dass die Eingabe das korrekte Format hat. Ist der Zug nicht erlaubt, so wiederholt sich das ganze.''' def ermittle_zufaelligen_computerzug(): '''Ermittelt alle möglichen Computerzüge und wählt zufällig einen davon aus. Dieser wird als Tupel zurückgegeben (etwa 3, 1, 3, 2 für den Zug c1-c2). Der Befehl random.choice(Liste) wählt einen zufälligen Eintrag aus einer Liste.''' brett = startaufstellung() info_spielanfang() am_zug = gelb while True: print(spielbrett_als_string()) if endstellung(): break if am_zug == gelb: ax, ay, bx, by = ermittle_zug_von_benutzer() else: ax, ay, bx, by = ermittle_zufaelligen_computerzug() gib_zuginformation_aus(ax, ay, bx, by) fuehre_zug_aus(ax, ay, bx, by) info_spielende()