Wer wird Millionär. Quiz Spiel Python

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
yahu
User
Beiträge: 6
Registriert: Donnerstag 20. Juni 2013, 12:30

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
Zuletzt geändert von Anonymous am Freitag 21. Juni 2013, 06:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
yahu
User
Beiträge: 6
Registriert: Donnerstag 20. Juni 2013, 12:30

Und eswär glaub ich gut, wenn die Fragem dann nicht durcheinander kommen, sondern nach der bestimmten Reihenfolge...

yahu
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
yahu
User
Beiträge: 6
Registriert: Donnerstag 20. Juni 2013, 12:30

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
yahu
User
Beiträge: 6
Registriert: Donnerstag 20. Juni 2013, 12:30

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

An der Stelle sollte man vielleicht auch OrderedDict erwaehnen: http://docs.python.org/2/library/collec ... rderedDict

Aber eigtl willst du eine Liste verwenden.
Antworten