Seite 6 von 9

Re: Gewinnspiel

Verfasst: Dienstag 9. April 2013, 16:35
von Sirius3
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.

Re: Gewinnspiel

Verfasst: Dienstag 9. April 2013, 16:37
von Gary123456
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 ;)

Re: Gewinnspiel

Verfasst: Dienstag 9. April 2013, 17:02
von nezzcarth
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 :)

Re: Gewinnspiel

Verfasst: Dienstag 9. April 2013, 17:41
von jerch
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.

Re: Gewinnspiel

Verfasst: Dienstag 9. April 2013, 17:48
von Gary123456
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 ;)

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 14:26
von Gary123456
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 :)

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 14:34
von BlackJack
@Gary123456: Grundlegende Zeichenkettenoperationen: `split()` und eine der `strip()`-Methode würde ich mal vorschlagen.

Edit: Wofür brauchst Du das denn?

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 14:48
von Gary123456
Vielen Dank. Diese Funktion kannte ich vorher noch nicht. Ich brauche das für mein Gewinnspiel, um der Liste was hinzuzufügen ;)

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 15:00
von Gary123456
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?

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 15:09
von 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.

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 15:11
von Hyperion
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...

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 15:14
von Gary123456
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.

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 15:15
von nomnom
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.

Re: Gewinnspiel

Verfasst: Mittwoch 10. April 2013, 15:19
von Gary123456
@nomnom) Vielen, vielen Dank!

@all) Code ausgebessert. Funktioniert ohne jegliche Probleme. :)

Re: Gewinnspiel

Verfasst: Donnerstag 11. April 2013, 18:42
von Gary123456
oO Jetzt merk ich erst, wie Klassen nützlich sein können. Mir geht da grad eine blendende Idee auf :)

Re: Gewinnspiel

Verfasst: Donnerstag 11. April 2013, 20:01
von Gary123456
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

Re: Gewinnspiel

Verfasst: Donnerstag 11. April 2013, 21:52
von /me
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.

Re: Gewinnspiel

Verfasst: Donnerstag 11. April 2013, 22:17
von derdon
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.

Re: Gewinnspiel

Verfasst: Freitag 12. April 2013, 09:00
von kbr
@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

Re: Gewinnspiel

Verfasst: Freitag 12. April 2013, 10:27
von Sirius3
@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