Variable außerhalb von Button beibehalten

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
momoeller04
User
Beiträge: 1
Registriert: Sonntag 26. Juni 2022, 12:21

Hallo, ich sitze seit Tagen an einem Info-Projekt für die Schule. Da ich noch kompletter Anfänger bin und unser Lehrer quasi nichts erklärt brauche ich Hilfe (KEINE LÖSUNG, nur einen Tipp). Ich habe mir ein relativ simples Würfelspiel ausgedacht, von dem ich das meiste schon umsetzten konnte. Vor zwei Tagen bin ich aber auf das Problem gestoßen, dass ich mit Variablen weiterrechnen wollte, die ich innerhalb von einem Button ermittelt habe und nicht für das ganze restliche Programm übernommen werden. Mit dem Click auf meinen ersten Button werden zwei Würfel geworfen und deren Summe berechnet. Das gleiche passiert bei dem zweiten Wurf. Jetzt will ich, dass die Summen der Würfe verglichen werden und dass die Person, die eine kleinere Summe geworfen hat einen ihrer zwei Lebenspunkte abgezogen bekommt. Die Variable der ersten Summe ist aber nur innerhalb der Funktion des ersten Buttons definiert und andersherum. Meine Frage ist also, wie ich Variablen (hier S1) für den ganzen Code übernehmen kann. Ich bin für jeden Hinweis dankbar, vorab vielen Dank.

Hier ist der Code:
#Würfelspiel: Der Computer wirft zwei Würfel. Dann wirft der Spieler zwei Würfel.
#Wenn die Summe des Computers höher ist verliert der Spieler.
#Wenn die Summe des Spielers höher ist gewinnt der Spieler
#Wenn die Summe gleich ist, muss der Spieler noch mal würfeln.
#Spieler startet mit zwei Punkten.
#Gewinnt er, bekommt er einen Punkt, verliert er wird ein Punkt abgezogen.
#Mit vier Punkten gewinnt er, mit null Punkten verliert er.
from tkinter import *
import random

# Erzeugung des Fensters
tkFenster = Tk()
tkFenster.title("WÜÜÜRFEEEL!!!")
tkFenster.geometry("300x200")
tkFenster.configure(bg='#d10404')
tkFenster.resizable(False,False)

#Variablen
NAME=str(input("Ihr Name: "))
#Lebens-Punkte
A=2
B=2

#Label

#Computer
#Label für Computer
labelComputer = Label(master=tkFenster,
text="Computer: ",
background="#439ae0")
labelComputer.place(x=10, y=10, width=70, height=20)
#Label mit Punkten des Computers
labelPunkteComputer = Label(master=tkFenster,
text=str(A),
background="#439ae0")
labelPunkteComputer.place(x=75, y=10, width=35, height=20)
#Label für Wurf 1 des Computers
labelComputer1 = Label(master=tkFenster,
text=0,
background="#439ae0")
labelComputer1.place(x=25, y=40, width=30, height=30)
#Label für Wurf 2 des Computers
labelComputer2 = Label(master=tkFenster,
text=0,
background="#439ae0")
labelComputer2.place(x=65, y=40, width=30, height=30)
#Label für Summe des Computers
labelComputerSumme = Label(master=tkFenster,
text=0,
background="#439ae0")
labelComputerSumme.place(x=45, y=80, width=30, height=30)

#Spieler
#Label für Spieler
labelSpieler = Label(master=tkFenster,
text=str(NAME) + ": ",
background="#06c91a")
labelSpieler.place(x=130, y=10, width=70, height=20)
#Label mit Punkten des Spielers
labelPunkteSpieler = Label(master=tkFenster,
text=str(B),
background="#06c91a")
labelPunkteSpieler.place(x=195, y=10, width=35, height=20)
#Label für Wurf 1 des Spielers
labelSpieler1 = Label(master=tkFenster,
text=0,
background="#06c91a")
labelSpieler1.place(x=145, y=40, width=30, height=30)
#Label für Wurf 2 des Spielers
labelSpieler2 = Label(master=tkFenster,
text=0,
background="#06c91a")
labelSpieler2.place(x=185, y=40, width=30, height=30)
#Label für Summe des Spielers
labelSpielerSumme = Label(master=tkFenster,
text=0,
background="#06c91a")
labelSpielerSumme.place(x=165, y=80, width=30, height=30)

#Buttons

#Button für Computer-Wurf
def Button_NPCWurf_Click():
W1=(random.randint(1, 6))
W2=(random.randint(1, 6))
S1=W1+W2
labelComputer1.config(text=str(W1))
labelComputer2.config(text=str(W2))
labelComputerSumme.config(text=str(S1))
buttonPCWurf.config(state = NORMAL)

#Button für Spieler-Wurf
def Button_PCWurf_Click():
W3=(random.randint(1, 6))
W4=(random.randint(1, 6))
S2=W3+W4
labelSpieler1.config(text=str(W3))
labelSpieler2.config(text=str(W4))
labelSpielerSumme.config(text=str(S2))
if S1 > S2:
B=B-1
if S1 < S2:
A=A-1
print(A, B)


# Button zum NPC-Wurf
buttonNPCWurf = Button(master=tkFenster,
text="Würfeln lassen")
buttonNPCWurf.config(command=Button_NPCWurf_Click)
buttonNPCWurf.place(x=10, y=120, width=100, height=20)
#Button zum PC-Wurf
buttonPCWurf = Button(master=tkFenster,
text="Würfeln")
buttonPCWurf.config(command=Button_PCWurf_Click)
buttonPCWurf.config(state = DISABLED)
buttonPCWurf.place(x=130, y=120, width=100, height=20)

# Aktivierung des Fensters
tkFenster.mainloop()
Benutzeravatar
Dennis89
User
Beiträge: 1125
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

da hast du dir für den Start aber etwas nicht ganz so einfaches ausgedacht. Ohne die grafische Oberfläche wäre das sicherlich einsteigerfreundlicher.

VIelleicht solltest du das erst mal machen und dich mit Funktionen, deren Argumente und Rückgabewerte vertraut machen.
Für dein jetziges Vorhaben benötigst du zusätzlich noch eine Klasse, damit du dir die Punkt merken kannst. Die Lösung oder der Tipp wäre also objektorientierte Programmierung.

Übrigens ist 'S1', 'A' und 'B' nicht definiert.

Weitere Anmerkungen zum Code folgen noch, bin gerade auf dem Sprung. Aber ansonsten übernimmt das hier bestimmt noch jemand, das ist das auch qualifizerter :)

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

Als erstes gilt es, robusten Code nach den Konvention zu schreiben: benutze keine *-Importe, weil die verschleiern, woher welcher Name stammt.
Variablennamen werden komplett klein geschrieben und sind aussagekräftig. A oder B für lebenspunkte ist nicht sehr aussagekräftig.
Benutze keine globalen Variablen, und aller Code ist in Funktionen organisiert.

Bei GUI-Programmen kommen dann noch einige Regeln hinzu: benutze kein geometry oder place, weil sich das GUI-Rahmenwerk darum kümmert, wie groß ein Fenster ist, oder wo es die Elemente exakt positioniert. Man gibt nur per pack oder grid an, wie diese angeordnet sein sollen.

Für jedes nicht triviale GUI-Programm braucht es Klassendefinitionen, damit der Zustand von Variablen über das Ende der Funktion hinaus auch gespeichert werden kann. Und genau da zielt ja Deine Frage hin: schreibe Dein Programm so um, dass es Klassen benutzt.

Was auch komisch ist, ist, dass der Name per `input` abgefragt wird, das ist bei GUIs eher ungewöhnlich.
Antworten