Belonungssystem in meinem Billigspiel

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
henry681997
User
Beiträge: 16
Registriert: Montag 9. April 2012, 17:05

Hey Leute, ich habe ein Programm programmiert, indem man addieren, multiplizieren und subtrahieren muss.
Für jede geloesste aufgabe kriegt man einen punkt und Goldmuenzen.
bei einer gewissen anzahl von goldmuenzen kann man sich strings kaufen die dann auf den bildchirm ausgegeben werden, wenn man genug goldmuenzen hat, wird man gefragt ob man einen string kaufen will, wenn ja, dann kann man ja eingeben, und es erscheint ein zufälliger string, mit hilfe von random.randint ["string1", "string2", "usw"]

nun frage ich mich wo ich das belohnungssystem am sinnvollsten einbauen soll, und wie ich es sinnvoll einbaue ohne wieder gleich meinen kompletten code zu versiffen -.-

mein code:

Code: Alles auswählen

import random

ja = "ja"

punkte = 0
gold = 0

neues_spiel = raw_input ("Neues Spiel? (ja oder nein)")

mal = "*"
plus = "+"
minus = "-"

##### Belohnungssystem #####

############################

print "Alpha 1.0 \n"
print ("Es wird empfohlen bei der Aufgabenanzahl mindestens 10 einzugeben, da momentan ein Bug existiert.")

while neues_spiel == ja:
    operation = raw_input ("subtrahieren, multiplizieren oder addieren? (Gib: *, + oder - ein!)")
    anzahl_aufgaben = input ("Wie viele Aufgaben moechtest du?")
    if operation == plus:
        for plus_ in range (anzahl_aufgaben):
            a = random.randint (1, 70)
            b = random.randint (1, 70)
            print a, "+", b, "=",
            c = int (raw_input () )
            if c == a + b:
                punkte = punkte + 1
                gold = gold + 60
            else:
                punkte = punkte
        print "Du hast", gold, "Goldmuenzen."
        print punkte, "Aufgaben waren richtig."
        neues_spiel = raw_input ("Noch ein Spiel?")

    operation = raw_input ("subtrahieren, multiplizieren oder addieren? (Gib: *, + oder - ein!)")
    anzahl_aufgaben = input ("Wie viele Aufgaben moechtest du?")
    if operation == mal:
        for mal_ in range (anzahl_aufgaben):
            a = random.randint (1, 15)
            b = random.randint (1, 15)
            print a, "*", b, "=",
            c = int (raw_input () )
            if c == a * b:
                punkte = punkte + 1
                gold = gold + 100
            else:
                punkte = punkte
        print "Du hast", gold, "Goldmuenzen."
        print punkte, "Aufgaben waren richtig."
        neues_spiel = raw_input ("Noch ein Spiel?")

    operation = raw_input ("subtrahieren, multiplizieren oder addieren? (Gib: *, + oder - ein!)")
    anzahl_aufgaben = input ("Wie viele Aufgaben moechtest du?")
    if operation == minus:
        for minus_ in range (anzahl_aufgaben):
            a = random.randint (1, 70)
            b = random.randint (1, 70)
            print a, "-", b, "=",
            c = int (raw_input () )
            if c == a - b:
                punkte = punkte + 1
                gold = gold + 70
            else:
                punkte = punkte
        print "Du hast", gold, "Goldmuenzen."
        print punkte, "Aufgaben waren richtig."
        neues_spiel = raw_input ("Noch ein Spiel?")
input ("Ende")


ich bitte um antworten danke, leider ist es notwendig den kompletten code zu kopieren, bite bitte geht ihn doch etwas durch um mir gute antworten zu geben, danke :)
henry681997
User
Beiträge: 16
Registriert: Montag 9. April 2012, 17:05

ich habe noch ein problem, bei manchen zahlen die man bei der anzahl der aufgaben eingibt, passiert ein bug:

Neues Spiel? (ja oder nein)ja
Alpha 1.0

Es wird empfohlen bei der Aufgabenanzahl mindestens 10 einzugeben, da momentan ein Bug existiert.
subtrahieren, multiplizieren oder addieren? (Gib: *, + oder - ein!)*
Wie viele Aufgaben moechtest du?50
(die zahl 50 akzeptiert er komischerweise nicht, andere zahlen zum beißpiel auch nicht)
subtrahieren, multiplizieren oder addieren? (Gib: *, + oder - ein!)*
Wie viele Aufgaben moechtest du?10
11 * 7 =
.....
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

henry681997 hat geschrieben:nun frage ich mich wo ich das belohnungssystem am sinnvollsten einbauen soll, und wie ich es sinnvoll einbaue ohne wieder gleich meinen kompletten code zu versiffen -.-
Ohne mir den Code jetzt wirklich genau angesehen zu haben kann ich dir schon direkt sagen, dass er nicht gut ist. Du hast häufig sehr ähnliche oder sogar völlig identische Codepassagen. Diese solltest du dringend zu einer einzigen Funktion zusammenführen.

Ist dir übrigens der Unterschied zwischen raw_input() und input() klar? Die lässige Verwendung von input() unter Python 2.x reißt dir eine riesige Sicherheitslücke in die Software, da die Eingabe als Python-Code ausgeführt wird.

Bau also das Belohnungssystem noch nirgendwo ein, sondern räume erst einmal den bestehenden Code auf.
problembär

henry681997 hat geschrieben:bei einer gewissen anzahl von goldmuenzen kann man sich strings kaufen die dann auf den bildchirm ausgegeben werden
Oh ja, ich möchte bitte ein "E" kaufen! :P
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hui... da juckt es einen ja fast in den Fingern, mal ein Tutorial über Taschenrechneraufgaben zu schreiben... :-D

Ich kann mich /me nur anschließen! Du musst dringend lernen, wie man Code möglichst universell schreibt bzw. wie man gleiche Funktionalität kapselt und so in eine Funktion verpackt, dass man sich doppelt und dreifach gleich anmutenden Code sparen kann.

Schau Dir mal Deinen Code an. Du hast drei große Blöcke, die fast *identisch* aussehen. Rein vom optischen her sollte das einem auffallen. Man spricht da auch von "Copy&Paste"-Programmierung - ich würde wetten, Du hast diesen Code wörtlich genauso entwickelt, oder ;-)

Ich zeige Dir mal einen Block mit Vorschlägen, wie man etwas umorganisieren bzw. besser schreiben könnte:

Code: Alles auswählen

# Hier fehlt def. eine Überprüfung der Eingabe ;-) Man kann ja auch aus
# Versehen mal eine falsche Eingabe tätigen
# Generell ist das doch das zentrale "Menü". Das sollte zentral in Deiner
# Hauptfunktion stehen!
operation = raw_input ("subtrahieren, multiplizieren oder addieren? (Gib: *, + oder - ein!)")
# Auch das ist bei jeder Rechenart gleich - also gehört das auch in das
# zentrale Menühandling.
anzahl_aufgaben = input ("Wie viele Aufgaben moechtest du?")
# Hier trennst Du letztlich Deinen Code, um die drei verschiedenen
# Rechenoperationen zu implementieren... 
# (wieso fehlt Division eigentlich?)
# Ich denke es ist viel zu "früh", um hier zu differenzieren... schaun wir weiter
if operation == plus:
    # der Name ``plus_`` ist wenig schön. Wieso nicht ``count`` o.ä.?
    # wenn der Name nicht wäre, dann sähe die Schleife für alle Rechenarten
    # identisch aus!
    for plus_ in range (anzahl_aufgaben):
        a = random.randint (1, 70)
        b = random.randint (1, 70)
        # hier ist eigentlich nur das "+" anders, anders als bei anderen
        # Rechenarten - das kann man ja an einen Namen binden und damit
        # je nach Auswahl mit dem passenden Zeichen belegen! Damit
        # wäre auch das hier "universalisierbar"
        print a, "+", b, "=",
        c = int (raw_input () )
        # hier ist wieder ein Unterschied. Man müsste die Rechnung auslagern
        # schreibe dafür doch einfach für jede Rechenoperation eine 
        # separate Funktion! ``def add(a, b): return a + b`` usw.
        if c == a + b:
        # ab hier ist es auch wieder gleich, von dem Betrag abgesehen.
        # auch den kann man je nach Operation definieren.
            punkte = punkte + 1
            gold = gold + 60
        else:
            punkte = punkte
    # Hier kommt wieder eine exakt identische Passage!
    print "Du hast", gold, "Goldmuenzen."
    print punkte, "Aufgaben waren richtig."
    neues_spiel = raw_input ("Noch ein Spiel?")
Wie Du siehst ist das *meiste* absolut identisch mit den anderen beiden Blöcken. Bedenke den Aufwand, wenn Du noch mehr Rechenarten einbauen willst... ;-)

Meine Idee wäre es, Dir eine Datenstruktur aufzubauen, die alle relevanten variablen Daten einer Rechenoperation zusammenfasst! Wenn Dir mein Vorschlag nicht klar ist, dann lies Dir vielleicht mal mein Tutorial zu Menüs in Python durch - da geht es thematisch zwar um etwas anderes, viele Prinzipien (Datenstrukturen, Funktionen als Objekte wahrnehmen) lassen sich 1:1 auf Deine Problematik übertragen.

Meine Idee sähe als Schnellschuss so aus: Code

Mann könnte da vieles noch kompakter schreiben, aber ich denke das ist für einen Anfänger noch halbwegs nachvollziehbar :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Hyperion hat geschrieben:

Code: Alles auswählen

# (wieso fehlt Division eigentlich?)
Ich vermute die Division fehlt, da das Standardverhalten von Python 2.x diesbezüglich leicht merkwürdig ist (oh und vielleicht um Division durch Null zu vermeiden, da das eine Fehlerquelle mehr wäre).
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

webspider hat geschrieben:Ich vermute die Division fehlt, da das Standardverhalten von Python 2.x diesbezüglich leicht merkwürdig ist.

Code: Alles auswählen

from __future__ import division
darf in keinem guten Python2.x-Programm fehlen. ;)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Trotzdem können ja so schwierige Aufgabe wie 25/7 entstehen. Ich vermute, dass henry681997 einfach zu faul war, solche Fälle zu vermeiden und daher ganz auf Division verzichtet hat.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Tja, da muss man ja nur auf die Idee kommen, die Division erst als Multiplikation aufzubauen und anhand des Ergebnisses festzulegen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten