Java Fussballspiel Player-KI in der Bewegungsphase

janb14

Mitglied
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:
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:

Thunderstorm

Mitglied
Also,

da ich sowas noch nie programmiert habe, werde ich dir sagen wie ich da herangehen würde. Ich würde jedem Spieler erstmal so eine Art Rechteck zuordnen. In diesem wird sich der Spieler bewegen können.
Edit : Dazu ist zu sagen, dass siche die Rechtecke mit Ballhöhe verschieben müssen, sonst ist das Spiel etwas statisch :lol:

Was die Bewegung zum Ball angeht, würde ich es für den Anfang so halten, dass der Mitspieler die geringste Distanz zum Ball hat versucht den Ball zu erobern. Wenn sich dessen Abstand dann zu seinem Rechteck größer wird als die Distanz zwischen Ball und einem anderen Mitspieler dann wird dieser versuchen den Ballführenden anzugreifen.

Wie gesagt, die Spieler KI ist im Fusball sehr an das taktische gebunden. Dementsprechend wirst du da nicht um komplizierte Algorithmen herum kommen.

mfg Thunder
 
Zuletzt bearbeitet:

janb14

Mitglied
Thx für die Antwort und sorry für die lange Wartezeit hatte viel um die Ohren. ;)
Zum Thema : Ja die Idee mit den Rechtecken ist nicht schlecht.zurzeit bewegen sich die Spieler nur in ihren zugewiesenen Bewegungsrechtecken.Diese sollen verhindern das auch verteidiger und Torwart auf den Ball zuhetzten.
Das Größte Problem ist immernoch das nebeneinander herlaufen wenn ein Teammate den Ball hat :) die stoßen sich gegenseitig ab und machen dabei lustige Bewegungen :).
 

Thunderstorm

Mitglied
Hi,

also da du nur die Methode postest, kann ich dir wenig helfen. Ich würde vorschlagen du schickst mir das Projekt, damit ich mir das kurz ansehen kann. Dann kann ich dir auch schneller helfen :bae:

Was den Code oben angeht. Die Methode nennst du moveToBallPhase(). Das spiegelt aber in keinster Weise das wieder was inhaltlich passiert. Eigentlich müsstest du darin nur den Spieler zum Ball laufen lassen.
Warum und ob er zum Ball läuft würde ich grundsätzlich in andere Methoden abschieben, da dann der Code viel übersichtlicher wird.
Allgemeiner würde ich sogar sagen, du brauchst nur eine Methode move(int targetX, int targetY)
Da es dann viel einfacher wird und viel weniger Code :popcorn:
- Berechne den Winkel zwischen Spieler und Ball
- Dann werden x und y Anteil der Bewegung ermittelt
- Zu guter letzt ist es ja so, dass wir keine halben Pixel laufen können. Somit musst du 2 Restvariablen hinzufügen, die die Kommastelle speichert. Nach 4-5 Updates ergibt das wieder 1 Pixel mehr und somit gehen keine "Meter" verloren für den Spieler. Diese werden beim nächsten durchlauf beim 2. Schritt noch addiert.

Allgemein noch was, mache lieber viele kleine Methoden, als eine die alles in sich hat. Erstens ist es einfacher eine Struktur zu erkennen, wenn man schreibt :

Point ball = calculateBallPosition();
Point player = calculatePlayerPosition();
float angle = calculateAngle(ball, player);
...

als wenn du alles in eine Methode reinpresst. In diesem Beispiel geht das ja noch, weil die Teilmethoden einfach und klein wären, aber bei komplexeren Methoden, bekommt man Augenkrebs :shock:

mfg Thunder
 
Zuletzt bearbeitet:

strußi

Top Contributor
für dein problem, das teamkamerarden "angegriffen" werden, kannst du abfragen, ob es ein teamkamerad ist, der den ball hat. ist das nicht der fall, angreifen, wenn ja, beschützen, oder freilaufen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
A Minecraft Java Buch fehlermeldung Spiele- und Multimedia-Programmierung 61
yakazuqi Minecraft java.lang.Error: Watchdog Spiele- und Multimedia-Programmierung 3
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
N Minecraft Java Error Spiele- und Multimedia-Programmierung 6
M "Java Datei" Cannot be resolved to a variable Spiele- und Multimedia-Programmierung 2
1Spinne Minecraft Fabric Modding Java Error Spiele- und Multimedia-Programmierung 2
Joris Minecraft Minecraft Java Server Spiele- und Multimedia-Programmierung 6
Shanic Minecraft Minecraft Forge Server "Falsche Java Version" Spiele- und Multimedia-Programmierung 6
O Browser-basiertes online Pokerspiel mit Java Spiele- und Multimedia-Programmierung 1
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
G VST-Plugins in Java verwenden Spiele- und Multimedia-Programmierung 0
P Audio Visualizer mit OpenGL in Java? Spiele- und Multimedia-Programmierung 4
P Snake Java Hilfe Spiele- und Multimedia-Programmierung 4
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
T Welche packages aus der java api doku ist hilfreich zur Android Spieleprogrammierung Spiele- und Multimedia-Programmierung 2
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
C Java findet FluidSynth nicht Spiele- und Multimedia-Programmierung 2
I Java Andere Fenster in Borderless-Mode setzen Spiele- und Multimedia-Programmierung 16
leon_krys Java-Bußgeldrechner Spiele- und Multimedia-Programmierung 5
G [Java/KryoNet/LibGDX] Mutliplayer Packet Frage Spiele- und Multimedia-Programmierung 2
P Website mit Java Backend? Spiele- und Multimedia-Programmierung 1
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
J Fertigungstechnik.. PLS HALP.. Quellcode vom Text in java-Klasse speichern Spiele- und Multimedia-Programmierung 2
E Kalah Java Implementation Spiele- und Multimedia-Programmierung 1
G [Java] Vereinfachung von Boolean Abfragen Spiele- und Multimedia-Programmierung 3
G [LibGDX/Java] ArrayList Object Speicher Spiele- und Multimedia-Programmierung 3
T Java 3D Spiele- und Multimedia-Programmierung 2
A Spielfelder erstellen mit Jogl Java durch ein Koordinaten Array Spiele- und Multimedia-Programmierung 1
J Java Buttons Spiele- und Multimedia-Programmierung 6
T Java Kalender Spiele- und Multimedia-Programmierung 5
Ice4P4rty Java Optische Oberfläche Spiele- und Multimedia-Programmierung 2
MABY Eine mp3 Datei in Java abspielen Spiele- und Multimedia-Programmierung 14
D Java Bomberman Probleme java.lang.NullPointerException Spiele- und Multimedia-Programmierung 1
N Spiele-Menü in Java Spiele- und Multimedia-Programmierung 9
J HDMI Ausgänge mit Java programmieren? Spiele- und Multimedia-Programmierung 18
H Yu-Gi-Oh! Mit Java was tun? Spiele- und Multimedia-Programmierung 6
G Component System Java 2D Game LibGDX Spiele- und Multimedia-Programmierung 6
S Pong java.lang.StackOverflowError Spiele- und Multimedia-Programmierung 3
C Java aus Klasse rausgehen Spiele- und Multimedia-Programmierung 2
MaxG. Java Internet Radio Spiele- und Multimedia-Programmierung 6
G [Java Server] Allgemeine Frage zum Thema Networking in Videospielen Spiele- und Multimedia-Programmierung 15
P java.lang.NoClassDefFoundError: in Greenfoot Spiele- und Multimedia-Programmierung 0
G Java Achsen invertieren Spiele- und Multimedia-Programmierung 2
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
$ Einstieg in Java Game Development Spiele- und Multimedia-Programmierung 11
BraunBerry Java Game Pixel "einfärben" Spiele- und Multimedia-Programmierung 6
BraunBerry Java Game verbesserte Kollisionserkennung Spiele- und Multimedia-Programmierung 18
BraunBerry Java Game Waypoint System Spiele- und Multimedia-Programmierung 3
S Hilfe bei Java Gui Spiele- und Multimedia-Programmierung 2
D Java sound pulseaudio Spiele- und Multimedia-Programmierung 0
David Schwarzbeck Java 3 dimensionale Kollisions Abfrage Spiele- und Multimedia-Programmierung 2
M Gesellschaftsspiel Mühle in Java programmieren Spiele- und Multimedia-Programmierung 3
beatles Java Minesweeper - OS X und Win7 Unterschied Spiele- und Multimedia-Programmierung 2
D Minecraft Java JDK installiert - Minecraft läuft nichtmehr in 64 Bit Spiele- und Multimedia-Programmierung 2
E TMX - Dateien in Java laden Spiele- und Multimedia-Programmierung 1
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
windl MoviePlayer in Java Spiele- und Multimedia-Programmierung 0
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
F Klausurersatz: Ein Java-Programm erstellen und dieses präsentieren. Spiele- und Multimedia-Programmierung 2
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
J programm mit java-plugin Spiele- und Multimedia-Programmierung 2
D Java Webgame, welche Frameworks oder Techs sind von Nöten? Spiele- und Multimedia-Programmierung 5
P Java 2D Bug? Spiele- und Multimedia-Programmierung 8
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
R Java App sendet Midi Daten über Flash Spiele- und Multimedia-Programmierung 3
O Java Zeile aus Textdatei zufällig ausgeben Spiele- und Multimedia-Programmierung 8
K Bestes Bildformat für Spielegrafiken und deren Einbindung in Java Spiele- und Multimedia-Programmierung 2
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
T Alle Referenzen zu einer Klasse aus Java Bytecode ersetzt, JVM sucht trotzdem diese Klasse Spiele- und Multimedia-Programmierung 1
J Java Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
Flo. android java tastatureingaben abfangen. Spiele- und Multimedia-Programmierung 1
J Java Steuerberechnung hilfe Spiele- und Multimedia-Programmierung 17
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
P Java Grafiken mit Rechnungen verknüpfen Spiele- und Multimedia-Programmierung 4
U Minecraft Mit Java auf Minecraft Server anmelden Spiele- und Multimedia-Programmierung 11
F Das sag mir einer Java ist plattform unabhänig ! Spiele- und Multimedia-Programmierung 10
C virtueller stereomix (java sound API) Spiele- und Multimedia-Programmierung 0
S Engine2D - Java 2D Engine Spiele- und Multimedia-Programmierung 20
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
C Java Kollisionserkennung Spiele- und Multimedia-Programmierung 4
U Blender in Java Spiele- und Multimedia-Programmierung 8
K Java 15/Slide/Boss Puzzle Spiele- und Multimedia-Programmierung 2
T Java 3D - Step oder IGES Spiele- und Multimedia-Programmierung 1
H 3D Spiele mit Java - Diskussion Spiele- und Multimedia-Programmierung 35
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
M Bilder in Java Spiele- und Multimedia-Programmierung 7
A Minecraft Java Ubuntu Minecraft Server startet nicht - ERROR (SIGSEGV) Spiele- und Multimedia-Programmierung 7
N Minecraft java lernen minecraft Spiele- und Multimedia-Programmierung 20
J 2d Ansicht mit Java 3d Spiele- und Multimedia-Programmierung 13
F Abbyy finereader aus java starten, Ergebnis zurück? Spiele- und Multimedia-Programmierung 2
P Zeichenübungen mit Java Spiele- und Multimedia-Programmierung 4
M Minecraft weitere Java Entwickler für minecraft projekt gesucht Spiele- und Multimedia-Programmierung 0
I Minecraft Java programmierungs fehler "MineCraft" Spiele- und Multimedia-Programmierung 6
J Java 2D Sicht Spiele- und Multimedia-Programmierung 13
H wma Datei abspielen: java.io.IOException: Resetting to invalid mark Spiele- und Multimedia-Programmierung 11
M Würdet ihr sagen Java Applets eignen sich gut Spiele- und Multimedia-Programmierung 5
F java browsergame entwickeln Spiele- und Multimedia-Programmierung 18

Ähnliche Java Themen

Neue Themen


Oben