Zufallsgenerator-Spiel

Fragen zu Tkinter.
Antworten
Phobit
User
Beiträge: 71
Registriert: Freitag 4. Mai 2018, 18:13

Dienstag 15. Mai 2018, 17:02

Hallo mal wieder,
ich, Filmnerd, habe ein kleines Skript geschrieben, dass dem Nutzerein zufällig gewähltes Filmzitat gibt, zu dem er dann den passenden Film schreiben muss. das ganze sähe dann aktuell, wie ich es in mein großes Programm implementiert ahbe, so aus :

Code: Alles auswählen

fzhdr = "Du kannst nicht vorbei!"
fzhdr2 = "Ein Ring, sie zu knechten..."
fzpre = "Wenn es blutet, können wir es töten."
fzpre2 = "Du bist so abgrundtief hässlich..."
fzses = "Ich sehe tote Menschen"
fzsl1245 = "Jippi ya yeay, Schweinebacke!"
def FZ():
                fenster = Tk()
                fenster.title("Film Zitate raten")
                def Start():
                    start_button.config(text="Nochmal?")
                    import random
                    fz = [fzhdr, fzhdr2, fzpre, fzpre2, fzses, fzsl1245]
                    Zufall = random.choice(fz)
                    labelZ.config(text=Zufall)
                    labelZ.grid(row = 0, column = 0)
                    def Überprüfen():
                        Zitat = eingabefeld.get()
                        if fzhdr in Zufall:
                            if Zitat == "Herr der Ringe" or Zitat == "Herr der RInge":
                                messagebox.showinfo(message="Richtig!")
                                Start()
                            else:
                                messagebox.showinfo(message="Falsch!")
                                start_button.config(row = 3, column = 0) 
                        elif fzhdr2 in Zufall:
                            if Zitat == "Herr der Ringe" or Zitat == "Herr der RInge":
                                messagebox.showinfo(message="Richtig!")
                                Start()
                            else:
                                messagebox.showinfo(message="Falsch!")
                        elif fzpre in Zufall:
                            if Zitat == "Predator":
                                messagebox.showinfo(message="Richtig")
                                Start()
                            else:
                                messagebox.showinfo(message="Falsch!")
                        elif fzpre2 in Zufall:
                            if Zitat == "Predator":
                                messagebox.showinfo(message="Richtig!")
                                Start()
                            else:
                                messagebox.showinfo(message="Falsch!")
                        elif fzses in Zufall:
                            if Zitat == "Der Sechste Sinn" or Zitat == "Sixth Sense":
                                messagebox.showinfo(message="Richtig!")
                                Start()
                            else:
                                messagebox.showinfo(message="Falsch!")
                        elif fzsl1245 in Zufall:
                            if Zitat == "Stirb Langsam" or Zitat == "Die Hard":
                                messagebox.showinfo(message="Richtig!")
                                Start()
                            else:
                                messagebox.showinfo(message="Falsch!")
                        else:
                            messagebox.showinfo(message="Error: Etwas stimmt nicht!")
                    überprüfen_button = Button(fenster, text="Überprüfen", command=Überprüfen)
                    überprüfen_button.grid(row = 1, column = 0)

                labelZ = Label(fenster, text="Start drücken")
                eingabefeld = Entry(fenster, bd=5, width=40)
                start_button = Button(fenster, text="Start", command=Start)
                exit_button = Button(fenster, text="Beenden", command=fenster.destroy)

                labelZ.grid(row = 0, column = 0)
                start_button.grid(row = 2, column = 0)
                exit_button.grid(row = 1, column = 1)
                eingabefeld.grid(row = 0, column = 1)
FZ()
So, nun kommen bei mir aber mal ein paar Fragen auf.
1. Ist es irgendwie möglich, den "Nochmal" Button solange verschwinden zu lassen, bis der Nutzer einmal einen Fehler gemacht hat?

2. Ist es möglich, ein Punktesystem einzufügen, dass immer bei einem richtigen Zitat 10 Punkte added, bei einem falschen aber alles auf 0 setzt?

3. Kann ich sagen, dass jedes Zitat aus der Zufallsliste nur einmal verwendet werden kann, und danach nicht wieder genommen werden kann?

und 4. (das ist aber mehr so ne Design Sache) kann man es so einrichten,, dass das Eingabefeld nach jeder Eingabe wieder geleert wird?
__deets__
User
Beiträge: 3077
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 15. Mai 2018, 18:13

Du musst dich dringend mit Datenstrukturen beschaeftigen. Denn damit wird eine Problem trivial. Wenn du zB eine Liste von Zitaten mit dem dazugehoerigen Film hast, kannst du deine Probleme trivial erledigen:

Code: Alles auswählen

MOVIE_QUOTES = [
   ("Human Centipede", "Hrrmmpppfff")
]

correct_answers = set()

def score():
       return 10 * len(correct_answers)


def guess(quote, answer):
       for movie, quote in MOVIE_QUOTES:
              if answer == movie:
                   correct_answers.add(answer)
                   return
        correct_answers.clear() # loeschen bei falscher antwort


def random_quote():
       return random.choice(quote for movie, quote in MOVIE_QUOTES if movie not in correct_anwers)
Phobit
User
Beiträge: 71
Registriert: Freitag 4. Mai 2018, 18:13

Dienstag 15. Mai 2018, 19:49

Ok, als Anfänger tu ich mich hier beim lesen gewaltig schwer... Muss ich einfach meine Zitate bei MOVIE_QUOTES einsetzen?Und wo müsst ich wenn dann die Filme einsetzen, einfach immer Film, Zitat in ne Runde Klammer in der eckigen Klammer packen? Kann ich das ganze dann ohne Probleme in einen Tkinter GUI umwandeln, oder muss ich was spezielles beachten?

Aber trotzdem schonmal danke!
__deets__
User
Beiträge: 3077
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 15. Mai 2018, 22:18

Du musst dich halt mit Datenstrukturen vertraut machen. Sowohl ich als auch jemand in deinem anderen Post haben da eine Liste von Tupeln gewählt. Weil das für eine prinzipiell beliebige Anzahl Zitate geeignet ist. Wenn du ein Buch hast, lies darin über Listen. Wenn nicht, dann schau in das Python Tutorial. Aber ohne so ein wissen geht es nicht. Dein Ansatz kommt da nicht weiter, als du schön bist. Denn du musst dir nun mal merken, welche Fragen schon beantwortet wurden. Und das kannst du nur mit etwa wie einer Liste oder in meinem Fall hier Menge tun.
Benutzeravatar
wuf
User
Beiträge: 1481
Registriert: Sonntag 8. Juni 2003, 09:50

Mittwoch 16. Mai 2018, 11:07

Hi Phobit

An Stelle der Verschachtelung von mehreren def's würde ich ein Klasse verwenden. Hier eine Prototypvariante für deine Anwendung zum experimentieren. Es gibt sicher noch bessere:

Code: Alles auswählen

import random

import tkinter as tk
from tkinter import messagebox

APP_TITLE = "Film Zitate raten"
APP_XPOS = 100
APP_YPOS = 100    


class Application(tk.Frame):
    FILM_NAME = 0
    FILM_ZITATE = 1

    def __init__(self, app_win):
        self.app_win = app_win
        tk.Frame.__init__(self, app_win)
        
        self.filme = [
            ["Du kannst nicht vorbei!",
            ["Herr der Ringe", "Herr der RInge"]],
            
            ["Ein Ring, sie zu knechten...",
            ["Herr der Ringe", "Herr der RInge"]],
             
            ["Wenn es blutet, können wir es töten.",
            ["Predator"]],
             
            ["Du bist so abgrundtief hässlich...",
            ["Predator"]],
             
            ["Ich sehe tote Menschen",
            ["Der Sechste Sinn", "Sixth Sense"]],
            
            ["Jippi ya yeay, Schweinebacke!",
            ["Stirb Langsam", "Die Hard"]]
            ]
            
        self.punkte = 0
        
        self.build()
        
    def build(self):
        self.var_film = tk.StringVar(self, "Wähle Film")
        tk.Label(self, textvariable=self.var_film).pack(fill='x', pady=2)
        
        self.var_quote = tk.StringVar()
        tk.Entry(self, textvariable=self.var_quote, bd=1, width=40).pack(
            fill='x', pady=2)
        
        button_frame = tk.Frame(self)
        button_frame.pack(fill='x', pady=2)
        
        self.var_start_button = tk.StringVar(self, "Film")
        start_button = tk.Button(button_frame, 
            textvariable=self.var_start_button, command=self.start)
        start_button.pack(side='left')

        self.check_button = tk.Button(button_frame, text="Überprüfen",
            command=self.check_antwort)
        self.check_button.pack(side='left')
        self.check_button.pack_forget()
        
        tk.Button(button_frame, text="Beenden", command=self.app_win.destroy
            ).pack(side='right')

        punkte_frame = tk.Frame(button_frame)
        punkte_frame.pack(side='right', padx=4)
        
        tk.Label(punkte_frame, text="Punkte:").pack(side='left')
        self.var_punkte = tk.IntVar(self, 0)
        tk.Label(punkte_frame, textvariable=self.var_punkte).pack(side='left')
        
    def start(self):
        self.var_start_button.set("Film")
        self.film_index = random.randint(0, len(self.filme)-1)
        zufall_film = self.filme[self.film_index][self.FILM_NAME]
        self.var_film.set(zufall_film)
        self.check_button.pack()
            
    def check_antwort(self):
        self.check_button.pack_forget()
        zitat = self.var_quote.get()
        film_zitate = self.filme[self.film_index][self.FILM_ZITATE]
        print('Zitate:', film_zitate, zitat)
        if zitat in film_zitate:
            self.punkte += 10
            # Entferne Film aus der Liste
            del self.filme[self.film_index]
            self.var_start_button.set("Film")
            self.var_film.set("Wähle Film")
            result = messagebox.showinfo(message="Richtig!")
        else:
            result = messagebox.showinfo(message="Falsch!")
            self.punkte = 0
            self.var_start_button.set("Nochmal")
            self.check_button.pack()
            
        self.var_punkte.set(self.punkte)    
        self.var_quote.set('')

        
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    #app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    
    app = Application(app_win)
    app.pack(fill='both', expand=True, padx=10, pady=10)
    
    app_win.mainloop()
 
if __name__ == '__main__':
    main()
Das abfangen einer leeren Filmliste überlasse ich dir. Viel Spass!

Gruss wuf ;-)
Take it easy Mates!
Phobit
User
Beiträge: 71
Registriert: Freitag 4. Mai 2018, 18:13

Donnerstag 17. Mai 2018, 18:50

__deets__ hat geschrieben:
Dienstag 15. Mai 2018, 22:18
Du musst dich halt mit Datenstrukturen vertraut machen. Sowohl ich als auch jemand in deinem anderen Post haben da eine Liste von Tupeln gewählt. Weil das für eine prinzipiell beliebige Anzahl Zitate geeignet ist. Wenn du ein Buch hast, lies darin über Listen. Wenn nicht, dann schau in das Python Tutorial. Aber ohne so ein wissen geht es nicht. Dein Ansatz kommt da nicht weiter, als du schön bist. Denn du musst dir nun mal merken, welche Fragen schon beantwortet wurden. Und das kannst du nur mit etwa wie einer Liste oder in meinem Fall hier Menge tun.
Ok, verstehe ich, ich werde mich damit mal auseinandersetzen... aber jetzt kommt schnell eine Grund-Frage:
Wenn ich dein oberes Programm starten will, was muss ich da eingaben?
guess() klappt nicht, weil im die zwei Argumente fehlen.
guess(quote, answer) klappt nicht, weil dann quote nicht definiert ist...
__deets__
User
Beiträge: 3077
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 17. Mai 2018, 23:10

Das quote in guess als Parameter ist ein vertipper. Der Code ist nicht getestet, sondern sollte nur illustrieren wie sowohl die Fragen als auch die Verwaltung der gegebnen Antworten aussehen könnten.
Antworten