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.
Mein erstes Programm (Tamagotchi für arme)
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.
Diesmal "nur" 133 Zeilen zum durchkauen...
[Code ins LodgeIt ausgelagert]
Edit (Leonidas): Code ausgelagert.
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
Du solltest versuchen deine Programme kompakter zu schreiben Wie wäre es beim Pychotest zB ein Dic zu machen
und dann einfach via for schleife schauen
Dann sparst du dir viel Platz
SigMA
Code: Alles auswählen
dic={phrase:satz, [..] }
Code: Alles auswählen
if i in text:
print satz
SigMA
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
http://www.leichtdio.de
Außerdem sind alle Daten an einem Platz, was das erweitern des Programms erleichtert...SigMA hat geschrieben:Du solltest versuchen deine Programme kompakter zu schreiben Wie wäre es beim Pychotest zB ein Dic zu machen
und dann einfach via for schleife schauenCode: Alles auswählen
dic={phrase:satz, [..] }
Dann sparst du dir viel PlatzCode: Alles auswählen
if i in text: print satz
-
- 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.
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
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:
Oder gleich '' gl '' mit '' lower() '' in kleinbuchstaben umwandeln:
MfG EnTeQuAk
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!")
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!")
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.
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]
las mal überlgen .. lower() macht alles klein .. wie wäre es mit
SigMA
Code: Alles auswählen
"test".upper()
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
http://www.leichtdio.de
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:
Wenn man jetzt die Startdaten für die Kreaturen alle in eine Datenstruktur steckt, dann kann man die ganzen ``if``-Abfragen weglassen:
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:
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
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
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
MfG
swm
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
MfG
swm
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
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*^^
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
http://www.leichtdio.de
Wo ist da die for-schleife?Code: Alles auswählen
if i in text: print satz
Hier sind die Kreaturen ja wieder als ListeCode: 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]))
ein bisschen objektorientierte programmierung kann ich, also hab ich nicht 0 Ahnung, sondern etwa 15
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.
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:
irgendwie sind "i" und "satz" nicht definiert, oder stehen die für was anderes?
:K
auf Hilfe hoffend
swm
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
:K
auf Hilfe hoffend
swm
[img]http://www.danasoft.com/sig/HalloMoin.jpg[/img]
Da würde ich eher eine Liste bzw. ein Tupel benutzen. Die Worte treten ja nicht isoliert auf, sondern sind irgendwo im eingegebenen Satz.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...
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...'