fehler keine ahnung warum es nicht fuktioniert

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
megamichi
User
Beiträge: 8
Registriert: Samstag 3. September 2022, 07:30

hallo ich habe ein kleines spiel programiert (schere stein papier) und eigendlich funktioniert alles aber wenn
man schere wehlt und der pc stein dan fugt die skript kein punkt zu den punkten von pc hinzu aber alles andere geht auser ich hab was
ubersehen ich hab den fehler mit #fehler makiert hier die script

Code: Alles auswählen

from os import system
from random import randrange
pcp = 0 # PC Punkte
dup = 0 # eigene Punkte

class bcolors:
    Grün = '\033[92m' #GREEN
    Gelb = '\033[93m' #YELLOW
    Rot = '\033[91m' #RED
    RESET = '\033[0m' #RESET COLOR

system("clear")
print(bcolors.Gelb+"       Wilkommen"+bcolors.RESET)
mechanik = {"1":"Schere","2":"Stein","3":"Papier"}
def hilfe() :
    print("""       Bedinung
  1        2       3
Schere   Stein   Papier

       Anleitung
  Du spelst gegen ein 
  Computer und musst 
  3 Punkte als erstes 
  griegen,fals der PC
  3 Punkte als erstes
  hat dann hast du 
  Verloren
""")
hilfe()
while not dup == 3 or pcp == 3 :
  inp = input(bcolors.Grün+"Bitte Zahl eingeben :"+bcolors.RESET)
  if inp == "q" :
    system("clear")
    exit()
  if inp == "h" :
    hilfe()
  if inp == "1" or inp == "2" or inp == "3" : 
    PC = str(randrange(1,4))          # wer hat was gewählt
    print("PC: "+mechanik[PC])
    print("Du: "+mechanik[inp])

    if inp == PC :                    # unendschieden
      print("unendschieden noch mal") 
    
    if inp == "2" and PC == "2" : # schere stein pc punkt
      print("Punkt für PC") #fehler
      pcp += 1              #fehler 

    if inp == "1" and PC == "3" : # schere papier eigenen punkt
      print("Punkt für Dich")
      dup += 1
    
    if inp == "2" and PC == "1" : # stein schere eigenen punkt
      print("Punkt für Dich")
      dup += 1

    if inp == "2" and PC == "3" : # stein papier pc punkt
      print("Punkt für PC")
      pcp += 1

    if inp == "3" and PC == "1" : # s papier schere pc punkt
      print("Punkt für PC")
      pcp += 1

    if inp == "3" and PC == "2" : # papier stein eigenen punkt
      print("Punkt für Dich")
      dup += 1
    
    
    print("Deine Punkte: "+str(dup)+"    PCs Punkte: "+str(pcp),"\n")
    winner = 0
    if pcp == 3 :
      winner = "PC hat Gewonnen"
      print(winner)
      exit()
    if dup == 3 :
      winner = "Du hast Gewonnen"
      print(winner)
      exit()
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@megamichi: Ganz offensichtlich wird da im Code nicht das geprüft was laut Kommentar geprüft werden sollte.

Dann sollten das nicht lauter einzelne ``if``s sein, sondern ``if`` und dann ``elif``s, und am Ende noch ein ``else`` für den Fall das etwas eintritt was nicht vorkommen dürfte, oder eben der Fall der in den Bedingungen vorher falsch war, zum Beispiel das da nirgends die Kombination Schere/Stein geprüft wird.

Oder man macht insgesamt nicht so viele Einzelprüfungen sondern löst das in dem die drei Fälle Unentschieden und Spieler gewinnt und sonst hat der Rechner gewonnen in einem ``if``/``elif``/``else`` verarbeitet.

Sonstige Anmerkungen: Eingerückt wird vier Leerzeichen pro Ebene.

Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur daraus bestehen. Wenn Du einen Kommentar an `pcp` schreibst, dass das „PC Punkte“ heissen soll, dann sollte das `pc_punkte` heissen und man braucht keinen Kommentar mehr der das erklärt. Zudem ist das dann auch an allen Stellen wo das verwendet wird klar, ohne das man irgendwo einen Kommentar suchen muss.

`os.system()` verwendet man nicht, und wenn man sowieso ANSI-Steuerzeichen für Farbe voraussetzt, kann man damit auch den Terminalinhalt löschen, statt ein plattformabhängiges externes Programm aufzurufen. Wobei das aber auch unhöflich ist, dem Benutzer einfach so die Ausgabe zu löschen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

`exit()` (und auch `sys.exit()`) sollte man nur verwenden wenn man mindestens potentiell einen anderen Rückgabecode als 0 an den Aufrufer des Programms zurückgeben will. Den dafür ist diese Funktion da. Im Programm macht sie so keinen Sinn, da will man einfach nur die Schleife abbrechen und dafür gibt es die ``break``-Anweisung.

In dem Zusammenhang: Die Bedingung der ``while``-Schleife (``not dup == 3 or pcp == 3``) ist sinnlos, weil die niemals wahr wird, denn wenn die innerhalb der Schleife wahr wird, verlässt Du die Schleife. Da kann man also einfach ``while True:`` schreiben. Oder die Bedingung tatsächlich als Schleifenabbruch benutzen statt die Schleife oder gar das Programm vom Schleifenkörper aus zu verlassen. Es würde dann auch Sinn machen den Gewinner *nach* der Schleife zu ermitteln und auszugeben.

Statt `randrange()` würde man eher `randint()` verwenden wenn man das Ergebnis gar nicht als Index verwenden will. Andererseits ist es auch nicht so toll da noch mal die Grenzen hart zu kodieren und nicht einfach mit `random.choice()` aus den tatsächlichen Möglichkeiten auszuwählen.

Und die sollten keine magischen Zahlen als Zeichenketten sein, sondern mindestens mal Zeichenketten die dem Leser mitteilen was sie bedeuten, ohne das man irgendwo weiter oben im Code nachsehen muss, oder wieder auf Kommentare angewiesen ist, die etwas erklären, was eigentlich im Code stehen sollte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
megamichi
User
Beiträge: 8
Registriert: Samstag 3. September 2022, 07:30

meine güte ich beobiere das mal mit der schleife
megamichi
User
Beiträge: 8
Registriert: Samstag 3. September 2022, 07:30

hab was falsch geschrieben
danke ich bin noch nen Anfänger
Antworten