Kleines Text-Spiel zum Zahlenraten

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

Kleines Text-Spiel zum Zahlenraten

Beitragvon ge0matrix » Freitag 25. Januar 2008, 13:34

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"
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Freitag 25. Januar 2008, 13:58

Oh man, damit beschäftigst du BlackJack aber heute noch eine halbe Stunde ;-)
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Freitag 25. Januar 2008, 14:47

Mein Tipp: Funktionen sind eine tolle Erfindung. Bitte nutze sie...
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

Beitragvon ge0matrix » Freitag 25. Januar 2008, 15:34

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.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Beitragvon Python 47 » Freitag 25. Januar 2008, 15:46

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.
mfg

Thomas :-)
Benutzeravatar
Hobbes Hobson
User
Beiträge: 42
Registriert: Sonntag 9. Dezember 2007, 15:24
Wohnort: Bremen

Beitragvon Hobbes Hobson » Freitag 25. Januar 2008, 16:11

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
BlackJack

Beitragvon BlackJack » Freitag 25. Januar 2008, 16:36

@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.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Freitag 25. Januar 2008, 23:56

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.
Benutzeravatar
Hobbes Hobson
User
Beiträge: 42
Registriert: Sonntag 9. Dezember 2007, 15:24
Wohnort: Bremen

Beitragvon Hobbes Hobson » Samstag 26. Januar 2008, 00:23

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 :)
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Samstag 26. Januar 2008, 01:02

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.
Frank aka Ch3ck3r
User
Beiträge: 49
Registriert: Dienstag 13. November 2007, 21:56
Wohnort: Berlin
Kontaktdaten:

Beitragvon Frank aka Ch3ck3r » Samstag 26. Januar 2008, 01:24

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
kostenlose TS2-Server für jeweils 31 Tage:
http://www.ts-onlyfree.de
BlackJack

Beitragvon BlackJack » Samstag 26. Januar 2008, 13:05

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.
ge0matrix
User
Beiträge: 9
Registriert: Sonntag 13. Januar 2008, 16:14

Beitragvon ge0matrix » Samstag 26. Januar 2008, 17:22

wow, die codes sind ziemlich cool geraten! Ich guck sie mir gleich mal an, die sehen echt vielversprechend aus. Danke! :D

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder