Computerspieler

Status
Nicht offen für weitere Antworten.

The-Forgotten

Bekanntes Mitglied
Wie kann ich denn mit Java ne Art KI für mein kleines Spiel basteln ?

Sie sollte auch sinnvoll agieren und auf den Gegner reagieren.

Geht sowas mit Java, wenn ja wie mach ich das ?
 
G

Guest

Gast
The-Forgotten hat gesagt.:
und wie mach ich das ? ^^

Ich kann ja nich für jeden x-beliebigen Fall ne If - Abfrage schreiben^^
Du erwartest nicht tatsächlich, dass hier jemand ein Thema breitklopft, mit dem man eine ganze Enzyklopädie füllen
kann, oder? Komm schon, recherchiere bisschen, lese Grundlagenartikel zum Thema, suche nach frei verfügbaren
Beispielen, Hilfsbibliotheken etc.
 

Marco13

Top Contributor
Ja was, geht doch mal ein bißchen auf die Frage ein :x

Also. Um eine KI zu schreiben, die sinnvoll agiert und auf gegener reagiert, empfiehlt es sich zuallererst, eine Methode zu schreiben:
Code:
private void agiereSinnvoll()
{
    ....
}

Wenn du damit fertig bist, kannst du (sinnvollerweise (sic!)) von dieser Methode eine andere Methode aufrufen, die du auch noch implementieren mußt:

Code:
private void reagiereAufGegner()
{
    ....
}

So, damit bist du schon fast so gut wie beinahe viertel vor fertig. Da sieht man mal wieder: KIs programmieren ist garnicht so schwer.
 

Prusik

Aktives Mitglied
4 Stunden 23 Minuten 35 Sekunden, was denn sonst? ;)


nö im ernst... hängt von verschiedenen Faktoren ab
- Was für eine KI
- wie schnell bist du? --> neu in Java, oder machst du das tagtäglich...
 

Nashes

Neues Mitglied
....glaub schon dass des in Java funktioniert aber normal programmiert man KIs ja in Prolog oder?
 

Illuvatar

Top Contributor
Kommt auch drauf an, wie intelligent der Computerspieler sein soll. Du kannst auch Feinde machen, die zufällig irgendwohinlaufen - da kann man dann halt kaum mehr von Intelligenz sprechen ;) (es soll aber auch Menschen geben die sich intelligent nennen und genauso wenig drauf haben... aber lassen wir das).

Mal als Beispiel, ich hab irgendwann mal ein Pacman geschrieben, mit einer KI, die sich über Plugins austauschen ließ. Die KI-Klasse muss dann dieses Interface implementieren:
Code:
package de.illu.pac3d.enemy;

import de.illu.pac3d.*;
import java.awt.*;

/**
 * Klasse implementieren, um eigene Verhaltensweisen der Feinde zu implementieren.
 * Die Klasse bekommt über die Methoden setGamefield und setPosition Informationen über das Spielfeld und den Standort des Geists.
 * Über computePoint wird dann zurückgegeben, an welchen Punkt der Geist sich bewegt. setPosition wird darauf normal wieder direkt von außen aufgerufen.
 * getGhostRot muss eine Konstante aus de.illu.pac3d.GlobalPrefs zurückgeben (NORTH/SOUTH/EAST/WEST), die angibt, in welche Richtung der Geist sieht.
 */
public interface EnemyBehavior 
{
  public void setGamefield (Gamefield gf);
  public void setPosition (Point p);
  public Point computePosition();
  public int getGhostRot();
  /**
     * Liefert eine kurze Beschreibung über den Behavior, auch in HTML.
     */
  public String getDescription();
  /**
     * Mit diesem Factor wird der Highscore multipliziert
     */
  public double getFactor();
}

Es gibt z.B. eine Implementierung, die zufällige Werte zurückgibt - das ist dann gar nicht so viel Code :)
Die intelligenteste Implementierung, die ich geschrieben habe, sieht folgendermaßen aus:
Code:
package de.illu.pac3d.enemy;

import de.illu.pac3d.enemy.EnemyBehavior;
import de.illu.pac3d.*;
import java.awt.Point;
import java.util.*; 
import java.io.*; 
import de.illu.math.AStar;

/**
 * 

[b]Intelligentes Feindverhalten[/b]</p>

Die Feinde benutzen den A-Star-Wegfindungs-Algorithmus, um
 * sich auf kürzestmöglichem Wege zu Pacman zu begeben, laufen aber weg, wenn Pacman ein Schild hat.</p>

[i]Faktor: 1,3[/i]</p>
 */
public class IntelligentEnemyBehavior extends StandardEnemyBehavior
{
  public int getGhostRot() 
  {
    if (!mustRedo){
      return rot;
    }
    int ret = rot;
    if (gf.getPrefs().view.getPacman().hasArmor()){
      Point pac = gf.getP3dPos();
      int xdiff = pac.x - p.x;
      int ydiff = pac.y - p.y;
      //System.out.println ("xdiff: " + xdiff + "; ydiff: " + ydiff);
      if (Math.abs(xdiff) > Math.abs(ydiff)){
        if (xdiff > 0){
          ret = GlobalPrefs.WEST;
        }else{
          ret = GlobalPrefs.EAST;
        }
      }else{
        if (ydiff > 0){
          ret = GlobalPrefs.NORTH;
        }else{
          ret = GlobalPrefs.SOUTH;
        }
      }
    }else{
      boolean[][] b = new boolean[25][25];
      int[][] f = gf.getField();
      for (int i = 0; i < 25; i++){
        for (int j = 0; j < 25; j++){
          b[i][j] = (f[i][j] != Leveleditor.CURSOR_MAUER);
        }
      }
      for (Point p : gf.getGhosts()){
        b[p.x][p.y] = false;
      }
      try {
          AStar.Node node = AStar.getPathInArray(b, this.p, gf.getP3dPos());
        AStar.Node lastNode = node;
        while (node.getParent() != null){
          lastNode = node;
          node = node.getParent();
        }
        //System.out.println (lastNode);
        int x = p.x;
        int nx = lastNode.getX();
        int y = p.y;
        int ny = lastNode.getY();
        if (nx - x == 1){
          ret = GlobalPrefs.EAST;
        }else if (nx - x == -1){
          ret = GlobalPrefs.WEST;
        }else if (ny - y == 1){
          ret = GlobalPrefs.SOUTH;
        }else if (ny - y == -1){
          ret = GlobalPrefs.NORTH;
        }
        }catch (NoSuchElementException ex) {
          //System.out.println ("no node found");
        }
    }
    rot = ret;
    mustRedo = false;
    return ret;
  }
  public String getDescription()
  {
    return "<html><h3>Intelligentes Feindverhalten</h3>

Die Feinde benutzen den A-Star-Wegfindungs-Algorithmus, um sich auf kürzestmöglichem Wege zu Pacman"
+ "zu begeben, laufen aber weg, wenn Pacman ein Schild hat.</p>

[i]Faktor: 1,3[/i]</p></html>";
  }
  public double getFactor()
  {
    return 1.3;
  }
}

Das ist abgeleitet aus der Klasse mit der Standard-KI (das sind auch nochmal 50 Zeilen, das überschriebene nicht eingerechnet) und benötigt zusätzlich noch das hier. Und das alles, um nur eine Richtung und den nächsten Punkt in diese Richtung zu berechnen.

Soll heißen, zu deiner Frage kann man eigentlich keine Antwort geben ;) Das hängt von so vielen Faktoren ab. Überleg dir einfach: Wenn das Spiel so und so aussieht - was soll die KI dann machen? Wie kann ich das am besten und einfachsten in Java ausdrücken? - und schreib das dann hin.

Note: Uh jö, beim Durchlesen merk ich doch deutlich, dass der Code schon älter ist... bei jedem Aufruf ein neues 25x25 Array und so Sachen... naja darum gehts ja nich
 

ARadauer

Top Contributor
geht in die ära der sinnlosen threads ein.

kommt doch 100 mal auf den anwendungszweck drauf an!!! eine mesch ärger dich nicht ki wird doch um einiges leicht zu schreiben sein als eine poker ki.

sag uns was du vor hast und wir helfen dir.

kann ich gleich schon fragen: ich will was bauen, wie geht das?
 
G

Gast

Gast
Ich glaube, hier hat der Anwender weniger Probleme mit Java sondern eher damit überhaupt zu programmieren und dann auch noch welche Vorgehensweisen und Möglichkeiten KI bietet...

Suche eher:
Grundkurs Programmieren
was ist if.....

Basis Künstliche Intelligenz
z.B. Neuronale Netze, Expertensysteme, Regeln, ....

Danach viel Freude bei der Umsetzung.

Eher 4 Monate, 23 Tage und 35 Stunden.....
als 4 Stunden 23 Minuten 35 Sekunden.

Basis aufbauen macht Spaß!
 

The_S

Top Contributor
@Nashes

wtf? KIs werden in der Sprache programmiert, in der sie benötigt werden. Was nützt dir eine Prolog-KI für 4-Gewinnt, wenn dein 4-Gewinnt in Java geschrieben ist???

@The-Forgotten

schlaf mal dein weihnachtsrausch aus, les deine sinnlose Frage nochmal durch und dann nochmal die Antworten. Wenn du anschließend immer noch (dieselben) Fragen hast, dann solltest du dir Gedanken machen.
 
M

mcnanuk

Gast
UIUIUIIII Hobbit,

http://www.ugosweb.com/jiprolog/index.aspx

Es gibt doch fast zu jeder SPrache eine Java Einbettung. Jython zum Beispiel für die Schlange :)

Also ich habe schon die ein oder andere kleine Sache mit Jiprolog gemacht. Versuch mal in Java ne Digitale Schaltung zu simulieren. Nen RS-FlipFlop zum Beispiel. Da programmiert man sich nen Wolf. In Prolog ne Sache von max 15 Zeilen.

Grüße
 

The_S

Top Contributor
ich hab auch nie behauptet, dass man prolog nicht in java einbinden kann. Ich fände es nur äußerst unsinnig, wenn ich in Java ein 4-Gewinnt habe, die dazugehörige KI aber in Prolog schreiben würde.
 
G

Guest

Gast
Hobbit_Im_Blutrausch hat gesagt.:
ich hab auch nie behauptet, dass man prolog nicht in java einbinden kann. Ich fände es nur äußerst unsinnig, wenn ich in Java ein 4-Gewinnt habe, die dazugehörige KI aber in Prolog schreiben würde.
Nicht unbedingt. Du schreibst die Logik in Prolog, das ergebnis ist aber generierter Java-Code (ähnlich Compilerbau).
OK, das ist jetzt Science Fiction, keine Ahnung, ob es sowas gibt. Für mich ist KI eine Blondine mit gefärbten Haaren. :D
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben