Ich brauche Hilfe, da ich nicht weiß was der Fehler ist.

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
Trapper511
User
Beiträge: 1
Registriert: Sonntag 10. Januar 2021, 16:33

Das ist mein Code, es steht das in der 17. Zeile ein fehler sei, aber ich weiß nicht welcher.
Bitte helft mir :D




import random
import time

#EINLeitung
print("°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°"); time.sleep (0.75)
print ("°Schere|Stein|Papier|Echse|Spock°"); time.sleep (0.75)
print("°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°\n\n"); time.sleep (0.75)

#Variablen
angriff = ("Schere", "Stein", "Papier", "Echse", "Spock")
spielen = True

while spielen:
#Angriff auswählen
angriffauswahl = 0
while angriffauswahl not in (1,2,3,4,5):
angriffauswahl = int (input("[1]Schere [2]Stein [3]Papier [4]Echse [5]Spock\n"))
spielerangriff = angriff(angriffauswahl -1)
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Trapper511: Was soll das heissen Du weisst nicht welcher? Woher weisst Du denn dann, das da einer ist und das der in Zeile 17 ist? Wenn da eine Fehlermeldung beim Ausführen kommt, dann weisst Du doch was das für ein Fehler ist. Die Fehlermeldung ist diesem Fall sogar sehr aussagekräftig, weil die sehr deutlich *genau den Fehler* benennt. Das ist nicht immer so deutlich auf den Punkt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Dennis89
User
Beiträge: 1555
Registriert: Freitag 11. Dezember 2020, 15:13

Wobei ich den Fehler auf Zeile 18 getippt hätte.
@Trapper511 gewöhne dir doch bitte gleich an, deinen Code in Code-Tags zu posten und achte bitte immer darauf, dass die Einrückungen stimmen, das ist sehr wichtig.

Code-Tags:
"Vollständiger Editor" anklicken, den Button </> auswählen und den Code zwischen die beiden Klammerausdrücken einfügen.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Nee, der Traceback fängt mit ``File "./forum23.py", line 17`` an wird von einer von `SyntaxError` abgeleiteten Ausnahme ausgelöst. 🙂
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Dennis89
User
Beiträge: 1555
Registriert: Freitag 11. Dezember 2020, 15:13

@__blackjack__ da unterscheidet sich bei uns irgendetwas, wenn ich den Code kopiere und die Einrückungen anpasse wie ich denke, sieht das bei mir so aus:

Code: Alles auswählen

import random
import time

#EINLeitung
print("°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°"); time.sleep (0.75)
print ("°Schere|Stein|Papier|Echse|Spock°"); time.sleep (0.75)
print("°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°\n\n"); time.sleep (0.75)

#Variablen
angriff = ("Schere", "Stein", "Papier", "Echse", "Spock")
spielen = True

while spielen:
#Angriff auswählen
    angriffauswahl = 0
    while angriffauswahl not in (1,2,3,4,5):
        angriffauswahl = int (input("[1]Schere [2]Stein [3]Papier [4]Echse [5]Spock\n"))
        spielerangriff = angriff(angriffauswahl -1)

Code: Alles auswählen

Traceback (most recent call last):
  File "/xxx/xxx/xxx/test_forum.py", [b]line 18[/b], in <module>
    spielerangriff = angriff(angriffauswahl -1)
TypeError: 'tuple' object is not callable
Wie dem auch sei, mit dem Begriff 'tuple' in der Fehlermeldung, sollte man die Lösung schnell finden, wie du schon am Anfang angemerkt hast.

Grüße und Gute Nacht
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Da hast Du die Einrückung falsch geraten. Du mußt einfach nur den ganzen Beitrag zitieren, dann siehst Du die Einrückungen:

Code: Alles auswählen

import random
import time

#EINLeitung
print("°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°"); time.sleep (0.75)
print ("°Schere|Stein|Papier|Echse|Spock°"); time.sleep (0.75)
print("°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°\n\n"); time.sleep (0.75)

#Variablen
angriff = ("Schere", "Stein", "Papier", "Echse", "Spock")
spielen = True

while spielen:
    #Angriff auswählen
    angriffauswahl = 0
    while angriffauswahl not in (1,2,3,4,5):
    angriffauswahl = int (input("[1]Schere [2]Stein [3]Papier [4]Echse [5]Spock\n"))
spielerangriff = angriff(angriffauswahl -1)
Und dort ist der erste Fehler die Einrückungen, und die weiteren Fehler kommen erst, wenn man den korrigiert hat.
Benutzeravatar
Dennis89
User
Beiträge: 1555
Registriert: Freitag 11. Dezember 2020, 15:13

Sirius3 hat geschrieben: Sonntag 10. Januar 2021, 23:39 Da hast Du die Einrückung falsch geraten. Du mußt einfach nur den ganzen Beitrag zitieren, dann siehst Du die Einrückungen:
Danke, gut zu wissen.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@Trapper511: Einrückungen sind in Python ein wichtige syntaktisches Element. Nach einem while muß eine Block folgen, der durch seine einheitliche Einrückung definiert wird. Der fehlt bei Dir.
Eine while-Schleife, die nur startet, wenn man einer Variable einen Dummy-Wert zuweist, ist umständlich. Dafür schreibt man eine while-True-Schleife, deren Abbruchbedingung innerhalb der Schleife steht.
Schere, Stein, Papier, Spock und Echse kommem insgesamt jeweils drei mal vor, sollten aber am besten nur einmal vorkommen. Dann verhindert man Fehler durch falsche Reihenfolge, o.ä.
Alles auf oberster Ebene sollte in Funktionen gepackt werden, auch Abschnitte, wie die Eingabe stehen am besten in eigenen Funktionen. Pro Zeile steht eine Anweisung, vergiss also dass es ; überhaupt gibt.
`angriff` ist eigentlich keine Variable, sondern eine Konstante, und das Tuple ist eigentlich eine Liste, weil es eine Aufzählung von gleichartigen Dingen ist.

Code: Alles auswählen

ANGRIFF = ["Schere", "Stein", "Papier", "Echse", "Spock"]

def angriff_auswaehlen():
    while True:
        auswahl = " ".join(f"[{i}] {n}" for i, n in enumerate(ANGRIFF, 1))
        angriffauswahl = int(input(f"{auswahl}\n"))
        if 1 <= angriffauswahl <= len(ANGRIFF):
            break
    return angriffauswahl - 1


def main():
    title = '|'.join(ANGRIFF)
    print("*"* (len(title) + 2))
    print(f"*{title}*")
    print("*"* (len(title) + 2))
    print()
    print()

    while True:
        #Angriff auswählen
        angriffauswahl = angriff_auswaehlen()
        spielerangriff = ANGRIFF[angriffauswahl]

if __name__ == '__main__':
    main()
So ist mit einer kleinen Änderung das Spiel auf Schere-Stein-Papier umstellen.
Antworten