Mein erstes Programm (Tamagotchi für arme)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
swm
User
Beiträge: 14
Registriert: Donnerstag 21. Dezember 2006, 20:31

Hi
Ich habe mich jetzt die letzten zwei Wochen mit Python beschäftigt und mal ein kleines Textbasiertes Spiel programmiert.
Ich nehme gerne Vorschläge zur Verbesserung oder Kritik entgegen.
(Falls jemand Zeit und Lust hat, ca 250 Zeilen Code zu lesen :? )

O.K hier der Code:
[Code ins LodgeIt ausgelagert]

Ich weiß, das dieses Spiel weder ausgereift oder Spannend ist. :)

Edit (Leonidas): Code ausgelagert.
Zuletzt geändert von swm am Donnerstag 28. Dezember 2006, 17:36, insgesamt 1-mal geändert.
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
Benutzeravatar
swm
User
Beiträge: 14
Registriert: Donnerstag 21. Dezember 2006, 20:31

Hier noch ein kleines Programm das ich mal in zwei Stunden gemacht hab:
Diesmal "nur" 133 Zeilen zum durchkauen...
[Code ins LodgeIt ausgelagert]

Edit (Leonidas): Code ausgelagert.
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
Benutzeravatar
SigMA
User
Beiträge: 181
Registriert: Sonntag 4. April 2004, 13:27
Wohnort: Freiburg
Kontaktdaten:

Du solltest versuchen deine Programme kompakter zu schreiben ;) Wie wäre es beim Pychotest zB ein Dic zu machen

Code: Alles auswählen

dic={phrase:satz, [..] }
und dann einfach via for schleife schauen

Code: Alles auswählen

if i in text:
    print satz
Dann sparst du dir viel Platz :)

SigMA
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
lunar

SigMA hat geschrieben:Du solltest versuchen deine Programme kompakter zu schreiben ;) Wie wäre es beim Pychotest zB ein Dic zu machen

Code: Alles auswählen

dic={phrase:satz, [..] }
und dann einfach via for schleife schauen

Code: Alles auswählen

if i in text:
    print satz
Dann sparst du dir viel Platz :)
Außerdem sind alle Daten an einem Platz, was das erweitern des Programms erleichtert...
Benutzeravatar
swm
User
Beiträge: 14
Registriert: Donnerstag 21. Dezember 2006, 20:31

Gut, mach ich.
Danke. :D
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Warum steht bei dir "ochter" statt "Tochter", "chmerz" statt "Schmerz" etc?

Irgendwie vermute ich, dass du die Groß und Kleinschreibung umgehen willst. Aber dazu nutzt mann wenn dann gl = gl.lower() und damit ist das Problem besser gelöst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

hmm... ma su blß kurtz drübergeschaut... aber versucht du mit oben erwähnten die Groß-Kleinschreibung der Anfangsbuchstaben zu "überbrücken"?

hierfür gäbe es ganz einfach:

Code: Alles auswählen

print "Erzählen sie mir von ihren Problemen"
gl = raw_input()
if len(gl) > 80:
  vc = raw_input("Sie schreiben sehr viel! Sind sie gerne Kreativ?")
if "tochter" in gl.lower(): ### gl.lower() macht alle Buchstaben zu kleinbuchstaben
    x = raw_input("Aha, ihre Tochter. Erzählen sie mehr!")
Oder gleich '' gl '' mit '' lower() '' in kleinbuchstaben umwandeln:

Code: Alles auswählen

print "Erzählen sie mir von ihren Problemen"
gl = raw_input()
gl = gl.lower()   ### gl.lower() macht alle Buchstaben zu kleinbuchstaben
if len(gl) > 80:
  vc = raw_input("Sie schreiben sehr viel! Sind sie gerne Kreativ?")
if "tochter" in gl:
    x = raw_input("Aha, ihre Tochter. Erzählen sie mehr!")
MfG EnTeQuAk
Benutzeravatar
swm
User
Beiträge: 14
Registriert: Donnerstag 21. Dezember 2006, 20:31

Gut, mach ich.

Ich bin echt froh das gleich so viele Leute gute Vorschläge gepostet haben!
Habe das hier ja gerade deswegen reingestellt...
*Dickes Lob*

MfG
swm

PS
Nur so aus Interesse, gibt es auch eine Anweisung die alle Buchstaben zu Großbuchstaben macht?

Falls ich euch mit diesen Anfängerfragen nerve, sorry, ich bin nun mal ein newbie.
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
Benutzeravatar
SigMA
User
Beiträge: 181
Registriert: Sonntag 4. April 2004, 13:27
Wohnort: Freiburg
Kontaktdaten:

las mal überlgen .. lower() macht alles klein .. wie wäre es mit

Code: Alles auswählen

 "test".upper()
SigMA ;)
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst auch selbst schauen was dein String so kann: print dir(gl) wo neben lower() auch upper() dabei ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Und noch ein bisschen Kritik:

Das erste Programm ist ziemlich linear runtergeschrieben und enthält eine Menge redundanten Quelltext.

Wo kommt eigentlich diese Unart her `pickle` oder `cPickle` als `p` zu importieren? Das habe ich hier im Forum jetzt schon öfter gesehen. IMHO ist `p` als modulweit sichtbarer Name viel zu kurz und nichtssagend.

``global`` auf Modulebene hat keinen Effekt. Und ausserdem sollte man ``global`` möglichst nicht verwenden.

Was genau macht `show`? Ein paar erklärende Kommentare wären eventuell nicht schlecht.

Nochmal zu kurzen, nichtssagenden Namen: `kreat` heisst wohl `kreatur`. Das kann man sich noch denken. Aber bei `aa`, `ab` oder `trsh` (Trash?) hört's dann auf.

So eine Kreatur sollte man als Objekt und nicht als Liste verwalten. So muss man sich immer merken was die Zahlen bedeuten. Das macht den Quelltext schwerer zu verstehen und Änderungen sind fehleranfälliger. ``kreatur.gesundheit`` ist viel aussagekräftiger als ``kreatur[3]``.

``random.choice(range(a, b))`` kann man einfacher als ``random.randrange(a, b)`` schreiben, wobei diese Funktion sehr wahrscheinlich nicht immer eine Liste mit allen Zahlen von `a` bis `b` anlegt.

Das ganze Programm liesse sich wesentlich verkürzen, wenn die vielen ``if``-Abfragen, bei denen immer fast das gleiche gemacht wird, nicht wären. Man kann die gemeinsamen Daten dort herausziehen und auch gleich für die Menüs verwenden.

Zum Beispiel könnte man eine Menüfunktion schreiben, die einen Titel, eine Liste mit Auswahlmöglichkeiten und einen Text für `raw_input()` bekommt und den Benutzer eine Möglichkeit mit Eingabe einer Zahl wählen lässt. Rückgabewert ist der Index der Auswahlmöglichkeit in der Liste:

Code: Alles auswählen

def menu(title, choices, prompt):
    """Text menu with given `title`, offereing `choices`.
    
    Returns the index of the choice selected by the user.
    """
    print title
    result = 0
    for i, text in enumerate(choices):
        print '%d - %s' % (i + 1, text)
    while not 0 < result <= len(choices):
        try:
            result = int(raw_input(prompt))
        except ValueError:
            pass
    return result - 1

Wenn man jetzt die Startdaten für die Kreaturen alle in eine Datenstruktur steckt, dann kann man die ganzen ``if``-Abfragen weglassen:

Code: Alles auswählen

def main():
    # 
    # Kreaturdaten als Tupel mit drei Elementen:
    # 
    #   1. Name und Schwierigkeitsgrad als Zeichenkette (für's Menü).
    #   2. Startkapital.
    #   3. Liste mit Startwerten für die Kreatur.
    # 
    kreaturen = (('Hamsipihr (Total einfach)', 60000,
                  [100, 100, 100, 100, 0, 100]),
                 ('Reggi     (leicht)', 50000,
                  [80, 80, 40, 160, 10, 80]),
                 # ...
                 ('Zvälli    (Zufall)', random.randrange(1000, 11000, 100),
                  [90, 90, random.randrange(40, 200), random.randrange(0, 5),
                   0, 90]))
    
    index = menu('KREATUREN:',
                 [item[0] for item in kreaturen],
                 'Wählen sie eine Kreatur:')
    
    dummy, geld, kreatur = kreaturen[index]
    print geld, kreatur
Jetzt lassen sich diese Daten ganz einfach an einer Stelle im Quelltext ändern und problemlos um weitere Kreaturen erweitern. Das lässt sich mit den anderen Fragmenten dieser Art ähnlich lösen.

Die ganzen Abfragen ob das Tier tot ist, lassen sich zu einer Zusammenfassen:

Code: Alles auswählen

    if kreat[0] <= 0 or kreat[1] <= 0 or kreat[3] <= 0 or kreat[5] <= 0:
        print"Deine Kreatur ist gestorben!"
        break
Benutzeravatar
swm
User
Beiträge: 14
Registriert: Donnerstag 21. Dezember 2006, 20:31

Ich bin immer offen für Kritik, nur keine Hemmungen.
Ich glaube das mit cPickle stammt aus einem weit verbreiteten Tutorial.
trsh bedeutet nicht "Trash" sondern ist nur ein zufälliger Name. Auch diesbezüglich werde ich mich sicher bessern.
Ich habe Listen benutzt weil ich mit Objekten noch nich so gut klarkomme.
Ich könnte zwar alles irgendwo abschreiben oder so, aber ich habe nicht gerne Code in meinem Programm, den ich selber nicht 100% verstehe.

Heute mache ich aber nichts mehr, sondern lege mich lieber vorn Kamin :lol:

MfG
swm
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
Benutzeravatar
SigMA
User
Beiträge: 181
Registriert: Sonntag 4. April 2004, 13:27
Wohnort: Freiburg
Kontaktdaten:

Du solltest auf jeden Fall versuchen dir Objekt Orientierte Programmierung anzugewöhnen. Wenn du davon noch 0 Ahnung hast kann ich dir "Python 4 Kids" von Gregor Lindl (ich glaube so heißt er) empfehlen. Dort ist das prima für DAUs (er nennt es Kinder) erklärt.

SigMA

PS: Das mit dem Kamin wäre eine gute Idee, wenn man einen hätte *grml*^^
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
Benutzeravatar
swm
User
Beiträge: 14
Registriert: Donnerstag 21. Dezember 2006, 20:31

Code: Alles auswählen

if i in text:
    print satz

Wo ist da die for-schleife?

Code: Alles auswählen

kreaturen = (('Hamsipihr (Total einfach)', 60000,
                  [100, 100, 100, 100, 0, 100]),
                 ('Reggi     (leicht)', 50000,
                  [80, 80, 40, 160, 10, 80]),
                 # ...
                 ('Zvälli    (Zufall)', random.randrange(1000, 11000, 100),
                  [90, 90, random.randrange(40, 200), random.randrange(0, 5),
                   0, 90]))
Hier sind die Kreaturen ja wieder als Liste :shock:
ein bisschen objektorientierte programmierung kann ich, also hab ich nicht 0 Ahnung, sondern etwa 15 :P
Und ja, ich habe tatsächlich versucht, die Groß/Kleinschreibung zu überbrücken.
Ich schreibe jetzt erst mal ein Therapeuten-Dic (kann ein bisschen dauern).

Wer Rechtschreibfehler findet, darf sie behalten.

MfG
swm
Zuletzt geändert von swm am Freitag 29. Dezember 2006, 16:28, insgesamt 2-mal geändert.
Benutzeravatar
swm
User
Beiträge: 14
Registriert: Donnerstag 21. Dezember 2006, 20:31

Irgendwie funktioniert das mit dem dic nich :(
Ich hab ein Dic nach diesem Muster erstellt:
{"Wort, auf das er reagieren soll" : "Text, den er sagt, wenn das Wort erwähnt wurde, ...}
Irgendwie scheint das falsch zu sein...
Oder liegt es an:

Code: Alles auswählen

if i in text:
    print satz
irgendwie sind "i" und "satz" nicht definiert, oder stehen die für was anderes?
:K
auf Hilfe hoffend
swm
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
BlackJack

swm hat geschrieben:Irgendwie funktioniert das mit dem dic nich :(
Ich hab ein Dic nach diesem Muster erstellt:
{"Wort, auf das er reagieren soll" : "Text, den er sagt, wenn das Wort erwähnt wurde, ...}
Irgendwie scheint das falsch zu sein...
Da würde ich eher eine Liste bzw. ein Tupel benutzen. Die Worte treten ja nicht isoliert auf, sondern sind irgendwo im eingegebenen Satz.

Code: Alles auswählen

def main():
    words_and_answers = (('wort', 'antwortsatz 1'),
                         # ...
                         ('nochnwort', 'antwortsatz 2'))
    
    user_input = raw_input('Los, sach wat: ').lower()
    
    for word, answer in words_and_answers:
        if word in user_input:
            print answer
            break
    else:
        print 'Keen Wort jefunden...'
Oder Du nimmst doch ein Dictionary und zerlegst den Eingabesatz in Einzelworte und suchst diese im Dictionary. Allerdings findest Du dann nur ganze Worte und keine Teilworte. Je nachdem was Du erreichen willst.
Benutzeravatar
swm
User
Beiträge: 14
Registriert: Donnerstag 21. Dezember 2006, 20:31

OK, danke :D
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
Antworten