Gewinnspiel

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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Noch eine weitere Variante:

Code: Alles auswählen

import easygui, random, sys

frage_antwort = [
    ("Was ist Fifa13?", ["Ein Computerspiel"], ["Ein Monster", "Eine Uhrzeit"]),
    ("Was ist eine Computermaus?", ["Ein Steuerungsgeraet"], ["Eine Tastatur", "Ein Bildschirm"]), 
    ("Test1", ["Test2"], ["Test3", "Test4"])
]

for frage,  richtige_antworten, falsche_antworten in frage_antwort:
    antworten = random.sample(richtige_antworten+falsche_antworten,
        len(richtige_antworten)+len(falsche_antworten))
    antwort = easygui.buttonbox(frage, choices = antworten)
    if antwort in richtige_antworten:
        print "richtig"
Damit sind auch mehrere richtige Antworten möglich.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

OK, aber vom Prinzip und Code her besser? Habe den Code verbessert.

@Sirius) Das wäre eine Aufgabe für mich. Das aber evtl später, denn ich habe das Programm geplant. Vorerst will ich es mit einer Antwortmöglichkeit haben. Es werden auch Jokers eingeführt ;)
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Gary123456 hat geschrieben: [...] und in der Theorie ist mir eh alles klar! 8)
Erfahrungsgemäß macht man sich mit solchen Aussagen selbst was vor... ;) Das gehört halt beides zusammen. Ich treffe öfter mal Leute, die mir sagen "Englisch kann ich eigentlich ganz gut, so von der Grammatik her, aber mir fehlen halt die Vokabeln", das wird ihnen aber eben nichts bringen, wenn sie irgendwo mal nach dem Weg fragen wollen ;)

Meiner Meinung nach gehört zu jedem Lernvorgang auch eine realistische Einschätzung der eigenen Fähigkeiten. Selbstüberschätzung ist aus psychischer Sicht vielleicht recht angenehm, wird dich aber nicht weiterbringen.

Du bekommst hier viele nützliche Hinweise, bist aber immer nur am erklären, warum du deins trotzdem besser findest und dass du eh schon alles verstanden hast. Kannst du ja machen, aber so wird das mit Programmieren lernen viel länger dauern, als eigentlich nötig wäre :)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Meine Mäkelei war natürlich etwas sophistisch, für den "Wer wird Millionär"-Ansatz tuts die Annahme mit Index 0. Allerdings halte ich es da mit EyDu, die Anforderungen ändern sich meist öfter, als einem lieb ist. So kann Sirius' Datenstruktur mit getrennten Listen richtiger und falscher Antworten auch Deine derzeitigen Anforderung abbilden (genau eine richtige Antwort, alle anderen falsch), ist zudem aber auch imstande, z.B. multiple choice-Fragen abzubilden.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

@jerch)
Es wäre interessant, wenn ich mal in der GUI choice Boxen proggen könnte ;) Da müsste ich mich noch umsehen. Aber vorerst sind mir Buttons lieber

@nezzcareth)
Um es korrekter auszudrücken: Theorie aus dem Buch habe ich verstanden.
Du bekommst hier viele nützliche Hinweise, bist aber immer nur am erklären, warum du deins trotzdem besser findest und dass du eh schon alles verstanden hast. Kannst du ja machen, aber so wird das mit Programmieren lernen viel länger dauern, als eigentlich nötig wäre :)
Wo denn bitteschön? Ich habe alles versucht, die Vorschläge anzunehmen? Und am aktuellen Code scheint auch alles super zu laufen. :shock:

Aber für heute ist vorerst Schluss, habe noch vieles zu tun ;)
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

Code: Alles auswählen

liste = ["Test1, Test2, Test3"]
Kann man das irgendwie in 3 Elemente wie

Code: Alles auswählen

liste = ["Test1", "Test2", "Test3"]
zerlegen?

Bin da grad echt am zweifeln :)
BlackJack

@Gary123456: Grundlegende Zeichenkettenoperationen: `split()` und eine der `strip()`-Methode würde ich mal vorschlagen.

Edit: Wofür brauchst Du das denn?
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Vielen Dank. Diese Funktion kannte ich vorher noch nicht. Ich brauche das für mein Gewinnspiel, um der Liste was hinzuzufügen ;)
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Wenn Ihr den Code sehen wollt:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
import easygui, random, sys


frage_antwort = [
	
	("Was ist Fifa13?", ["Ein Computerspiel", "Ein Monster", "Eine Uhrzeit"]),
 	("Was ist eine Computermaus?", ["Ein Steuerungsgeraet", "Eine Tastatur", "Ein Bildschirm"]), 
	("Test1", ["Test2", "Test3", "Test4"])
]

	

punkte = 0
versuche = 2

frage_an_user = raw_input("Moechten sie eine Frage hinzufuegen? 'ja' fuer Ja")

if frage_an_user == "ja":
    frage_liste = raw_input("Welche Frage wuenschen sie sich?")
    antwort_moeglichkeiten = raw_input("Welche Antworten wuenschen sie sich (per Leerzeichen getrennt!)") #immer index 0 richtige Antwort!
    frage_antwort.extend([(frage_liste, antwort_moeglichkeiten.split())])


for fragen,  antworten in frage_antwort:
    frage_gui = easygui.buttonbox(fragen, choices = random.sample(antworten, len(antworten)))

    if frage_gui == antworten[0]:
        print "richtig"
        punkte += 100
        versuche -= 1

Überlege mir gerade, was ich als nächstes einbauen werde. Habe jetzt auch das Kapitel 'Funktionen' durchgenommen. D.h. als nächstes kommt OOP dran und bevor dem würde ich noch was mit Funktionen zu tun. Jemand Vorschläge, was ich dem Programm hinzufügen könnte?
BlackJack

@Gary123456: Ich würde die möglichen Antworten einzeln eingeben lassen. Eine Antwort zerlegen ist nicht so einfach. Leerzeichen sind ungeeignet, weil man damit alle Antworten ausschliesst, die Leerzeichen enthalten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gary123456 hat geschrieben:Vielen Dank. Diese Funktion kannte ich vorher noch nicht. Ich brauche das für mein Gewinnspiel, um der Liste was hinzuzufügen ;)
Öh... Listen fügt man Elemente mittels ``list.append`` hinzu! Wozu Du da string-Methoden brauchst, erschließt sich uns hier nicht...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Daran habe ich nicht gedacht, Recht hast Du aber :lol: Danke!

Hyperion)

Wenn Du Antworten mit Leerzeichen eingibst (also insgesamt sagen wir mal 3 Antworten) speichert es das in einem Element und nicht in 3. So: liste = ["Antwort 1 Antwort 2 Antwort 3"], verstanden was ich meine? Aber wenn ich jetzt, wie BlackJack sagte, einzeln diese Antworten abfrage, bräcuhte ich die Stringoperationen nicht.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

So was wie Wer wird Millionär hatten wir auch mal angefangen zu programmieren (ist schon ein älteres Projekt ... weiß nicht, wie gut das Programm ist). Wir haben auch recht viele Fragen zusammengestellt. ;) AFAIK (!) sind sie GNU GPL. :mrgreen:
Die Tabellen sind CSV-Tabellen. Mit den richtigen Einstellungen kannst du sie einfach aus der Wiki-Seite kopieren und mit dem csv-Modul auslesen.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

@nomnom) Vielen, vielen Dank!

@all) Code ausgebessert. Funktioniert ohne jegliche Probleme. :)
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

oO Jetzt merk ich erst, wie Klassen nützlich sein können. Mir geht da grad eine blendende Idee auf :)
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Vor lauter Begeisterung habe ich das mal auf mein Programm angewendet und bin mir nicht zu 100% sicher, ob das stimmt (es funktioniert aber!)

Code: Alles auswählen


import easygui, random, sys


class Spiel:

    def __init__(self, spielername):
        self.name = spielername
        self.liste = [
	
	("Was ist Fifa13?", ["Ein Computerspiel", "Ein Monster", "Eine Uhrzeit"]),
 	("Was ist eine Computermaus?", ["Ein Steuerungsgeraet", "Eine Tastatur", "Ein Bildschirm"]), 
	("Test1", ["Test2", "Test3", "Test4"])
        ]
        self.punkte = 0
        self.versuche = 3
        self.geld = 0

    def __str__(self):
        hinweis = "Das ist ein klassisches 'Wer wird Millionär' Spiel"
        return hinweis

    def punkte_hinzufuegen(self, betrag): #Normal sind 100 Punkte
        self.punkte += betrag
        return self.punkte

    def punkte_abziehen(self, betrag):
        if self.punkte > 100:
            self.punkte -= betrag
            return self.punkte
        else:
            print "Sie haben das Spiel verloren!"

    def geld_hinzufuegen(self, betrag):
        self.geld += betrag
        return self.geld

    def geld_abziehen(self, betrag): #pro Frage wahrscheinlich 100 € weg
        if self.geld >= 100:
            self.geld -= betrag
            return self.geld
        else:
            print "Sie haben das Spiel verloren!"
    def punkte_anzeigen(self):
        return self.punkte

    def geld_anzeigen(self):
        return self.geld
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Gary123456 hat geschrieben:

Code: Alles auswählen

    def punkte_anzeigen(self):
        return self.punkte
punkte_anzeigen ist der falsche Name für die Methode. Da wird nichts angezeigt, sondern nur ein Wert zurückgegeben.

Zudem ist die Methode überflüssig. Wenn du die Punkte haben willst, dann greif doch einfach direkt auf name_der_spiel_instanz.punkte zu, statt den unnötigen Umweg zu gehen.

An einer anderen Stelle ist es ebenfalls merkwürdig. Die Methode punkte_abziehen tut nicht nur das was ihr Name sagt, sondern gibt auch noch die neue Punktzahl als Wert zurück. Schlimmer noch, in der Methode mischst du wieder Ein-/Ausgabe mit Logik. Lass das Spiel ein Spiel sein und erledige Ausgaben außerhalb.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Was sollen die Kommentare "Normal sind …" und "pro Frage wahrscheinlich …"? Es ist zwar bekannt, dass Software in der Regel nicht-deterministisch ist, aber das so deutlich in den Kommentaren auszudrücken, ist doch ungewöhnlich ;) Also tu zumindest so, als ob sich dein Programm ganz verlässlich immer so verhält wie du es erwartest und schreibe konkretere Kommentare. Anstelle der magischen 100 bietet sich eine Klassenkonstante an, um den Code sowohl lesbarer als auch wartbarer zu machen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Gary123456: Deinen Code habe ich mal etwas umgestellt. Das ist jetzt nur ganz rudimentär ohne __name__ == '__main__' etc. und soll Dir beispielhaft zeigen, wie Du Logik und IO trennen kannst, und dass für den Attributzugriff keineswegs getter und setter gebraucht werden. Und 'property' habe ich Dir deswegen auch eingebaut.

Code: Alles auswählen

FRAGEN = [
        ("Was ist Fifa13?", 
            ["Ein Computerspiel", "Ein Monster", "Eine Uhrzeit"]),
        ("Was ist eine Computermaus?", 
            ["Ein Steuerungsgeraet", "Eine Tastatur", "Ein Bildschirm"]), 
        ("Test1", 
            ["Test2", "Test3", "Test4"])
        ]

GRENZWERT = 100


class Spiel(object):

    def __init__(self, spielername, fragen, grenzwert):
        self.name = spielername
        self.fragen = fragen
        self.grenzwert = grenzwert
        self.punkte = 0

    def __str__(self):
        return u"Das ist ein klassisches 'Wer wird Millionär' Spiel"

    @property
    def ist_zuende(self):
        return self.punkte < self.grenzwert

        
# Beispiel:

# Erzeuge Spiel-Objekt mit Frageliste
spiel = Spiel('Gary', FRAGEN, GRENZWERT)

# direkter Zugriff auf Instance-Variable
spiel.punkte += 500
print spiel.punkte

# Ablaufkontrolle
if spiel.ist_zuende:
    print 'Spiel verloren'
else:
    print 'Spiel geht weiter'
    
# Stelle Fragen
for frage in spiel.fragen:
    print frage
    ...
Das musst Du jetzt nur noch passend konstruieren. Elegant wäre es, wenn auch die Fragen Objekte mit Attributen wären, so dass Du etwas wie das folgende schreiben könntest:

Code: Alles auswählen

for frage in spiel.fragen:
    print frage.fragetext
    ...
    if antwort == frage.antwort:
        spiel.punkte += 100
    else:
        spiel.punkte -= 100
    if spiel.ist_zuende:
        break
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@kbr: und hier machst Du zu viel Spiel-relevantes außerhalb der Spiel-Klasse.
Das Spiel soll selbst entscheiden, ob es weitere Fragen gibt, oder ob es zu Ende ist.
Das Spiel soll selbst entscheiden, was passiert, wenn eine Frage richtig oder falsch beantwortet wird:

Code: Alles auswählen

FRAGEN = [
        ("Was ist Fifa13?",
            ["Ein Computerspiel", "Ein Monster", "Eine Uhrzeit"]),
        ("Was ist eine Computermaus?",
            ["Ein Steuerungsgeraet", "Eine Tastatur", "Ein Bildschirm"]),
        ("Test1",
            ["Test2", "Test3", "Test4"])
        ]

GRENZWERT = 100


class Spiel(object):
    def __init__(self, spielername, fragen, grenzwert):
        self.name = spielername
        self._fragen = fragen
        self.grenzwert = grenzwert
        self.punkte = grenzwert

    def __str__(self):
        return u"Das ist ein klassisches 'Wer wird Millionär' Spiel"

    @property
    def fragen(self):
        for frage in fragen:
            if self.punkte < self.grenzwert:
                break
            yield frage

    def verarbeite_antwort(self, antwort):
        self.punkte += 100 if antwort else -100
       
spiel = Spiel('Gary', FRAGEN, GRENZWERT)

# Stelle Fragen
for fragetext, antworten in spiel.fragen:
    print fragetext
    ...
    spiel.verarbeite_antwort(antwort == richtige_antwort)
    print "Du hast jetzt %d Punkte" % spiel.punkte
Antworten