GameGrid: Spielprogrammierung mit Java

Entwicklungsprojekt PHBern  
HomeStart Online-EditorDruckenJava-Online

Intelligenter Kobold

Es ist einfach, den Akteuren eine Spielstrategie mitzugeben, die sie sogar lernfähig macht. Im folgenden Beispiel bewegt sich eine Pacman-ähnliche Spielfigur in einem eindimensionalen Gitter. Der Benutzer kann mit einem Mausklick Kraftpillen in die Zellen legen, die Kobold beim Zusammentreffen schluckt. Auch Pillen haben ein Eigenleben, indem sie nach einer vorgebbaren Zeit „verfallen“, dabei ihre positive Wirkung verlieren und giftig werden. Schluckt der Kobold eine giftige Pille, so wird er krank. Es gibt drei Pillenfarben: Beim Start des Spiels wird die Farbe der „gesunden“ Pille zufällig gewählt. Beim Verfall der Pille erhält die Pille die nächstfolgende Pillenfarbe. Damit sind die Farben der gesunden und verfallenen Pille zufällig und dem Kobold beim Programmstart unbekannt.

Beispiel zeigen

Beispiel im Online-Editor bearbeiten

Programmcode

// KoboldApp.java

import ch.aplu.jgamegrid.*;
import java.awt.*;

public class KoboldApp extends GameGrid implements GGMouseListener
{
  // random id of bad pill
  private final int idStart = (int)(Math.random() * 3);

  public KoboldApp()
  {
    super(10, 1, 60, Color.red, false);
    setSimulationPeriod(600);
    addActor(new Kobold(), new Location(0, 0));
    addMouseListener(this, GGMouse.lPress);
    show();
    doRun();
  }

  public boolean mouseEvent(GGMouse mouse)
  {
    Location location = toLocationInGrid(mouse.getX(), mouse.getY());
    if (getOneActorAt(location) == null) // Empty cell
    {
      Pill pill = new Pill(idStart);
      addActor(pill, location);
      pill.show(idStart);
      setPaintOrder(Kobold.class);
      setActOrder(Kobold.class);
      refresh();
    }
    return true;
  }

  public static void main(String[] args)
  {
    new KoboldApp();
  }
}

// ---------------- class Kobold ----------------
class Kobold extends Actor
{
  private Color badPillColor = null;  // Kobold's memory

  public Kobold()
  {
    super("sprites/kobold.gif"3);
  }

  public void act()
  {
    show(0);  // Kobold with open mouth
    Pill pill = (Pill)(gameGrid.getOneActorAt(getLocation(), Pill.class));
    if (pill != null && !isPillBad(pill))
      eatPill(pill);
    else
      step();
  }

  private void eatPill(Pill Pill)
  {
    // Remember the pill color
    Color pillColor = Pill.getPixelColor(new Point(20, 20));
    // Let the pill take effect
    Pill.work(this);
    // Test the result
    if (getIdVisible() == 2)    // Kobold got ill
      badPillColor = pillColor; // Save the color of bad pill
                                // e.g. "learn", which is bad
    else  // Kobold remained healthy
      show(1); // Close the mouse
  }

  private void step()
  {
    if (!isMoveValid())
    {
      turn(180);
      setHorzMirror(!isHorzMirror());
    }
    move();
  }

  private boolean isPillBad(Pill pill)
  {
    return pill.getPixelColor(new Point(20, 20)).equals(badPillColor);
  }
}

//
class Pill extends Actor
{
  private int idStart;
  private int period = 0;
  private int maxPeriod = 5;

  public Pill(int idStart)
  {
    super("sprites/pille.gif"3);
    this.idStart = idStart;
  }

  public void act()
  {
    if (!isBad() && period == maxPeriod)
      showNextSprite();
    period++;
  }

  protected void work(Kobold kobold)
  {
    if (isBad())
      kobold.show(2);  // Kobold becomes red (ill)
    removeSelf();
  }

  private boolean isBad()
  {
    return getIdVisible() != idStart;
  }
}

Erklärungen zum Programmcode:
int idStart = (int)(Math.random() * 3) Die Pillenfarbe (Sprite ID) wird zu Beginn zufällig gewählt
setPaintOrder(Kobold.class);
setActOrder(Kobold.class);
Der Kobolt erscheit vor der Pille (Pille verschwindet hinter dem Kobold
Pill.getPixelColor(new Point(20, 20) Gibt der Farbe der Pille zurück