Fehlerbehebung

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
escobar.girl
User
Beiträge: 3
Registriert: Dienstag 28. Juli 2020, 09:51

Hallo,
ich brauche an ein paar Stellen von meinem Programm Hilfe, da ich schon gefühlt alles ausprobiert habe, aber nichts wirklich funktioniert. Ich bin Anfänger was das Programmieren angeht und wäre für jede Hilfe sehr Dankbar!:)
Zum Hintergrund des Codes, ich muss ein Projekt abgeben, dass ein Romme Spiel simuliert.
Hier mein Code:
global ausgewaehlte_karten
ausgewaehlte_karten = []

def ist_satz(hand, auswahl):
ausgewaehlte_karten = len(auswahl)
Vergleichsliste = []
for i in range(ausgewaehlte_karten):
Vergleichsliste.append(hand[int(auswahl) - 1][1])
if ausgewaehlte_karten == 3:
if Vergleichsliste[0] == Vergleichsliste[1] and Vergleichsliste[1] == Vergleichsliste[2]:
print("Die Karten bilden einen Satz.")
else:
print("Die Karten bilden keinen Satz.")
elif ausgewaehlte_karten == 4:
if Vergleichsliste[0] == Vergleichsliste[1] and Vergleichsliste[1] == Vergleichsliste[2] and Vergleichsliste[2] == Vergleichsliste[3]:
print("Die Karten bilden einen Satz.")
else:
print("Die Karten bilden keinen Satz.")

def ist_sequenz(hand, auswahl):
Vergleichsliste = []
global Auswahl
Auswahl = len(auswahl)

for i in range(Auswahl):
Vergleichsliste.append(hand[int(auswahl) - 1][1])
ausgewaehlte_karten.append(hand[int(auswahl) - 1])

hohe_werte = {"Bube": 11, "Dame": 12, "König": 13, "Ass": 14}
Vergleichsliste = [hohe_werte.get(x, x) for x in Vergleichsliste]
for i in range(Auswahl):
if type(Vergleichsliste) == type("string"):
Vergleichsliste = int(Vergleichsliste)
Vergleichsliste.sort()
if Auswahl == 3:
if (int(Vergleichsliste[0])+2 == int(Vergleichsliste[1])+1 and int(Vergleichsliste[1])+1 == int(Vergleichsliste[2])) or (int(Vergleichsliste[0])+1 == int(Vergleichsliste[1]) and int(Vergleichsliste[1]) == int(Vergleichsliste[2])-11):
print("Die Karten bilden eine Sequenz.")
else:
print("Die Karten bilden keine Sequenz.")
elif Auswahl == 4:
if (int(Vergleichsliste[0])+3 == int(Vergleichsliste[1])+2 and int(Vergleichsliste[1])+2 == int(Vergleichsliste[2])+1 and int(Vergleichsliste[2])+1 == int(Vergleichsliste[3])) or (int(Vergleichsliste[0])+2 == int(Vergleichsliste[1])+1 and int(Vergleichsliste[1])+1 == int(Vergleichsliste[2]) and int(Vergleichsliste[2]) == int(Vergleichsliste[3])-10):
print("Die Karten bilden eine Sequenz.")
else:
print("Die Karten bilden keine Sequenz.")


Eingabe = input("Soll ausgelegt werden (j/n)? ")
auswahl = []
if Eingabe == "j":
while len(auswahl) <4:
wahl = int(input("Welche Karte auslegen (1-14, Ende zum Beenden der Auswahl)?"))
auswahl.append(wahl)
if wahl == "Ende":
print("Ausgewählt:" ,auswahl)


print("Ausgewählt:" ,auswahl)
ist_satz(Hand_3, auswahl)
ist_sequenz(Hand_3, auswahl)
print("Ausgelegt wurden: " ,ausgewaehlte_karten)
#karten aus hand löschen Hand_3[wahl]
print("Hand 3:")
x = 1
for Karte in Hand_3:
print("Karte " ,x ,": " ,Karte)
x = x+1
Eingabe = input("Soll ausgelegt werden (j/n)? ")
auswahl = []
if Eingabe == "j":
while len(auswahl) <4:
wahl = int(input("Welche Karte auslegen (1-14, Ende zum Beenden der Auswahl)?"))
auswahl.append(wahl)
if wahl == "Ende":
print("Ausgewählt:" ,auswahl)

Ich hänge einmal an der Stelle, dass wenn die Eingabe == Ende ist, er mir das printen soll, was ich bisher in wahl eingegeben habe, also z.B. 1,2. Das erkennt er mir so momentan natürlich nicht an, da ich den input in ein int packen musste, da er mir sonst die Zahlen nicht anerkennt.

Mein zweites Problem wäre, dass wenn die Karten ausgewählt sind und ausgelegt werden, dass diese auch von der Hand Liste gelöscht werden, was ja im Prinzip die wahl darstellt, weswegen ich es auch mit del Hand_3[wahl] ausprobiert hatte, er mir dann aber nicht die ausgewählten Karten löscht, sondern die darauffolgenden.

Der Code ist nur ein Teil, da man den anderen für meine Probleme nicht benötigt, fals dies doch der Fall sein sollte, könnt ihr gerne bescheid geben.
Danke für jede Hilfe. :)
Benutzeravatar
pintman
User
Beiträge: 39
Registriert: Freitag 2. Dezember 2005, 20:43
Kontaktdaten:

Bitte formatiere den Quelltext mit Hilfe des </>-Buttons im Editor, damit man ihn korrekt lesen kann.
escobar.girl
User
Beiträge: 3
Registriert: Dienstag 28. Juli 2020, 09:51

Code: Alles auswählen

global ausgewaehlte_karten
ausgewaehlte_karten = []

def ist_satz(hand, auswahl):
    ausgewaehlte_karten = len(auswahl)
    Vergleichsliste = []
    for i in range(ausgewaehlte_karten):
        Vergleichsliste.append(hand[int(auswahl[i]) - 1][1])
    if ausgewaehlte_karten == 3:
        if Vergleichsliste[0] == Vergleichsliste[1] and Vergleichsliste[1] == Vergleichsliste[2]:
            print("Die Karten bilden einen Satz.")
        else:
            print("Die Karten bilden keinen Satz.")
    elif ausgewaehlte_karten == 4:
        if Vergleichsliste[0] == Vergleichsliste[1] and Vergleichsliste[1] == Vergleichsliste[2] and Vergleichsliste[2] == Vergleichsliste[3]:
            print("Die Karten bilden einen Satz.")
        else:
            print("Die Karten bilden keinen Satz.")

def ist_sequenz(hand, auswahl):
    Vergleichsliste = []
    global Auswahl
    Auswahl = len(auswahl)

    for i in range(Auswahl):
        Vergleichsliste.append(hand[int(auswahl[i]) - 1][1])
        ausgewaehlte_karten.append(hand[int(auswahl[i]) - 1])

    hohe_werte = {"Bube": 11, "Dame": 12, "König": 13, "Ass": 14}
    Vergleichsliste = [hohe_werte.get(x, x) for x in Vergleichsliste]
    for i in range(Auswahl):
        if type(Vergleichsliste[i]) == type("string"):
            Vergleichsliste[i] = int(Vergleichsliste[i])
    Vergleichsliste.sort()
    if Auswahl == 3:
        if (int(Vergleichsliste[0])+2 == int(Vergleichsliste[1])+1 and int(Vergleichsliste[1])+1 == int(Vergleichsliste[2])) or (int(Vergleichsliste[0])+1 == int(Vergleichsliste[1]) and int(Vergleichsliste[1]) == int(Vergleichsliste[2])-11):
            print("Die Karten bilden eine Sequenz.")
        else:
            print("Die Karten bilden keine Sequenz.")
    elif Auswahl == 4:
        if (int(Vergleichsliste[0])+3 == int(Vergleichsliste[1])+2 and int(Vergleichsliste[1])+2 == int(Vergleichsliste[2])+1 and int(Vergleichsliste[2])+1 == int(Vergleichsliste[3])) or (int(Vergleichsliste[0])+2 == int(Vergleichsliste[1])+1 and int(Vergleichsliste[1])+1 == int(Vergleichsliste[2]) and int(Vergleichsliste[2]) == int(Vergleichsliste[3])-10):
            print("Die Karten bilden eine Sequenz.")
        else:
            print("Die Karten bilden keine Sequenz.")


Eingabe = input("Soll ausgelegt werden (j/n)? ")
auswahl = []
if Eingabe == "j":
    while len(auswahl) <4:
        wahl = int(input("Welche Karte auslegen (1-14, Ende zum Beenden der Auswahl)?"))
        auswahl.append(wahl)
        if wahl == "Ende":
            print("Ausgewählt:" ,auswahl)
Sirius3
User
Beiträge: 18221
Registriert: Sonntag 21. Oktober 2012, 17:20

Vergiss gleich wieder, dass es global gibt. Das erste `global` ist auch total nutzlos. Alles was eine Funktion braucht, bekommt sie über ihre Argumente, Ergebnisse werden per `return` zurückgegeben.
Variablennamen schreibt man komplett klein. In `ist_sequenz` verwendest Du sogar ein `auswahl` und ein `Auswahl`. Da sind Fehler vorprogrammiert.

`ausgewaehlte_karten` in `ist_satz` sind dann auch gar nicht die ausgewählten Karten, sondern die Anzahl in `auswahl`.
Über einen Index iteriert man in Python nicht, weil man direkt über die Elemente iterieren kann.
`auswahl` enthält schon Zahlen, da `int` drauf aufzurufen ist also unnötig. `Hand_3` wird nirgends definiert, man kann also gar nicht sagen, was da drin steckt, jeder Leser muß also Raten. Das ist sehr sinnvoll wenn Du hier Hilfe willst. Statt magischer Nummern sollte jede Karte ein Komplexeres Element, wie ein Namedtuple oder eine selbstdefinierte Klasse sein.
Grunddatentypen haben in Variabelnnamen nichts verloren. `Vergleichsliste` sollte also einfach karten heißen. Wenn der Datentyp ein Set ist, ist der Vergleich auch viel einfacher.
Die Funktion sieht also so aus:

Code: Alles auswählen

def ist_satz(hand, auswahl):
    karten = set(hand[nr - 1][1] for nr in auswahl)
    return len(auswahl) in [3, 4] and len(karten) == 1
Die Ausgabe sollte dann dort erfolgen, wo auch das Spiel stattfindet:

Code: Alles auswählen

if ist_satz(hand, auswahl):
    print("Die Karten bilden einen Satz.")
else:
    print("Die Karten bilden keinen Satz.")
In `ist_sequenz` ist ja quasi der selbe Code. Statt Bube, Dame, König oder Ass in der Hand zu speichern, besser gleich den Wert der Karte. Typvergleiche macht man nicht, Schreibe doch alle Kartenwerte in das Wörterbuch. Man ersetzt auch keine Elemente einer Liste, sondern erzeugt bei Bedarf eine neue Liste. Der Vergleich mit dem Sonderfall Ass ist auch besonders kompliziert geschrieben.

Code: Alles auswählen

KARTEN_WERTE = {"2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9":9, "10": 10, "Bube": 11, "Dame": 12, "König": 13, "Ass": 14}
def ist_sequenz(hand, auswahl):
    karten_werte = sorted(KARTEN_WERTE[hand[nr - 1][1]] for nr in auswahl)
    aufsteigend = set(w - i for i, w in enumerate(karten_werte))
    return len(auswahl) in [3, 4] and (
        len(aufsteigend) == 1 or
        # Sonderfall Ass
        (aufsteigend == {2, 15 - len(auswahl)})
    )
Und da Du jetzt zwei Funktionen hast, die einen Wahrheitswert zurückliefern, kannst Du im Hauptprogramm auch prüfen, ob die Karten einen Satz bilden und dann einfach eine neue Hand bilden, die die ausgewählten Karten nicht mehr enthält.
escobar.girl
User
Beiträge: 3
Registriert: Dienstag 28. Juli 2020, 09:51

Danke dir, Sirius3 für die schnelle Antwort.
Antworten