-
12.05.2014, 18:21 #1
Java Fussballspiel Player-KI in der Bewegungsphase
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:
Code: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 } }
Geändert von UnknownUser (12.05.2014 um 18:22 Uhr)
Ähnliche Themen
-
Win7 Java in Safari ausführen (Fehlermeldung Java nicht installiert)
Von Silverstar im Forum WindowsAntworten: 8Letzter Beitrag: 02.12.2013, 23:41 -
MP3-Player
Von x BoooM x im Forum KaufberatungAntworten: 7Letzter Beitrag: 26.11.2013, 03:09 -
Release OnRa-Player v.1.0.0.0
Von Bazs im Forum ShowroomAntworten: 3Letzter Beitrag: 24.04.2013, 20:55 -
[S]Guten MP3 Player
Von Impact im Forum Audio & VideoAntworten: 3Letzter Beitrag: 16.04.2012, 12:49 -
Music player
Von Ubertino im Forum SkriptsprachenAntworten: 0Letzter Beitrag: 26.01.2012, 10:06
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.