Hey Leute,
Ich beschäftige mich derzeit mit einem kleinen Fussballspiel.Nun stehe ich vor einem dicken Problem: DIE PLAYER-KI.Ich habe schon vieles ausprobiert und auch schon einiges gebastelt was funktioniert:die Spieler laufen, Werte werden zugewiesen also das Gerüst steht, statisch kann ich alles machen.Selbst die Schuss-KI funktioniert und wenn ich Bewegungen komplett verweigere schießen sie sich zu falls das freie Schussfeld aufs Tor blockiert.Dies tun sie bis sie in Tornähe sind , dann hauen sie einfach drauf.Das problem stellt die LAUF-KI da hier einer meiner Versuche:
das Hauptproblem ist das ja alle beim Start auf den Ball zurennen und eigentlich alle Teamkameraden sofort auf Abstand gegen sollen wenn ein Teammitglied den Ball besitzt.Nun Frage ich euch :IDEEN? VERBESSERUNGSVORSCHLÄGE?
Ich beschäftige mich derzeit mit einem kleinen Fussballspiel.Nun stehe ich vor einem dicken Problem: DIE PLAYER-KI.Ich habe schon vieles ausprobiert und auch schon einiges gebastelt was funktioniert:die Spieler laufen, Werte werden zugewiesen also das Gerüst steht, statisch kann ich alles machen.Selbst die Schuss-KI funktioniert und wenn ich Bewegungen komplett verweigere schießen sie sich zu falls das freie Schussfeld aufs Tor blockiert.Dies tun sie bis sie in Tornähe sind , dann hauen sie einfach drauf.Das problem stellt die LAUF-KI da hier einer meiner Versuche:
Java:
private void movetoballphase(){
Point2D.Double ball_vel = getVelocity(playerposition, ballposition, speed*5); // Punkt wird ermittelt auf den sich der Plaer bei vorgegebenen Speed (Parameter 3) von Param.1 nach Param.2 bewegen muss wenn ein Tick stattfindet
Random r = new Random();
int Low = -30;
int High = 30;
int random1 = r.nextInt(High-Low) + Low;
if (actionrec.contains(ball_vel)){ //wenn sich der Ball in dem Actionrec also seinem Aufgabenbereich befindet soll er sich bewegen
boolean inter = false; // bei jedem aufruf wird davon ausgegangen das der Player bei seiner Bewegung gegen nix gegenrennt
for (CoreObject obj : Controller.getObjects()){ // nun wird für jedes Object im Controller eine Abfrage gestartet (Alle Player befinden sich darin))
if (obj.Bound.contains(ball_vel) && obj.getId() != 0 && obj.getId() != id){ // wenn der neue Bewegungspunkt sich in einem Objektboundrectangle befinden sollte und es nicht der Ball/ID 0 ist und es nicht seine eigene Id ist
inter = true; //dann hat eine Berührung stattgefunden
break; //und die schleife wird vorzeitig beeendet
}
}
if (inter == false){ // sollte keine Berührung stattfinden
if (distanceTo(playerposition, ballposition) <= 6){ //und die entfernung zum ball weniger als 6 pixel betragen
ball.setBallownerid(id); //wird die Playerid als Ballbesitzer gesetzt
}
if (ballowner_teammate()){ //sollte nun aber ein Teamkamerad der Ballbesitzer sein (ermittelt anhand von id)) und es nicht er selbst sein
playerposition = new Point2D.Double(x,y); //wird zuerst die aktuelle Position ermittelt
if (ball.getBallownerid() != oldBallstate){ //sollte dann der Ballbesitzer sich seit dem letzten tick geändert haben
targetpoint = new Point2D.Double(ball.getX(),y-random1); //bewegt sich der Spieler auf höhe des Balls aber mit einem random abstand um Teammates nicht zu behindern
}
oldBallstate = ball.getBallownerid(); // neuer Ballstatereminder wird gesetzt
Point2D.Double temptargetpoint = new Point2D.Double((int)ball.getX(),(int)playerposition.getY()); //nun wird der temptargetpoint gesetzt um zu prüfen ob die bewegung möglich ist damit der spieler nicht hin und her flimmert
Point2D.Double tempcurrentpoint = new Point2D.Double((int)playerposition.getX(),(int)playerposition.getY()); //das selbe für die aktuelle position
double difx = temptargetpoint.getX() - tempcurrentpoint.getX(); //nun werden die differencen gebildet
double dify = temptargetpoint.getY() - tempcurrentpoint.getY();
if ( 5<difx || difx<-5 || 5<dify || dify<-5 ){ //sollten die Differenzen 5 größer oder 5 kleiner als 0 sein ist eine Bewegung erlaubt
running = true; //running wird true gesetzt um die Laufanimation zu starten
Point2D temppoint = getVelocity(playerposition, targetpoint, 5); //der nächste velocity point wird ermittelt
x= (float) temppoint.getX(); //die velocity wird angewendet
y= (float) temppoint.getY(); //die velocity wird angewendet
}
else{
running = false; //sollte die Bewegung verweigert worden sein wird running false gesetzt um die Animation zu stoppen und sonst geschieht nichts
}
}
else{ // sollte der Ballbesitzer kein Teammate sein
playerposition = new Point2D.Double(x,y); //wird zuerst die aktuelle Position ermittelt
targetpoint = new Point2D.Double(ball.getX(),ball.getY()); //wird die aktuelle ballposition als Ziel gesetzt
Point2D.Double temptargetpoint = new Point2D.Double((int)ball.getX(),(int)ball.getY()); //werden wie zuvor erst temppoints erstellt
Point2D.Double tempcurrentpoint = new Point2D.Double((int)playerposition.getX(),(int)playerposition.getY());
double difx = temptargetpoint.getX() - tempcurrentpoint.getX(); //die anschließend voneinander abgezogen werden
double dify = temptargetpoint.getY() - tempcurrentpoint.getY();
if ( 2<difx || difx<-2 || 2<dify || dify<-2 ){ //sollten die Differenzen 2 größer oder 2 kleiner als 0 sein ist eine Bewegung erlaubt (2 ist nur zum testen eingetragen)
running = true; //laufanimation wird gestartet indem er auf running gesetzt wird
Point2D temppoint = getVelocity(playerposition, targetpoint, 5); //der velocity point zum ball wird ermittelt
x= (float) temppoint.getX(); //die Velocity wird umgesetzt
y= (float) temppoint.getY();
}
else{
running = false; //sollte die Bewegung verweigert werden wid die Laufanimation gestoppt
}
}
}
else{ //sollte doch eine Berührung stattgefunden haben war eigentlich ein random abprallen geplant was abber alles zerstört hat so sollte also garnichts passieren falls eine Berührung erwartet wird
/*
Random r = new Random();
int Low = -10;
int High = 10;
this.setX((float) (this.getX()+ r.nextInt(High-Low) + Low));
this.setY((float) (this.getY()+ r.nextInt(High-Low) + Low));
*/
if (ballowner_teammate()){
//TODO
}
else{
running = false;
}
}
}
else { //sollte sich der Ball nichtmal im Aktionsfeld befinden
running = false; //wird nur rutienemäßig die Laufanimation auf false gesetzt
}
}
das Hauptproblem ist das ja alle beim Start auf den Ball zurennen und eigentlich alle Teamkameraden sofort auf Abstand gegen sollen wenn ein Teammitglied den Ball besitzt.Nun Frage ich euch :IDEEN? VERBESSERUNGSVORSCHLÄGE?
Zuletzt bearbeitet: