4 Gewinnt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Paulipan
User
Beiträge: 1
Registriert: Donnerstag 7. Dezember 2017, 20:39

Hallo, :D
ich muss für morgen ein Spiel abgeben, was ich programmiert habe. Jedoch komme ich einfach nicht weiter. Ich habe 4 Gewinnt programmiert und hänge jetzt bei der Programmierung fest, wie ein Gewinner bestimmt wird. Es wäre super lieb, wenn sich jemand die Zeit nehmen könnte und mir helfen könnte, mein Problem zu lösen!
Hier mein Code:

Code: Alles auswählen

import MModul

#Willkommen
print('Herzlich willkommen zu 4gewinnt')
print('Die Regeln:' )
print('1. Geben Sie, wenn Sie einen Stein setzen wollen die Zahl der Reihe an in der Sie den Stein legen wollen')
print('2. SIE können gewinnen, indem Sie 4 Steine in eine Reihe bekommen (hochkant, waagerecht oder schief)')
print(30*'*')
print('Viel Spaß. Spieler 1 (x). Spieler 2 (y)')

#Definition des Spielfeldes
print(' 1    ', '2   ', '3   ', '4   ', '5   ', '6   ', '7   ')
reihe1 = ['_','_','_','_','_','_','_']
reihe2 = ['_','_','_','_','_','_','_']
reihe3 = ['_','_','_','_','_','_','_']
reihe4 = ['_','_','_','_','_','_','_']
reihe5 = ['_','_','_','_','_','_','_']
reihe6 = ['_','_','_','_','_','_','_']
spielfeld = [reihe1, reihe2, reihe3 , reihe4, reihe5, reihe6]

#Ausgabe des Spielfeldes
reihe_2 = 0
while reihe_2 < 6:
        print(spielfeld[reihe_2])
        reihe_2 = reihe_2 + 1

#Spielschleife
gewonnen = 0
reihe_2 = 0

while gewonnen != 1:
    spielfeld = MModul.setzen_1 (spielfeld)
    print(' 1    ', '2   ', '3   ', '4   ', '5   ', '6   ', '7   ')

    while reihe_2 < 6:
        print(spielfeld[reihe_2])
        reihe_2 = reihe_2 + 1
    reihe_2 = 0
    spielfeld,x,y = MModul.setzen_1(spielfeld)(x)
    #spielfeld = MModul.setzen_2 (spielfeld)
    print(' 1    ', '2   ', '3   ', '4   ', '5   ', '6   ', '7   ')
    while reihe_2 < 6:
        print(spielfeld[reihe_2])
        reihe_2 = reihe_2 + 1
    gewonnen = MModul.gewinnabfrage(spielfeld,x,y)
    reihe_2 = 0

print('Herzlichen Glückwunsch, Sie haben gewonnen!')
Und das Modul:

Code: Alles auswählen

def setzen_1(spielfeld):
    #Spieler 1 (x)

    gesetzt = 0
    reihe_zaehler = 5

    print ('Spieler 1: ')
    stelle = int(input('Bitte geben Sie die Stelle zum Setzen an: '))
    index = stelle - 1
    while gesetzt != 1:
        if spielfeld[reihe_zaehler ][index] == 'x' or spielfeld[reihe_zaehler ][index] == 'y':
            if reihe_zaehler != 0 :
                reihe_zaehler = reihe_zaehler - 1
            elif reihe_zaehler == 0 and spielfeld [0][index] == 'x' or  spielfeld [0][index] == 'y':
                stelle = int(input('Bitte geben Sie eine andere Stelle an: '))
                index = stelle - 1
                reihe_zaehler = 5
                spielfeld[reihe_zaehler][index] = 'x'
                gesetzt = gesetzt + 1
        else:
            if spielfeld [0][index] == 'x' or  spielfeld [0][index] == 'y':
                index = index
            else:
                spielfeld[reihe_zaehler][index] = 'x'
                gesetzt = gesetzt + 1
    x = index
    y = reihe_zaehler
    return spielfeld

def setzen_2(spielfeld):
    #Spieler 2 (y)

    gesetzt = 0
    reihe_zaehler = 5

    print ('Spieler 2: ')
    stelle = int(input('Bitte geben Sie die Stelle zum Setzen an: '))
    index = stelle - 1
    while gesetzt != 1:
        if spielfeld[reihe_zaehler ][index] == 'x' or spielfeld[reihe_zaehler ][index] == 'y':
            if reihe_zaehler != 0 :
                reihe_zaehler = reihe_zaehler - 1
            elif reihe_zaehler == 0 and spielfeld [0][index] == 'x' or  spielfeld [0][index] == 'y':
                stelle = int(input('Bitte geben Sie eine andere Stelle an: '))
                index = stelle - 1
                reihe_zaehler = 5
                spielfeld[reihe_zaehler][index] = 'y'
                gesetzt = gesetzt + 1
        else:
            if spielfeld [0][index] == 'x' or  spielfeld [0][index] == 'y':
                index = index
            else:
                spielfeld[reihe_zaehler][index] = 'y'
                gesetzt = gesetzt + 1

    x = index
    y = reihe_zaehler
    return spielfeld

def gewinnabfrage(spielfeld,x,y): #x = Reihe, y = Spalte (beides mal 0 als Start für Index)
    linkszaehler = 0 #Zaehler der gleichen Zeichen nach Links
    rechtszaehler = 0 #Zaehler der gleichen Zeichen nach Rechts
    zaehlernachrechts = 0 #aktuellerZaehlernachrechts
    zaehlernachlinks = 0 #aktuellerZaehlernachlinks
    laengelinks = x
    while laengelinks < 0:
        laengelinks = laengelinks + 1
    laengerechts = 6 - x
    if laengerechts > 4:
        laengerechts = 4
    if laengelinks > 4:
        laengelinks = 4
    while zaehlernachrechts < laengerechts:
        if spielfeld[y][x] == spielfeld [y] [x+zaehlernachrechts]:
            rechtszaehler += 1
            zaehlernachrechts += 1
    while zaehlernachlinks < laengelinks:
        if spielfeld[y][x] == spielfeld [y] [x+zaehlernachlinks]:
            linkszaehler += 1
            zaehlernachlinks += 1

    if rechtszaehler == 4 or linkszaehler == 4:
        gewonnen = 1
    return gewonnen
Ich wäre für Antworten etc. sehr dankbar!
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Paulipan: Du hast mit `setzen_1` und `setzen_2` zwei identische Funktionen, fass die zu einer zusammen. Dafür ein extra Modul zu haben, ist etwas überdimensioniert.

Auch sind so Zeilen wie

Code: Alles auswählen

reihe_2 = 0
while reihe_2 < 6:
        print(spielfeld[reihe_2])
        reihe_2 = reihe_2 + 1
die umständliche und schwer lesbare Schreibweise von

Code: Alles auswählen

for reihe in spielfeld:
    print(reihe)
Dass Du in Zeile 29 eine Variable auf 0 setzt, um sie dann 6 Zeilen später zu verwenden, macht es unmöglich, auf anhieb zu verstehen, mit welchem Wert die while-Schleife startet.

Was hast Du Dir bei Zeile 39 gedacht? Programmieren ist nicht raten, man muß verstehen, was man schreibt.

In `setzen_1`, Zeile 14, die Bedingung ist immer wahr, wäre das nicht der Fall, würdest Du in einer Endlosschleife hängenbleiben. In den darauffolgenden Zeilen ist ein Programmierfehler. Zeile 21: diese if-Abfrage macht logisch keinen Sinn. Was wolltest Du damit bewirken?
Zeile 25: welchen Wert hat an dieser Stelle `gesetzt` immer und was ist damit der um 1 höhere Wert? Diese Zeile ist damit unnötig kompliziert geschrieben und erschwert das Verstehen.
Zeile 26,27: was bewirken diese zwei Zeilen?

Beschreibe in Worten, wie `gewinnabfrage` überprüfen soll, dass vier gleiche Steine in einer Reihe stehen?
Benutzeravatar
pixewakb
User
Beiträge: 1409
Registriert: Sonntag 24. April 2011, 19:43

Kommt etwas spät, aber zur Info:

https://github.com/grantjenks/free-python-games

Da könnte man schauen, wie die Logik des Spiels programmiert ist. Und als Tipp für den weiteren Lebensweg: Einfacher ist manchmal besser, d. h. TicTacToe dürfte einfacher als Connect four sein. Nur mal so am Rande.
Antworten