Seite 1 von 1

Wer wird Millionär. Quiz Spiel Python

Verfasst: Donnerstag 20. Juni 2013, 12:44
von yahu
Hallo

ich bin relativ neu in python und bräuchte bei meinem kleinen 'Quiz' noch etwas Hilfe...
Ich würde gerne bei dem Code noch, falls die Frage falsvh beantwortet wurde, die gewinne einblenden. Weiß aber leider nicht wie...
Ausserdem will ich noch Hintergrund und den 'Wer wird Millionär Ton' ins Script bringen. Ist das möglich?

Code: Alles auswählen

import Tkinter as tk
from random import randint, choice
from functools import partial

QUESTIONS = {
    1: {
        "Question": "In welcher deutschen Stadt wurde der Reichstag verhüllt?",
        "Answers": [
                ['A:', 'Bonn', False], 
                ['B:', 'Berlin', True],
                ['C:', 'Hamburg', False],
                ['D:', 'München', False]]},
    
        
                
    2: {
        "Question": "Welches Tier hat das Baden Württenberg im Wappen?",
        "Answers": [
                ['A:', 'Adler', False], 
                ['B:', 'Fisch', False],
                ['C:', 'Bär', False],
                ['D:', 'Löwe', True]]},
                
    3: {
        "Question": "Was gilt als König der Tiere ?",
        "Answers": [
                ['A:', 'Vogel', False], 
                ['B:', 'Löwe', True],
                ['C:', 'Katze', False],
                ['D:', 'Schwein', False]]},
                
    4: {
        "Question": "Welches Tier rollt sich bei Gefahr zu einer Kugel?",
        "Answers": [
                ['A:', 'Pferd', False], 
                ['B:', 'Katze', False],
                ['C:', 'Igel', True],
                ['D:', 'Affe', False]]},

    5:  {
        "Question": "Wenn das Wetter gut ist, wird der Bauer bestimmt den Eber, das Ferkel und ...?",
        "Answers": [
                ['A:', 'einen drauf machen', False],
                ['B:', 'die Nacht durchmache', False],
                ['C:', 'die sau rauslassen', True],
                ['D:', 'auf die Kacke hauen', False]]},
    

    6:  {
        "Question": "Was war bereits seit Mai 1969 ein beliebtes Zahlungsmittel im europäischen Raum?",
        "Answers":  [
                ['A:', 'Euronoten', False],
                ['B:', 'Eurocheques', True],
                ['C:', 'Euroscheine', False],
                ['D:', 'Euromünzen', False]]},

    7:  {
        "Question": "Malu Dreyer profitierte Anfang des Jahres von ...?",
        "Answers":  [
                ['A:', 'Oettingers Sattelstang', False],
                ['B:', 'Veltins Fahrradkette', False],
                ['C:', 'Diebels Vorderreifen', False],
                ['D:', 'Becks Rücktritt', True]]}
    
            }

def create_dialog(key, callback):
    
    dialog_win = tk.Toplevel()
    dialog_win.title('Frage-{0}'.format(key))
    
    
    question = QUESTIONS[key]["Question"]
    
    frame = tk.Frame(dialog_win)
    frame.pack(padx=20, pady=10)
    
    tk.Label(frame, text=question, font=('Helvetica', 14, 'bold'),
        fg='red').pack(padx=20, pady=10)
    
    [tk.Button(frame, text=nr+answer, command=partial(callback, check,
        dialog_win)).pack(fill='x', padx=40, pady=30)
            for nr, answer, check in QUESTIONS[key]["Answers"]]    

def ask_question(check=None, dialog=None):
    
    if check is None:
        create_dialog(choice(QUESTIONS.keys()), ask_question)
        return
    
    dialog.destroy()
        
    if check:
        create_dialog(choice(QUESTIONS.keys()), ask_question)
    
    
app_win=tk.Tk()
app_win.title("Wer wird Millionär!")

back_gnd = tk.Canvas(app_win)
back_gnd.pack(expand=True, fill='both')

back_gnd_image = tk.PhotoImage(file="www.gif")
back_gnd.create_image(0, 0, anchor='nw', image=back_gnd_image)


tk.Button(app_win,text='Spielen',command=ask_question).pack(expand=True)
tk.Button(app_win,text='Verlassen',command=app_win.destroy).pack(expand=True)

app_win.geometry('250x150-650+200')
app_win.mainloop()

Danke im Voraus!!yahu

Re: Wer wird Millionär. Quiz Spiel Python

Verfasst: Donnerstag 20. Juni 2013, 12:49
von yahu
Und eswär glaub ich gut, wenn die Fragem dann nicht durcheinander kommen, sondern nach der bestimmten Reihenfolge...

yahu

Re: Wer wird Millionär. Quiz Spiel Python

Verfasst: Donnerstag 20. Juni 2013, 14:38
von EyDu
Hallo und willkommen im Forum!

Du solltest zunächst deinen Code etwas aufräumen. Der erste Schritt besteht darin, dass du deine Fragen zunächst einmal in ein richtiges Format umwandelst. Wenn du ein Dictionary hast und und anfängst die Fragen zu nummerieren, dann möchtest du eigentlich eine Liste verwenden. Damit erledigt sich auch das Problem, dass die Fragen durcheinander sind.

Auch das Format von Frage und Antwort ist sehr unglücklich gewählt. Auch hier ist es wieder unnötig, dass Schlüssel vergeben werden. Wenn die Frage immer als erstes kommt und die möglichen Antworten immer danach, dann reicht ein einfaches Tupel aus. Wenn du schon Namen für die einzelnen Positionen vergeben möchtest, dann bieten sich in diesem Fall eine einfache Klasse an oder, noch einfacher, Named-Tuples. Auch die Wahl deiner Schlüssel ist etwas ungünstig. Der Doppelpunkt in jedem Namen ist unnötig, da er reduntant ist.

Weiter geht das Problem bei den Antworten. Auch hier ist die Datenstruktur wieder unglücklich, wenn auch schon etwas besser. Immerhin verwendest du bereits Listen und keine Dictionaries mehr. Jedoch ist noch immer die Angabe von "A", "B", "C" und "D" überflüssig, diese Angaben haben nichts mit den Daten an sich zu tun. Im Prinzip ist es Egal, ob da Buchstaben stehen oder Zahlen, daher solltest du die Buchstaben gleich rauslassen. Diese werden erst bei der Ausgabe wichtig und erst da solltest du sie anzeigen. Das geht aber auch automatisch, ohne dass du sie in jeder Antwort explizit aufführst.

Und auch die Angabe, ob eine Antwort korrekt ist oder nicht, lässt sich noch vereinfachen. Zu "Wer Wird Millionär" gibt es übrigens schon haufenweise Threads hier im Forum, da wurde jede mögliche Variante schon durchgesprochen. Am einfachsten ist es (wenn es immer nur eine richtige Antwort gibt), wenn die richtige Antwort immer an erster Stelle steht und die falschen folgen. Dann wirst du auch die unnötigen False/True-Angaben los. Die Antworten mischt du dann, mittels random-Modul, wenn sie gefragt werden. Damit vereinfacht sich alles auf:

Code: Alles auswählen

QUESTIONS = [
    ("In welcher deutschen Stadt wurde der Reichstag verhüllt?", ("Berlin", "Bonn", "Hamburg", "München")),
    ("Welches Tier hat Baden Württenberg im Wappen?", ("Löwe", "Adler", "Fisch", "Bär")),
    ...]
Das enthält die selbe Information wie die bisheriger Ansatz, allerdings in einer viel kompakteren Schreibweise.

In deinem Code ist mir weiter noch aufgefallen, dass du eine List-Comprehension so verwendest, wie sie nicht verwendet werden sollte. LCs sind zum erstellen von Daten gedacht und nicht als eine kurze Variante von Schleifen. Wenn du das Ergebnis einer LC nicht verwendest und sofort verwirfst, dann solltest du immer eine for-Schleife verwenden.

Auch solltest du keinen Code, abgesehen von Imports, Funktionen und Klassen, auf modulebene haben. Das macht dein Programm unlesbar und hat den unschönen Nebeneffekt, dass dein Modul schlecht wiederverwendbar ist. Bei Python packt man üblicherweise den Code in eine main-Methode und ruft ihn nach dem folgenden Schema auf:

Code: Alles auswählen

def main():
    app_win=tk.Tk()
    app_win.title("Wer wird Millionär!")

    back_gnd = tk.Canvas(app_win)
    back_gnd.pack(expand=True, fill='both')

    back_gnd_image = tk.PhotoImage(file="www.gif")
    back_gnd.create_image(0, 0, anchor='nw', image=back_gnd_image)


    tk.Button(app_win,text='Spielen',command=ask_question).pack(expand=True)
    tk.Button(app_win,text='Verlassen',command=app_win.destroy).pack(expand=True)

    app_win.geometry('250x150-650+200')
    app_win.mainloop()

if __name__ == "__main__":
    main()
Damit ist sichergestellt, dass dein Programm und dann ausgeführt wird, wenn es direkt gestartet wird.

In deinem Code gibt es noch das eine oder andere Problemchen mehr, das sind aber erstmal die gröbsten Sachen. Aber genug Vorschläge solltest du jetzt erstmal haben.

Re: Wer wird Millionär. Quiz Spiel Python

Verfasst: Donnerstag 20. Juni 2013, 14:55
von yahu
danke dir schon mal!

Gibt es denn eine Möglichkeit noch den gewinn anzuzeigen, ohne, dass man eine extra Grafik mit 'Aufzug' Stil macht?

yahu

Re: Wer wird Millionär. Quiz Spiel Python

Verfasst: Donnerstag 20. Juni 2013, 19:56
von yahu
Damit erledigt sich auch das Problem, dass die Fragen durcheinander sind.
Geht das auch irgendwie anders? Hab das Programm soweit fertig und will bis morgen nicht alles ändern...
Vielleicht ein befehl der die Reihenfolge ausgibt?

Hilfe.

yahu

Re: Wer wird Millionär. Quiz Spiel Python

Verfasst: Freitag 21. Juni 2013, 09:32
von /me
yahu hat geschrieben:
Vielleicht ein befehl der die Reihenfolge ausgibt?
Eine Sortierung also. Du brauchst die Schlüssel des Dictionaries in sortierter Reihenfolge.

Code: Alles auswählen

>>> data = {1: 'A', 3: 'C', 2: 'B', 4: 'D'}
>>> for key in sorted(data.keys()):
	print data[key]

	
A
B
C
D
Grundsätzlich gilt aber das Gesagte: Ein Dictionary ist als Datenstruktur für diesen Einsatz ungeeignet.

Re: Wer wird Millionär. Quiz Spiel Python

Verfasst: Freitag 21. Juni 2013, 11:20
von Kebap
Das liegt daran, dass Dictionaries an sich unsortiert sind. Egal in welcher Reihenfolge die Daten eingegeben werden, sie werden immer in zufälliger Reihenfolge abgespeichert und letztendlich wieder ausgegeben. Das hat einige Vorteile, bspw. schnellere Durchsuchbarkeit, usw. Eine Liste merkt sich hingegen die Reihenfolge, in der die Daten eingegeben wurden.

Re: Wer wird Millionär. Quiz Spiel Python

Verfasst: Freitag 21. Juni 2013, 11:41
von cofi
An der Stelle sollte man vielleicht auch OrderedDict erwaehnen: http://docs.python.org/2/library/collec ... rderedDict

Aber eigtl willst du eine Liste verwenden.