Achte beim Lesen der Lektion darauf, dass du den Sinn jedes Absatzes erfasst.
Erweitere und teste das Bauernhofspiel schrittweise
wie in der Lektion vorgegeben.
In dieser Lektion zur Programmiersprache Python wird
das Spiel FarmGame erweitert.
In einer Klasse cFarm soll
der Ablauf auf einem Bauernhof implementiert werden.
Programmieren mit Python: FarmGame
Die Klasse cFarm wird als eigener Modul
in der Datei "farm.py" angelegt.
Als Attribut besitzt die Klasse eine Liste self.items
aller vohandenen Objekte,
die von cItem oder einer davon abgeleiteten Klasse,
wie cAnimal, erzeugt wurden.
Nach dem Konstruktor __init__() wird die
Methode __str__() codiert,
welche eine Übersicht über alle Items geben soll.
Die Methode AddItem(self, item) fügt ein item
am Ende der Liste hinzu.
classcFarm: def__init__(self): self.items=[] # return a string for object def__str__(self): # items result=" {:10} {:10} {:>5} {:>5}\n".format('item','name','food','yield') foriteminself.items: result+=str(item)+"\n" result+=" {:10} {}\n".format(type,amount) result+="You have {} resources.".format(len(self.resources)) return(result)
Überprüfe im Modul "items.py",
ob die __str__() Methode der Klasse cItem
auch den Typ des Items ausgibt.
Die Melk-Methode in cDiaryAnimal heißt jetzt
GiveMilk() und
in Stomach() habe ich die Milchproduktion
vor den Verdauungsvorgang gesetzt
(das war ein Fehler im logischen Ablauf).
Fürs Testen definierst du in der Haupdatei "farmgame.py"
eine Prozedure TestFarm(),
die in Main() aufgerufen wird.
Nach dem Erzeugen des Objekts farm
als Instanz der Klasse cFarm
kannst du Tiere und andere Items hinzufügen
sowie die Farm "ausdrucken".
Im nächsten Schritt wird in der Klasse cFarm
eine Methode DailyWork() realisiert,
die insbesondere das tägliche Füttern und Melken automatisiert
-- wie das auf einem modernen Bauernhof eben ist.
Die Methode MilkAnimals() durchläuft dazu die Liste
self.items und sammelt von allen Milchtieren der
Klasse cDairyAnimal mit der Methode GiveMilk()
die Milch ein.
Rückgabewert ist die eingesammelte Milch.
Zum Füttern wird in FeedAnimals() zunächst
das vorhandene Futter für alle Items portioniert.
Anschließend werden -- wieder in einer Schleife über alle Items --
die Tiere (cAnimal) gefüttert.
Das vorhandene Futter wird dabei entsprechend verringert.
Zur Verwaltung des Futters (und anderer Ressourcen) wird in
cFarm ein Dictionary self.resources
hinzugefügt.
Die Eintrage ordnen jedem Ressourcenamen die vorhandene Menge zu.
Die Methode __str__() wird so angepasst,
dass sie nach den Items auch eine Übersicht der Ressourcen
erstellt.
classcFarm: def__init__(self): self.items=[] self.resources={} # return a string for object def__str__(self): # items result=" {:10} {:10} {:>5} {:>5}\n".format('item','name','food','yield') foriteminself.items: result+=str(item)+"\n" result+="You have {} items.\n".format(len(self.items)) # resources result+=' -'*20 \ +"\n {:10} {:10}\n".format('resource','amount') fortypeinsorted(self.resources.keys()): amount=int(self.resources[type]*100)/100 result+=" {:10} {}\n".format(type,amount) result+="You have {} resources.".format(len(self.resources)) defDailyWork(self,store): self.FeedAnimals() milk=self.MilkAnimals() print('You sold ',milk,'units of milk.') defFeedAnimals(self): fodder=self.resources.get('Fodder',0) count=len(self.items) if(count>0): # calculate part for each item part=0.75*fodder/count foriteminself.items: ifisinstance(item,cAnimal): fodder-=item.Feed(part) self.resources['Fodder']=fodder defMilkAnimals(self): milk=0.0 foriteminself.items: ifisinstance(item,cDairyAnimal): milk+=item.GiveMilk() return(int(milk*100)/100)
DailyWork() kann in "farmgame.py" getestet werden.
Damit auch Milch produziert wird, muss zuvor die Ressource Fooder
gefüllt werden.