Seite 1 von 1

Kleines Text-Spiel zum Zahlenraten

Verfasst: Freitag 25. Januar 2008, 13:34
von ge0matrix
Hi, hier ist meine neuste Kreation! Leider ist sie wieder auf Modulbasis und nicht in Funktionen eingeteilt, da ich es dann doch sinnvoler fand, das ganze in einem Modul zu schreiben. Wenn jemand einen Vorschlag hat, wie ich es mit Funtkionen besser machen koennte, ist sehr wilkommen!

PS) diesmal habe ich mich an die PEP8 gehalten :D

Code: Alles auswählen

#Spiel, wo mann das Doppelte oder Dreifache einer Zahl raten muss
#Regeln werden in den Linien 7-18 beschrieben.
from random import randrange
counter = 15 #counter =anzahl der Fragen die beansweret werden muessen,
joker = 2   #joker=siehe unten
flag2 = flag3 = flag4 = flag5 = False #fuer flags siehe wieter unten
print "***********************************************************"
print "Hallo, hier ist das interaktive Spiel namens Rate das Doppelte"
print "Du must 15 mal das Doppelte rausfinden, wobei es in jedem level etwas" 
print "schwieriger wird, die richtige Zahl zu finden"
print "Du faengst mit 2 Joker an, die dir weiterhelfen wenn du einmal falsch" 
print "raetst."
print "Allerdings musst du fuer jeden benutzten Joker 3 mal zusaetzlich raten"
print "Du kriegst einen weiteren joker in jeder ersten betretung eines Levels"
print "Wenn die Joker zu ende sind, verlierst du."
print "Es gibt 4 Schwierigkeitsgrade mit jeweils 4 Schwierigkeitslevel plus"
print "ein 5es schwereres end-level"
print "***********************************************************"
#Schwieriegkeitsgrad-check 
difficulty = raw_input("bitte Schwierigkeitsgrad eingeben(1,2,3 oder 9) ")
difficulty = int(difficulty)
if difficulty == 1 or difficulty > 3: #>3:fuer num-exception und extrem modus
    limit_small, limit_big = 100, 999 # limit anfang und ende fuer die 
                                        # generierte Zahl
if difficulty == 2:
    limit_small, limit_big = 1000, 9999 # bei groesseren Schwierigkeitsgraden
                                        # fangen die Zahlen groesser an
elif difficulty == 3:
    limit_small, limit_big = 10000, 99999
if difficulty == 9 : 
  multiplicator = 3 #multiplikatioren fuer die random zahlen
else: 
  multiplicator = 2
while counter != 0: #15 wiederholungen
    #///////levelcheck start/////////////////
    if counter == 15:
        print "++++++++++++++++++++++++++++++++++++++"
        print "Level 1 "
        print "++++++++++++++++++++++++++++++++++++++"
    if counter > 12:          
        new_limit_small = limit_small   
        new_limit_big = limit_big
    # dieser Schritt muss separat sein, sonnst bleiben die Zahlen so hoch wie 
    # beim zuletzt besuchten Level, auch nach einem Fall in tiefere Level.
    # Darum auch die Indizes new_limit_small, new_limit_big 
    elif counter == 12:
        print "++++++++++++++++++++++++++++++++++++++"
        print "Level 2"
        print "++++++++++++++++++++++++++++++++++++++"
        if flag2 == False: #flag-check. Flags sind da damit man einen Joker pro
            flag2 = True  #level nur einmal erhaelt. Andernfalls, wenn mann aus
            joker += 1    #nem level rauskommt und wieder reinkommt kriegt mann
            print "+1 Joker" #jedesmal wieder einen Joker, und das Spiel wird
                             #zu leicht.        
    if counter <= 12 and counter > 8:
        new_limit_small = limit_small * 10 
        new_limit_big = limit_big * 10
        #bei jedem level werden die Zahlen um eine Stelle groesser
    elif counter == 8:
        print "++++++++++++++++++++++++++++++++++++++"
        print "Level 3"
        print "++++++++++++++++++++++++++++++++++++++"
        if flag3 == False:  #jedes level hat sein eigenen flag und flag-check
            flag3 = True 
            joker += 1
            print "+1 Joker"
    if counter <= 8 and counter > 4:    
        new_limit_small =  limit_small * 100 
        new_limit_big = limit_big * 100
    elif counter == 4:
        print "++++++++++++++++++++++++++++++++++++++"
        print "Level 4"
        print "++++++++++++++++++++++++++++++++++++++"
        if flag4 == False:
            flag4 = True
            joker += 1
            print "+1 Joker!"
    if counter <= 4 and counter != 1:
        new_limit_small = limit_small * 1000 
        new_limit_big = limit_big * 1000
    elif counter == 1:
        print "++++++++++++++++++++++++++++++++++++++"
        print "Level 5"
        print "++++++++++++++++++++++++++++++++++++++"
        new_limit_small =  limit_small * 10000000 
        new_limit_big = limit_big * 100000000 
        #fuer die einzige level-5 frage hat die Zahl viel mehr Stellen
        if flag5 == False:
            flag5 = True
            joker += 1
            print "+1 Joker!"
    #/////level-check ende/////////
    print "" #ein kleiner Abschnitt im neuem Level 
    counter -= 1 #mal-counter geht zurueck
    generated_number = randrange(new_limit_small, new_limit_big) 
    #generated_number ist die zu verdopplende bzw verdreifachende Zahl
    #multiplicator-check, bzw ob mann das zwei- oder dreifache rechnen muss 
    if multiplicator == 2: 
      print "Das doppelte von: " ,generated_number, "  ist?"
    else: 
      print "Das dreifache von: ", generated_number, " ist?"
    answer = int(raw_input())
    # /////answer check anfang////////////
    # Fall 1:cheat-Wort "0" Wenn man 0 tippt zaehlt es als richtige Antwort
    # und gibt die tatsaechliche Antwort aus (fuer testzwecke eingebaut)
    if answer == 0:
        if multiplicator == 2: print 2 * generated_number
        else: print 3 * generated_number
        continue
    #Fall 2:falsche Antwort in leveln 1,2 und 3 
    elif answer != 2 * generated_number and multiplicator == 2:
        joker = joker-1
        counter = counter + 3
        print "falsch!"
        print "die richtige answer waere", 2 * generated_number     
    #Fall3: falsche Antwort im extrem modus
    elif answer != 3 * generated_number and multiplicator == 3:
        joker = joker - 1
        counter = counter + 3
        print "falsch!"
        print "die richtige answer waere", 3 * generated_number
    #Fall4:richtige Antwort (kein exception-catch vorhanden)  
    elif counter != 0: # if-check ist dafuer da damit bei der letzten richtigen
                    # Antwort nicht nochmal dieser Text steht
        print "sehr gut, noch ", counter, " Mal raten!"
        print "Du hast noch ", joker, " Joker"
    #game-over-check
    if joker == -1: #Joker muss auf -1 gehen, da man mit 0 Jokern immer noch 
        print " +  +  +  +  +  +  +  +  +  +  +"              # spielen kann
        print "Du hast keinen Joker mehr um dich zu retten! Du hast verloren!"
        print " +  +  +  +  +  +  +  +  +  +  +"
        break
    else:
        print "Du verlierst einen und hast noch ", joker, " Joker"
        print "noch ", counter, " Mal raten!"
    # //////////answer-check ende///////////////
# Gewonnen check und Auswertung
if counter == 0: # gewonnen-check notwendig, damit beim verlieren keine 
                # Auswertung auftaucht
    wrong_answers = 6-joker #Bei jeden Spiel kriegt man 6 Joker und  bei jeder 
                        #falschen Antwort verliert man einen, daher die Formel
    print "Sehr gut! Du hast gewonnen!"
    print "Du hast insgesammt ",15 + (6 - joker) * 3, " mal geraten" 
    # Formel: male die geraten wurden = anfangs counter +(insgesammts
    # joker minus die uebriggebliebene joker) * (anzahl der schritte, 
    # die man verliert wenn mann falsch answeret plus 1)
    print "und dabei", wrong_answers, " Fehler gemacht"
    #rankings  
    if multiplicator == 3: print "wow!!!! Extrem modus geschafft!!! Super!"
    elif wrong_answers == 0: print "perfekt! Deine Note: 1.0!"
    elif wrong_answers <=2 : print "gut! Deine Note: 2.0"
    elif wrong_answers ==5 : print "ganz knapp... aber du hast es geschafft! 4.0"
    else: print "nicht perfekt, aber auch nicht schlecht. 3.0"

Verfasst: Freitag 25. Januar 2008, 13:58
von EyDu
Oh man, damit beschäftigst du BlackJack aber heute noch eine halbe Stunde ;-)

Verfasst: Freitag 25. Januar 2008, 14:47
von Zap
Mein Tipp: Funktionen sind eine tolle Erfindung. Bitte nutze sie...

Verfasst: Freitag 25. Januar 2008, 15:34
von ge0matrix
Zap hat geschrieben:Mein Tipp: Funktionen sind eine tolle Erfindung. Bitte nutze sie...
ja ich weiss, aber in diesem Falle wuerden sie den Code nur noch vergroessern und umstaendlichr machen. Ich wollte zB eine Funktion fuer den Multiplikator verwenden, allerdings ermittle ich in den 3-4 if-cheks auch gleich die anfangs-Werte limit_small und limit_big, darum muesste ich dafuer gleich 2 Funktionen machen. Genauso spaeter im Level check. Ich finde es daher unlogisch den Code so Imens zu vergroessern, wenn er doch ganz gut auch so funktioniert.

Verfasst: Freitag 25. Januar 2008, 15:46
von Python 47
Funktionen machen den Quelltext nur wenig länger, dafür aber um einiges lesbarer und übersichtlicher, zudem kann man viel leichter Fehler finden und dein Programm testen.

Verfasst: Freitag 25. Januar 2008, 16:11
von Hobbes Hobson
bin gerade dabei das zu überarbeiten :wink:


besonders hart finde ich sowas hier:

Code: Alles auswählen

if multiplicator == 2: print 2 * generated_number
else: print 3 * generated_number
'multiplicator' kann nur 2 oder 3 sein

Verfasst: Freitag 25. Januar 2008, 16:36
von BlackJack
@EyDu: Nö, damit beschäftige ich mich nicht. Da sind soviele Daten als Code statt als Daten, in so hässlichem Quelltext, dass ich wahrscheinlich nach 5 Minuten Kopfschmerzen bekomme.

@ge0matrix: Mehr Zeilen sind nichts schlechtes. Funktionen, Kommentare zwischen den Zeilen und nicht am Ende, Leerzeilen, und auch einzeilige "Blöcke" in eine neue Zeile setzen, machen Programme sehr viel übersichtlicher.

Und bei Kommentaren ist es üblich die *folgenden* Zeilen zu beschreiben und nicht die *vor* dem Kommentar. Du scheinst das mal so und mal so zu machen.

Verfasst: Freitag 25. Januar 2008, 23:56
von Zap
ge0matrix hat geschrieben:ja ich weiss, aber in diesem Falle wuerden sie den Code nur noch vergroessern und umstaendlichr machen.
Also ob der Code durch Funktionen wirklich umfangreicher werden würde wage ich zu bezweifeln bei soviel Copy&Paste wie derzeit drin ist.
Umständlicher würde er aber auf garkeinen Fall!
Wäre die Basis nicht so undurchsichtig wäre ich durchaus bereit das Ding einem Refactoring zu unterziehen.
Aber das scheint mir doch etwas zu aufwändig, sorry.

Verfasst: Samstag 26. Januar 2008, 00:23
von Hobbes Hobson
http://paste.pocoo.org/show/23697/

Ich habe das ganze etwas überarbeitet, hatte dann aber irgendwann keine Lust mehr das ganze zu Ende zu bringen :).

Nur ein paar Anmerkungen:

Wenn du das schon als Modul verwenden möchtest, dann solltest du das auch in eine Funktion schreiben, da sonst beim Import das ganze ausgeführt wird (möchte man ja nicht immer haben)

Ich habe keine neuen Funktionen hinzugefügt (bis auf alles in eine main zu packen).

Wenn du die Eingabe nicht weiter kontrollierst, reicht hier ein 'input()'.

Sachen wie:

Code: Alles auswählen

a = 1

if a == 1:
    print 1

elif a == 2:
    print 2
    
elif a == 3:
    print 3
sind redundant und lassen sich eleganter loesen (print a).

Schreib so Sachen wie den counter nicht an den Anfang des Dokuments sondern dort wo sie sinnig sind (hier: direkt vor die Schleife).

Und wenn du irgendwelche Muster hast, gibt es immer elegantere Moeglichkeiten als die einzelnen Zeilen redundant darzustellen.


edit:
Ein Ratespiel ist das sicher nicht, sondern ein Rechenspiel :)

Verfasst: Samstag 26. Januar 2008, 01:02
von EyDu
Hobbes Hobson hat geschrieben:Wenn du die Eingabe nicht weiter kontrollierst, reicht hier ein 'input()'.
Vergiss dass es "input" überhaupt gibt. int(raw_input(...)) ist genau die richtige Lösung! "input" führt BELIEBIGEN Code aus, da ist es nicht schwer sich vorzustellen, was man damit alles anrichten kann.

Verfasst: Samstag 26. Januar 2008, 01:24
von Frank aka Ch3ck3r
Hobbes Hobson hat geschrieben:
Ich habe das ganze etwas überarbeitet, hatte dann aber irgendwann keine Lust mehr das ganze zu Ende zu bringen :).
Mir war grad super langweilig, also: http://paste.pocoo.org/show/23792/

Edit (BlackJack): Code ausgelagert

Verfasst: Samstag 26. Januar 2008, 13:05
von BlackJack
Ich habe mich auch mal dran versucht: http://paste.pocoo.org/show/23790/

Die nächsten Schritte wären dann wohl die Benutzereingaben zu überprüfen, damit das Spiel nicht nach 15 Fragen kurz vorm Ziel abbricht, weil man sich vertippt hat.

Verfasst: Samstag 26. Januar 2008, 17:22
von ge0matrix
wow, die codes sind ziemlich cool geraten! Ich guck sie mir gleich mal an, die sehen echt vielversprechend aus. Danke! :D