Meine kleine Simulation

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
seiby
User
Beiträge: 13
Registriert: Samstag 30. April 2011, 05:50

Hallo,
Ich habe vorgestern mit python angefangen.
Hier mal mein erstes Spiel:
Es geht darum, möglichst viel Geld zu verdienen (ich setze mich gleich nach dem Beitrag hin und baue ein wählbares Zeitlimit ein).
In der Zeit sollte man aber auch nicht sterben, deshalb muss man essen und trinken.
Man kann wahlweise Geld bei der Bank anlegen und/oder arbeiten gehen.
Man hat pro Tag 10 Aktionspunkte; sind diese verbraucht (durch arbeiten oder einkaufen) muss man auf den nächsten Tag warten.
Vielleicht kann sich jemand ja mal den Quelltext ansehen und mir Tipps geben, was ich besser machen kann.

Edit: Wenn man pleite, verhungert oder verdurstet ist, ist das Spiel vorbei.
Edit²:Ich habe noch nicht ganz raus wie ich die Werte aus der save.dat wieder in die Variablen setze, wenn da einer helfen könnte?

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

konto = 100.00
bier = 10.00
chips = 0.50
brot = 2.00
wasser = 5.00
zinsen = 2.00
bank = 10.00
hunger = 0.00
durst = 0.00
punkte = 10.00
ze = 0
liste = "1) Wasser - Kosten: 5€\n2) Brot - Kosten: 2€\n3) Chips - Kosten: 0.5€\n4) Bier - Kosten: 10€\n5) Status\n6) Bank\n7) Bis Morgen warten\n8) Arbeiten\n9) Optionen\n0) Speichern/Laden"


print "Herzlich Willkommen!\n", liste
while konto != 0 and hunger < 10 and durst < 10.0:
    wahl = input("Wählen sie einen Punkt aus.\n")

    if wahl == 1 and punkte >= 1:
        print "Sie haben 1 Kasten Wasser gekauft."
        konto -= wasser
	durst -= 0.5
	punkte -= 1
        print "Ihr Guthaben beträgt", konto,"€."
	print "Sie haben", durst, "Durstpunkte."
    elif wahl == 2 and punkte >= 1:
        print "Sie haben 1 Laib Brot gekauft."
	hunger -= 1
        konto -= brot
	punkte -= 1
        print "Ihr Guthaben beträgt", konto,"€."
	print "sie haben", hunger, "Hungerpunkte."
    elif wahl == 3 and punkte >= 1:
        print  "Sie haben 1 Tüte Chips gekauft."
	hunger -= 0.25
        konto -= chips
	punkte -= 1
        print "Ihr Guthaben beträgt", konto,"€."
	print "sie haben", hunger, "Hungerpunkte."
    elif wahl == 4 and punkte >= 1:
        print "Sie haben 1 Kasten Bier gekauft."
        konto -= bier
	durst -= 1
	punkte -= 1
        print "Ihr Guthaben beträgt", konto,"€."
	print "Sie haben", durst, "Durstpunkte."
    elif wahl == 5:
        print "Ihr Guthaben beträgt", konto,"€."
        print "Ihr Bankguthaben beträgt", bank, "€."
        print "Sie haben", hunger, "Hungerpunkte."
        print "Sie haben", durst, "Durstpunkte."
        print "Sie haben", punkte, "Aktionspunkte."
    elif wahl == 6:
        print "Ihr Bankguthaben beträgt", bank, "€."
        auswahl = input("Wollen sie Geld einzahlen (1) oder auszahlen (2)?\nDrücken sie 0 um abzubrechen")
        if auswahl == 1:
            einzahlung = input("Wie viel Geld wollen sie einzahlen?")
            if einzahlung > konto:
                print "Sie besitzen nicht so viel Geld."
            else:
                bank += einzahlung
                print "Ihr Geld wurde eingezahlt."
        elif auswahl == 2:
            auszahlung = input("Wie viel wollen sie ausbezahlt bekommen?")
            if auszahlung > bank:
                print "Sie besitzen nicht so viel Geld."
            else:
                bank -= auszahlung
                print "Ihr Geld wurde ausgezahlt."
        elif auswahl == 0:
            print "Abgebrochen."
        else:
            print "Ungültige Eingabe."
    elif wahl == 7:
		hunger += 1
		durst += 1		
		print "Guten Morgen! Sie haben", hunger, "Hungerpunkte und", durst, "Durstpunkte."
                bank *= (1 + zinsen / 100)
                ze = 10 - punkte
                punkte += ze
    elif wahl == 8:
		print "Wollen sie 1 Stunde für 5€ arbeiten oder 2 Stunden für 10€?"
		arbeit = input("Drücken sie 1 oder 2:    ")		
		if arbeit > 2 and arbeit < 1:
			print "Ungültige Eingabe"
		elif arbeit == 1 and punkte >= 2:
			konto += 5
			punkte -= 2
		elif arbeit == 2 and punkte >= 4:
			konto += 10
			punkte -= 4
		else:
			print "Sie haben nicht mehr genügend Aktionspunkte."
    elif wahl == 9:
        print liste
    elif wahl == 0:
       sol = input("Wollen sie speichern oder laden?(1/2)\n")
       if sol == 1:
           datei = open("save.dat", "w")
           datei.write('%s;%s;%s;%s;%s\n' % (konto, bank, punkte, hunger, durst))
           datei.close()
       else:
           #datei = open("save.dat","r")
           print "Derzeit nicht möglich"
    elif punkte == 0:
        print "Sie haben nicht mehr genügend Aktionspunkte."
    else:    
        print  "Ungültige Eingabe" 
if konto <= 0 :  
	print "Sie sind pleite."
elif hunger >= 10:
	print "Sie sind verhungert."
else:
	print "Sie sind verdurstet."  
Zuletzt geändert von Anonymous am Samstag 30. April 2011, 18:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
joshi
User
Beiträge: 8
Registriert: Sonntag 30. November 2008, 17:26

Hi,

Wenn ich ein wenig Kritik äußern dürfte:
Du solltest immer 4 Leerzeichen pro Einrückungsebene benutzen um es anderen leichter zu machen, dein Programm zu editieren.

Außerdem solltest du generell immer raw_input() für die Eingaben verwenden. Denn sonst hast du in diesem Fall gleich "Cheats" mit eingebaut.
Probier doch das mal als Eingabe aus : :wink:

Code: Alles auswählen

globals().__setitem__("konto", 10000.0)
Für das speichern könntest du das Modul `pickle` verwenden.
seiby
User
Beiträge: 13
Registriert: Samstag 30. April 2011, 05:50

Zu den 4 Leerzeichen:
Ich hab das in gedit geschrieben, und am Anfang auch immer tab auf 4 gestellt.
Zwischendrin wohl einmal vergessen und dann hats sich das so ergeben.
So den wahren Editor habe ich für Linux noch nicht gefunden, mir würde etwas in die Richtung von notepad ++ gefallen.
Den gibts nur nicht für Linux und auf Wine habe ich ehrlich gesagt wenig Lust.

@ Cheat:
Wow, das wusste ich nicht :D
also einfach vor jedes input ein raw_ setzen?

@pickle:
ich habe von Modulen nicht so die riesen Ahnung, ich frag gleich mal google.

Danke soweit.
Wenn du noch Ideen hast (ich habe vor noch eine Art Highscore, evt. später sogar online mit ner datei auf nem ftp-server zu bauen) nehme ich sie gerne an.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

seiby hat geschrieben:@pickle:
ich habe von Modulen nicht so die riesen Ahnung, ich frag gleich mal google.
Dann brauchst und solltest du gar nicht den Umweg über eine Suchmaschine gehen. Fang hier an und dann arbeite einmal das Tutorial ab.

pickle findest du in der Standard Library.
joshi
User
Beiträge: 8
Registriert: Sonntag 30. November 2008, 17:26

seiby hat geschrieben:Zu den 4 Leerzeichen:
Ich hab das in gedit geschrieben, und am Anfang auch immer tab auf 4 gestellt.
Zwischendrin wohl einmal vergessen und dann hats sich das so ergeben.
So den wahren Editor habe ich für Linux noch nicht gefunden, mir würde etwas in die Richtung von notepad ++ gefallen.
Den gibts nur nicht für Linux und auf Wine habe ich ehrlich gesagt wenig Lust.
Schau doch mal hier: http://www.python-forum.de/viewtopic.php?f=21&t=3544
seiby hat geschrieben:@ Cheat:
Wow, das wusste ich nicht :D
also einfach vor jedes input ein raw_ setzen?
Nicht ganz. `input` führt die Eingabe als Python-Ausdruck aus, `raw_input` liefert einen String. Diesen String musst du erstmal mit int() in eine Zahl umwandeln. Einfach mal das offizielle Tutorial durcharbeiten.

Edit: /me war schneller
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Der nächste Schritt wäre jetzt, den Code so zu ändern, dass du nicht für jeden Artikel eine eigene Variable und eine eigene if/else-Abzweiung hast, sondern die ganzen Artikel mit Preisen in geeignete Datenstrukturen (Listen, Dictionaries und was es noch so gibt) packst und dann die if/else-Kaskade loswirst.
jf5401
User
Beiträge: 8
Registriert: Montag 8. März 2010, 17:48
Kontaktdaten:

Nicht schlecht.
ABer du musst auf jeden Fall deinen Code überarbeiten und übersichtlicher gestalten.
Außerdem das weiter ober schon angsprochene input/raw_input, weil mir ist grad passiert,
dass ich Enter gedrückt und das Prog is abgeschmiert.

Ansonsten ein super anfang.
seiby
User
Beiträge: 13
Registriert: Samstag 30. April 2011, 05:50

Teste ich gleich mal.
Hatte in letzter Zeit keine Zeit für python, hab jetzt mal mit dem Tut angefangen.
Was ich nicht verstehe:

Code: Alles auswählen

>>> # Measure some strings:
... a = ['cat', 'window', 'defenestrate']
>>> for x in a:
...     print x, len(x)
...
cat 3
window 6
defenestrate 12
Ist x denn keine Variable die vorher definiert werden muss?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

seiby hat geschrieben:

Code: Alles auswählen

>>> # Measure some strings:
... a = ['cat', 'window', 'defenestrate']
>>> for x in a:
...     print x, len(x)
...
cat 3
window 6
defenestrate 12
Ist x denn keine Variable die vorher definiert werden muss?
nö. in Python gibt's sowas nicht. Du musst niemals Variablen deklarieren, bevor du ihnen eine Wert zuweist (in `for x in y` ist eine Wertzuweisung an x).
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

x wird hier bei jedem Schleifendurchlauf "definiert".
Die Begriffe "Variablen" und "definieren" sind in Python vielleicht irreführend.
Beim ersten Schleifendurchlauf wird ein String-Objekt mit Inhalt 'cat' erzeugt und an den Namen x gebunden.
Beim zweiten Durchlauf wird ein String-Objekt mit Inhalt 'window' erzeugt und wiederum an den Namen x gebunden.
Das alte Objekt ist dann für Dich nicht mehr erreichbar und kann zu einem von Dir nicht voraussagbaren Zeitpunkt vom Garbage Collector entsorgt werden. Daher funktioniert auch folgender Inhalt von a:

Code: Alles auswählen

a = ['cat', u'fünf', 5]
Antworten