Informatik Wpf 7 20201110

2007, 2024 Oskar Wagner

| Start | Education | Fernunterricht | Informatik Wpf 7
$$ \def\Forall{\enskip \forall} \def\forthat{\;\bigm|\;} \def\hateq{\mathrel{\widehat{=}}} \def\hint#1{\quad\color{maroon}{\small\textit{#1}}} \def\stx#1{\small\textrm{#1}} \def\guide#1{\quad{\stx{#1}}} \def\ol#1{\overline{#1}} \def\lraq{ \quad\leftrightarrow\quad } \def\Lraq{ \quad\Leftrightarrow\quad } \def\ra{ \,\rightarrow\, } \def\raq{ \quad\rightarrow\quad } \def\Ra{ \,\Rightarrow\, } \def\Raq{ \quad\Rightarrow\quad } \def\ux#1{\;\textrm{#1}} \newcommand\m[1][]{#1\ux{m}} \newcommand\mm[1][]{#1\ux{mm}} \newcommand\cm[1][]{#1\ux{cm}} \newcommand\km[1][]{#1\ux{km}} \newcommand\qm[1][]{#1\ux{m}^2} \newcommand\cel[1][]{#1\,^\circ\textrm{C}} \newcommand\deg[1][]{#1\,^\circ} \newcommand\eur[1][]{#1\ux{€}} \newcommand\pct[1][]{#1\,\%} \newcommand\prm[1][]{#1\,{}^\text{o}\mkern-5mu/\mkern-3mu_\text{oo}} $$

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.

# -*- coding: iso-8859-15 -*-
# --------------------------------------------------------------
# 20.10.2020  ow  /  farm.py  /  python
#

import uselib, publib

from items import cAnimal, cDairyAnimal


class cFarm:
  
  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')
    for item in self.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).

Hier ist der vollständige Quellcode: items.py

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".

# -*- coding: iso-8859-15 -*-
# --------------------------------------------------------------
# 13.03.2018  ow  /  farmgame.py  /  python
#

from items import cItem, cAnimal, cDairyAnimal
from farm import cFarm


def TestFarm():
  farm = cFarm()
  farm.AddItem(cDairyAnimal('Cow', 'Berta', 80, 25))
  farm.AddItem(cDairyAnimal('Cow', 'Rosi', 70, 20))
  farm.AddItem(cAnimal('Dog', 'Wuffi', 2))
  farm.AddItem(cItem('Car', 'Rostschüssel'))
  print(farm)


def Main():
  print("!  Farmgame  !")
  #TestAnimals()
  TestFarm()

Main()

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.

class cFarm:
  
  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')
    for item in self.items:
      result += str(item) +"\n"
    result += "You have {} items.\n".format(len(self.items))
    # resources
    result += ' -' * 20  \
      + "\n {:10} {:10}\n".format('resource', 'amount')
    for type in sorted(self.resources.keys()):
      amount = int(self.resources[type]*100)/100
      result += " {:10} {}\n".format(type, amount)
    result += "You have {} resources.".format(len(self.resources))
    
    
  def DailyWork(self, store):
    self.FeedAnimals()
    milk = self.MilkAnimals()
    print('You sold ', milk, 'units of milk.')
    
  def FeedAnimals(self):
    fodder = self.resources.get('Fodder', 0)
    count = len(self.items)
    if (count > 0):
      # calculate part for each item
      part = 0.75*fodder/count
      for item in self.items:
        if isinstance(item, cAnimal):
          fodder -= item.Feed(part)
      self.resources['Fodder'] = fodder
      
  def MilkAnimals(self):
    milk = 0.0
    for item in self.items:
      if isinstance(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.

def TestFarm():
  farm = cFarm()
  farm.AddItem(cDairyAnimal('Cow', 'Berta', 80, 25))
  farm.AddItem(cDairyAnimal('Cow', 'Rosi', 70, 20))
  farm.AddItem(cAnimal('Dog', 'Wuffi', 2))
  farm.AddItem(cItem('Car', 'Rostschüssel'))
  farm.resources['Fodder'] = 300
  print(farm)
  farm.DailyWork()

Aufgaben

Erweitere und teste das Bauernhofspiel wie beschrieben.

Rückfragen bitte per eMail.