Java cooperation home
Tutorial
type and press Enter

Künstliche Intelligenz in einem Pong Klon

Viele Spiele erfordern einen Gegner, gegen den der Spieler antreten kann. Um dem Spieler den Eindruck zu vermitteln, dass er einen "echten", ernstzunehmenden Gegner hat, der aber auf der anderen Seite nicht unschlagbar sein darf, benötigt man in vielen Spielen eine Art von "Künstlicher Intelligenz". Ich möchte euch in diesem Kapitel eine sehr einfache KI vorstellen, die sich z. B. in einem Pong Klon einsetzten lässt. Wie schon in dem vorangegangenen Kapitel werde ich nicht mehr auf alle Funktionen des Appelts, das ihr am Schluss sehen könnt eingehen. Ladet euch also den Source Code runter und versucht alles, was ich nicht bespreche, selbst zu verstehen. Als Beispiel für ein fertiges Pong Spiel kann euch Streethockey dienen.

Die Situation

Zunächst sollten wir uns kurz klarmachen, was wir eigentlich wollen, bzw. wie ein menschlicher Spieler in einem Pong Klon reagiert. Der Computer hat, wie sein menschlicher Gegner, die Aufgabe den Ball nicht in das Tor zu lassen. Ein menschlicher Spieler versucht dazu mit seinem Paddel immer auf der Höhe des Balles zu sein, um den Ball abzuwehren bevor er ins Tor fliegt. Sich diese sehr einfache Situation so klar zu machen mag vielleicht sogar etwas überzogen wirken, aber genau dieses einfache Verhalten wollen wir nun dem Computer beibringen.

Die Idee

Der Computer soll also ständig den Ball "im Auge behalten" und seine Position (in dem Spiel Streethockey ist es die y - Position) an die des Balles anpassen. Angenommen das Ballobject würde uns Funktionen zur Verfügung stellen, die uns die aktuelle Position und Geschwindigkeit des Balles übergeben würden (sozusagen die Augen des Computers), könnte eine Funktion, die das Paddel des Computers bewegt, folgendermaßen aussehen:

Die KI - Funktion

    /** Diese Methode bewegt das Paddel */
    public void move (Ball ball)
    {
      // Berechnet die Mitte des Paddels
      real_y_pos = y_pos + (size_y / 2);

      /* Wenn sich Ball von Paddel wegbewegt, werden die Paddel in die Mitte zurückbewegt */
      if (ball.getXSpeed() > 0)
      {
        // Paddel oberhalb der Mitte
        if (real_y_pos < 148)
        {
          y_pos += y_speed;
        }
        // Paddel unterhalb der Mitte
        else if (real_y_pos > 152)
        {
          y_pos -= y_speed;
        }
      }
      else if (ball.getXSpeed() < 0)
      {
        // Solange Paddel nicht auf Höhe des Balles ist wird es bewegt
        if ( real_y_pos != ball.getYPos())
        {
          // Ball oberhalb von Paddel
          if (ball.getYPos() < real_y_pos)
          {
            y_pos -= y_speed;
          }
          // Ball unterhalb von Paddel
          else if (ball.getYPos() > real_y_pos)
          {
            y_pos += y_speed;
          }
        }
      }
    }

Erläuterungen zur Funktion

Diese Funktion ist eigentlich denkbar einfach: Zunächst unterscheiden wir zwei verschiedene Fälle:
Bewegt sich der Ball vom Paddel weg ist seine Geschwindigkeit in x - Richtung also positiv (Paddel am linken Spielfeldrand), so wird das Paddel zurück in die Mitte bewegt, indem wir die y - Position solange entweder vergrößern oder verkleinern, bis wir die Mitte des Spielfeldes erreicht haben. Die Mitte wäre ja eigentlich 150. Ich habe jedoch einen Bereich dazwischen freigelassen (151-149) damit das Paddel auch mal richtig gestoppt wird. Würde man in beiden Fällen 150 angeben, so würde sich das Paddel an dieser Position ganz schnell hin und herbewegen, was etwas nervig aussieht.
Jetzt zum eigentlich interessanten Fall: Der Ball bewegt sich auf den Computer zu. Nun muss der Computer versuchen seine y - Position der des Balles anzupassen indem er seine y - Position entweder verkleinert, wenn sich der Ball oberhalb seiner eigenen Position befindet oder eben vergrößert ist das Gegenteil der Fall. Befindet sich der Computer auf Höhe des Balles, so bewegt er sich nicht mehr. Damit hätten wir unsere erste kleine "künstliche Intelligenz" zum "Leben" erweckt und wie ihr euch im Applet unten anschauen könnt, funktioniert sie ganz hervorragend.

Noch ein Hinweis

In diesem Fall kann man die KI so programmieren, dass ein Mensch dagegen keine Chance mehr hat. Zum einen reagiert der Computer sofort auf eine Änderung der Ballposition und wenn er auch noch schneller ist als der Ball, so wird er, da er auch nicht ermüdet, jedes Tor des Spielers vereiteln. Ein solches Spiel würde dem Spieler wohl kaum noch Spaß machen. Es ist also wichtig, dass ihr dem Computer einige Schwächen einbaut, indem ihr den Computer z. B. langsamer macht als den Ball. Alles in allem dauert es wohl ein wenig, bis ihr die "KI" so auf das Spiel abgestimmt habt, dass sie weder zu "dumm" noch zu "intelligent" ist.

SourceCode download (*.zip - Datei)
Applet ansehen

Nächstes Kapitel

Generierung eines Zufallslandschaft
Fabian Birzele, 2001-2004.
web-design: Vadim Murzagalin, 2004.