4
11
Schießen und treffen
class Huhn(Turtle):
...
def raus(self):
x, y = self.position()
return x > 340 or abs(y) > 250
Wenn
abs(y)
, der Betrag der y-Koordinate des Huhns größer als 250 ist,
ist es entweder oben oder unten raus!
Hier siehst du erstmals, dass logische Ausdrücke wie
x > 340
und
abs(y)
> 250
mit logischen Operatoren verbunden werden können. Verwendest du
or
(oder), dann muss mindestens einer der beiden Teilausdrücke wahr sein,
damit der ganze Ausdruck wahr ist. Verwendest du
and
(und), dann müssen
es beide sein.
Damit ergänzen wir die
while
-Schleife in
spiel()
:
# Ausführung
while self.schuesse < 5:
for huhn in self.huehner:
huhn.schritt()
if huhn.raus():
huhn.zumstart()
...
>
Teste das Spiel. Wenn es funktioniert, speichere eine Kopie als
moor-
huhn02.py
ab.
Es sollte funktionieren wie die Fassung 1: Nach Druck auf die Leertaste
startet das Spiel. Du schießt fünf Mal und das Spiel ist aus. Währenddessen
werden nun nicht mehr Sternchen ausgegeben, sondern die beiden Moor-
hühner fliegen unaufhörlich über das Spielfeld, unberührt von deinen
Mausklicks. Das wollen wir nun ändern.
Schießen und treffen
Zunächst sorgen wir dafür, dass die Hühner die Mausklicks spüren:
0
Unsere Moorhühner müssen sterben, wenn sie einen Treffer erhalten.
Eine Methode
getroffen()
, die an Mausklicks auf die Hühner gebun-
den wird, kann das erledigen.
4
12
Moorhuhn
Kapitel
15
Diese Methode
getroffen()
der Klasse
Huhn
ist besonders einfach: Wir
setzen das Attribut
tot
auf wahr, also
True
.
class Huhn(Turtle):
...
def getroffen(self, x, y):
self.tot = True
In der
MoorhuhnSpiel.spiel()
-Methode können wir diese Methode an
Mausklicks auf die Hühner (Turtles) binden:
def spiel(self):
...
for huhn in self.huehner:
huhn.zumstart()
huhn.onclick(huhn.getroffen)
# Ausführung:
...
Jetzt können wir – wie weiter vorn gezeigt – die toten Hühner auf Parabel-
bahnen zu Boden fallen lassen. Das erfordert eine Einfügung in der
Huhn.schritt()
-Methode, die die Fallgeschwindigkeit (in y-Richtung)
erhöht:
def schritt(self):
if self.tot:
self.vy = self.vy - 0.25
x, y = self.position()
x = x + self.vx
y = y + self.vy
self.goto(x,y)
>
Füge die neuen Codezeilen aus den letzten Listings ein und teste das
Spiel. Stürzen die getroffenen Hühner zu Boden? Vielleicht bist du (so
wie ich) nicht besonders geschickt und die Vögel fliegen dir zu
schnell? Dann nimm für
self.vx
und
self.vy
in
schritt()
klei-
nere Zahlenwerte.
Es sollte nun noch mitgezählt werden, wie viele Hühner getroffen wurden.
Dazu führen wir in der Klasse
MoorhuhnSpiel
ein Attribut
treffer
ein,
das zu Beginn eines Spiels auf null gesetzt und jedes Mal, wenn ein Huhn
4
13
Schießen und treffen
getroffen wird, um eins erhöht wird. Damit kann am Ende die Anzahl der
erzielten Treffer ausgegeben werden.
0
Der erste Teil dieser Ergänzung ist äußerst einfach: Wir setzen im Initia-
lisierungsteil von
spiel()
ein Attribut
treffer
auf den Wert 0.
...
self.schuesse = 0
self.treffer = 0
for huhn in self.huehner:
...
0
Nun müssen aber auch noch die getroffenen Hühner dieses Attribut der
Klasse
Moorhuhnspiel
erhöhen. Dazu müssen sie diese Klasse kennen.
Das erreichen wir so, dass wir ihnen schon bei der Erzeugung das Moor-
huhnspiel selbst – eigentlich: einen Verweis darauf – als Argument
übergeben:
class Huhn(Turtle):
"""...
"""
def __init__(self, bilddatei, moorhuhnspiel):
Turtle.__init__(self, shape=bilddatei)
self.spiel = moorhuhnspiel
self.hideturtle()
Nun müssen wir aber auch noch tatsächlich das
MoorhuhnSpiel
selbst
als
Argument bei der Erzeugung der Hühner einsetzen:
class MoorhuhnSpiel:
def __init__(self):
...
# Die Moorhühner
self.huehner = (Huhn("huhn01.gif", self),
Huhn("huhn02.gif", self))
Insgesamt nicht viel Arbeit, aber sehr wirksam. Nun hat jedes Huhn über
self.spiel
Zugriff auf alle Attribute des Moorhuhnspiels. Wir nützen
dies aber nur für das Attribut
treffer
. Eine einfache und naheliegende
Idee ist folgende:
def getroffen(self, x, y):
self.tot = True
self.spiel.treffer = self.spiel.treffer + 1

Get Python für Kids now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.