Ich habe meinem in Pygame Zero geschriebenen Mazegame, meiner Blaupause für zukünftige Experimente zur Künstlichen Intelligenz, den letzten Anstrich verschafft und ihm ein paar Gegner spendiert, die dem Spieler das Leben schwer machen sollen. Sie werden durch die Klasse Enemy(Actor)
erzeugt:
Diese Klasse unterscheidet sich erst einmal nicht grundlegend von der Spielerklasse. Im Konstruktor bekommt jeder Gegener noch zusätzlich eine Anfangsrichtung ("up"
, "down"
, "right"
, "left"
) und einen Timer zugewiesen, der über die Geschwindigkeit bestimmt, mit der die Gegner durch das Labyrinth gleiten:
self.direction = choice(directions)
self.timer = 0
self.maxtime = randint(5, 10)
Die größte Änderung gibt es in der Methode walk()
, da die Gegner ja nicht durch den Spieler gesteuert werden, sondern selbstständig handeln müssen. Zuerst einmal laufen sie stur geradeaus, lediglich wenn sie auf ein Hindernis stoßen, ändern sie ihre Richtung (hier beispielhaft an der Bewegung nach links gezeigt, die Bewegungen in die drei anderen Richtungen werden identisch abgehandelt):
def walk(self):
if self.direction == "left":
move_to_x = self.xpos - 1
move_to_y = self.ypos
# Kollisionserkennung
if (move_to_x, move_to_y) not in walls_pos:
self.xpos -= 1
self.set_screen_pos()
else:
self.direction = choice(directions)
Das hat allerdings zur Folge, daß – abhängig von der Startposition oder der Kammer des Labyrints, in die der Gegner hineinfällt – das enemy
in einem Bereich des Irrgartens gefangen ist und ihn nicht mehr verlassen kann. Um dies zu verhindern, bekommen die enemies
in der update()
-Methode eine zweiprozentige Wahrscheinlichkeit zugewiesen, mitten im Lauf die Richtung zu wechseln:
def update():
rogue.walk()
for enemy in enemies:
# Zweiprozentige Wahrscheinlichkeit eines Richtungswechsels ohne Kollision
if randint(0, 1000) < 2:
enemy.direction = choice(directions)
enemy.timer += 1
if enemy.timer == enemy.maxtime:
enemy.walk()
enemy.timer = 0
if rogue.colliderect(enemy):
rogue.xpos = 1
rogue.ypos = 1
rogue.set_screen_pos()
print("You died!")
Dadurch wird es dem Spieler schon ganz schön schwer gemacht, ohne einen (tödlichen) Kontakt mit den Gegenern alle drei Schatzkästlein einzusammeln. Um das Spiel nicht zu frustrierend zu gestalten, wird in meiner Version der Spieler bei jedem Kontakt mit einem der Gegner auf die Anfangsposition zurückgesetzt und kann es von hier aus erneut versuchen.
Ich muß gestehen, bei fünf Gegnern habe ich es bisher noch nicht geschafft, ohne mindestens ein reset
durchzukommen. Wie wird das erst aussehen, wenn die Gegner dann auch noch ein Mindestmaß an Intelligenz besitzen?
Aber ein Erfolgserlebnis habe ich mit nach Hause genommen: Ich habe bei der Programmierung des Spiels viel über Pygame Zero gelernt und bin jetzt doch um einiges vertrauter mit dieser Bibliothek. Schaun wir daher einmal, wie es weitergeht.
Die Sprites und Tiles habe ich dem DawnLike-Tileset auf OpenGameArt.org entnommen. Die Lizenz (CC BY 4.0) verlangt zwingend die Namensnennung der Schöpfer DawnBringer und DragonDePlatino. Dem bin ich hiermit pflichtbewußt nachgekommen. Und wie immer findet Ihr den Quellcode und die Assets auch in meinem GitHub-Repositorium.
Über …
Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!
Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.
Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.
Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes
von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.
Werbung
Diese Spalte wurde absichtlich leergelassen!