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