1. #1
    Avatar von UnknownUser
    Registriert seit
    07.05.2014
    Beiträge
    139
    Thanked 227 Times in 73 Posts

    Standard 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
            } 
        }
    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?
    Geändert von UnknownUser (12.05.2014 um 18:22 Uhr)

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 02.12.2013, 23:41
  2. MP3-Player
    Von x BoooM x im Forum Kaufberatung
    Antworten: 7
    Letzter Beitrag: 26.11.2013, 03:09
  3. Release OnRa-Player v.1.0.0.0
    Von Bazs im Forum Showroom
    Antworten: 3
    Letzter Beitrag: 24.04.2013, 20:55
  4. [S]Guten MP3 Player
    Von Impact im Forum Audio & Video
    Antworten: 3
    Letzter Beitrag: 16.04.2012, 12:49
  5. Music player
    Von Ubertino im Forum Skriptsprachen
    Antworten: 0
    Letzter Beitrag: 26.01.2012, 10:06
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.