Java Bot - Achtung die Kurve

C

CurBty

Gast
Hi,

Ich würde gerne einen Bot für das Spiel "Achtung die Kurve" bzw "IPcurve" programmieren. (Wer es nicht kennt, sollte es mal googlen, dieses Spiel ist über LAN echt super!)

Ich habe schon ein bisschen drüber nachgedacht, wie ich jetzt an die Sache herangehen soll:

Ich könnte jedes mal Screenshots machen, analysiere die einzelnen Pixel und reagiere je nach dem, was die anderen machen, mit einem Tastendruck. Dies kommt mir jedoch relativ unpraktisch und unnötig kompliziert vor, vorallem, da ich vorher nicht unbedingt meine eigene Farbe wissen muss (auch wenn man das Problem natürlich durch ein Farb-Auswahlmenü beim Start vom Bot beheben könnte).

Mein zweiter Gedanke war, dass Spiel erstmals über einen Sniffer zu analysieren und dann nur noch die Befehle abzufangen und somit die Strecke der anderen zu berechnen und einen Befehl zurückzuschicken (oder mehrere). Jedoch sehe ich ja dann nicht mehr, was der Bot spielt (zumindest nicht an meinem Computer), da er ja eigentlich direkt eine Verbindung (über einen Socket?) zum Server aufbaut. Oder kann (und sollte) man sich irgendwie zwischen das Spiel und den Server schalten?
Dies müsste doch rein theoretisch über einen eigenen Serversocket funktionieren, zu dem sich das Spiel dann "lokal" verbindet. Der Bot schickt dann die Befehle - die vom Server bekommenen Befehle werden dann einfach an das Spiel weitergeleitet und somit müsste man noch alles sehen können.

Ich würde jetzt gerne von euch wissen, welche der beiden Möglichkeiten euch für sinnvoller erscheint oder ob euch vielleicht doch eine 3. Möglichkeit besser gefällt.
Außerdem würde mich interessieren, wie ich mich zwischen das Spiel und den Server schalten kann, ob mein Ansatz richtig ist und wie ich solch eine Analyse angehen sollte. (Auch wenn dies hier nicht gebraucht wird)

Schonmal Danke für die Antworten, wenn noch Fragen bestehen einfach fragen.

lg CurBty
 

XHelp

Top Contributor
Du könntest Monate opfern und die Arbeitsweise des alten Clients nachzuvollziehen und dann deinen eigenen schreiben, der sowohl spielen als auch cheaten kann.
Die Frage ist natürlich wieviel Zeit du da opfern willst. Alleine schon einen Algo zu entwickeln, der eine perfekte Route berechnet wird schon dauern.
 
C

CurBty

Gast
Danke für deine Antwort. :)
Natürlich möchte ich nur ungern Monate opfern, jedoch möchte ich unbedingt auch mal etwas in diese Richtung programmieren, auch wenn es ein bisschen dauert.
Und um den Algorithmus mache ich mir sorgen, wenn ich weiß, wie ich die Befehle überhaupt übergebe und dies auch umgesetzt habe.
 
D

Dow Jones

Gast
Ich habe beide Methoden bereits verwendet um Programme automatisch bedienen zu können. Allerdings hatte ich dazu zumeist C verwendet, das macht ein paar Dinge einfacher.

Ich denke für deinen Zweck funktionieren beide Methoden. Lass mal überlegen... welche Informationen benötigt man denn alles. Am wichtigsten ist es wohl zu wissen wo bereits Spuren verlaufen, denn diese darf man ja nicht berühren. Das kann man vermutlich prima aus einer Bitmap (Screenshot) ablesen. Dann muss man wissen wo sich der eigene "Cursor" zur Zeit befindet; am besten zusammen mit der aktuellen Laufrichtung. Das kann man eigentlich auch ganz gut aus zwei oder drei aufeinanderfolgenden Screenshots ablesen. Ich glaube, ich würde die Methode mit den Screenshots bevorzugen.

Der andere Weg wäre es einen eigenen Client oder Proxy zu implementieren. Beim Proxy hätte man das Problem, das dieser zwar den Netzwerkverkehr abhören und interpretieren kann, aber er kann das Spiel nicht selber bedienen (soll heissen: wenn der Proxy von sich aus einen Befehl an den Server sendet bekommt der parallel laufende original Spielclient das nicht mit). Ein eigener Spielclient hätte dieses Problem nicht, allerdings müsstest du dann selber eine graphische Darstellung der aktuellen Spielsituation implementieren (wenn du sehen möchtest was gerade passiert). Und damit kommen wir auch zu dem großen Manko der Client/Proxy Lösung: Je nachdem was genau der Server an Daten überträgt wäre deine Interpretation der Daten im Zweifelsfall nur eine Approxmation der tatsächlichen Spielsituation. Ich meine, wenn du z.B. versucht die Kurve die ein Spieler gerade läuft nur anhand seiner Links-/Rechts-Kommandos zu ermitteln, dann müsstest du den Krümmungsradius der Kurven schon exakt kennen. Ansonsten werden sich recht schnell Fehler einschleichen. Und wenn diese Fehler dafür sorgen, das du eine Kurve falsch zeichnest (also z.B. einen Pixel zu weit rechts), dann kann das für deinen Bot schon das Aus bedeuten. Das kann dir bei der Screenshot-Methode nicht passieren. Außerdem dürfte es weniger Arbeit sein einen Screenshot zu analysieren als ein Netzwerkprotokoll zu reenginern.

Was ich aber interessanter finde - wie sieht die Strategie aus, die der Bot verfolgen soll? Ich meine, wenn man den aktuellen Spielstand ersteinmal erkannt hat: Wie ermittelst du wie der Bot auf die gegebene Situation reagieren soll? Erzähl mal, wenn du magst, ich fänd's interessant. :)
 
C

CurBty

Gast
Danke für deine Antwort Don Jones :)

Du hast mich überzeugt, die Screenshot-Methode zu benutzen. Vorallem das Argument der Ungenauigkeit hat mich stutzig gemacht.

Jedoch noch zu der Client-Proxy Version:
Wenn die Daten vom Server über den Proxy an den Client weitergeleitet werden, sollte dieser normal auch die richtigen Informationen der Kurven haben und diese somit richtig zeichnen können. Je nachdem ob der Client die eigenen Daten auch vom Server geschickt bekommt oder nicht, müsste man eben diese Daten an den Client ebenfalls weitergeben (Im Notfall eben einen Tastendruck simulieren). Es dürfen ja nur nicht die Daten vom Client zum Server übertragen werden (bzw es dürften normalerweiße auch keine vorhanden sein, solange man nichts drückt, außer die simulierten vom Bot).

Und an den Algorithmus setze ich mich jetzt mal dran. Wenn ich einen habe, werde ich mich melden.
Falls du, oder jemand anderes, eine Idee für den Algorithmus hat, darf er diesen natürlich auch gerne schreiben. :)
 
C

CurBty

Gast
Hi :),

Was haltest du/haltet ihr von der Idee in bestimmten Zeitabständen Screenshots zu machen, und die Daten von dem Screenshot in einem Array-Enum zu speichern.
Die Spielfläche in der man sich bewegen kann ist ja schwarz, der rest blau. Also theoretisch müsste es reichen, am anfang einen Screenshot zu machen, der die Fläche des schwarzen Bereiches ausliest. Dann bräuchte man nur noch Screenshots von dem schwarzen Bereich machen.
Danach könnte man ein Enum erzeugen, dass den Status frei hat. Jetzt wird zB alle 0,2 sec ein Screenshot gemacht und ausgelesen. Alles was nicht mehr schwarz ist, wird mit blockiert o.ä. belegt (Array).

Könnte man dies so angehen als Programmieransatz? Oder ist dies eine nicht elegante oder sogar nicht richtig Funktionierende Lösung?


Als KI habe ich mir überlegt, dass ich mir erstmal den Winkel der Drehung ausrechne, dass ich den Abstand habe, in der eine Drehung noch möglich ist, ohne mit dem Rand oder einem Strich zu kollisieren.

Jetzt könnte ich mir die beste Fläche ausrechen, also die in der am meisten Platz ist. Wenn der Weg zu diesem frei ist, lenkt der Bot zu diesem und nutzt den Platz dort aus bis er ausgebraucht ist, jedoch noch genug Platz zum "abhauen" ist.

Wenn diese Fläche auch nicht mehr richtig befahrbar (wenn man hier von fahren sprechen kann, aber mir fällt gerade kein gutes Wor ein :p) ist oder der Weg zu diesem beim hinlenken schon vorher blockiert ist, sucht er sich den nächstbesten Platz usw.

Wenn alle Flächen < x sind dann könnte er einfach knapp am Rand entlang fahren, außer es ist jemand in den Rand gefahren dann lenkt er vorher irgendwo anders hin. Insgesammt lenkt er immer bei einem gewissen Abstand ab, falls jedoch beide Richtungen knapp sind errechnet er sich den Mittelwert und fährt diesen entlang.

Könnte man dies bis dahin etwa so lassen oder spricht etwas dagegen? (Für die Lücken muss ich mir natürlich auch noch was ausdenken :p) Ist natürlich nicht perfekt aber für den ersten Test sollte es reichen, er muss ja dann eh verbessert werden, da Schwächen gefunden werden.

PS: Ich hoffe man konnte einigermaßen verstehen was ich meine^^
 
C

CurBty

Gast
Habe mal gerade die ipcurve.ini durchgeschaut, der standard Wendewinkel (turnAngle) ist dort schon angegeben, nämlich turnAngle = 0.024.
 
C

CurBty

Gast
So wies aussieht, haltet ihr wohl gar nichts davon :p Dann werd ichs wohl einfach ausprobieren müssen^^
 
G

Gast2

Gast
Ich hab mir deine Posts jetzt nicht komplett durchgelesen, aber folgendes ist mir beim drüberschaun aufgefallen.
Jetzt wird zB alle 0,2 sec ein Screenshot gemacht und ausgelesen.
Je nach Auflösung dauert allein das erstellen des Screenshots mit der Robot Klasse schon gerne mal sehr lange. Bei mir (3840x1080) dauert das erstellen des Screenshots >500ms. Bei nem Ausschnitt von 1080x1080 immer noch knapp über 300ms (stark schwankend).
Wenn du das nicht signifikant beschleunigen kannst (evtl. durch JNI/JNA) dann stößt du mit der Methode schnell an die Grenzen.
 
C

CurBty

Gast
Danke für deine Antwort. Das Problem ist, dass der Bot zumindest auf Linux und Windows laufen sollte. Gibt es nicht noch eine andere Möglichkeit? Ich werde morgen bzw später mal testen, wie lange so ein Screenshot bei mir braucht.
Und ich habe gerade mal geschaut, im Vollbildmodus hat der Spielbereich, den ich ja brauche, nur etwa 900x700 Pixel, was jedoch trotzdem > 200ms seien wird, nach deinen Zahlen.
Gibt es nicht eine Möglichkeit schnellere Screnshots zu machen, obwohl das Programm auf Linux und Windows läuft? Ich werde mich morgen nochmal genauer darüber informieren.

lg
 

XHelp

Top Contributor
Du musst ja auch nicht immer einen kompletten Screentshot machen. Du machst 2 Screenshots um zu bestimmen in welche Richtung die Linien laufen und dann machst du einfach nur einen Screenshot von einem kleinen Teil des Bildschirms, wo die Linie in der Zeit hingelaufen sein könnte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Grundsätzliche Frage zur Verwendung von Java Versionen?? Allgemeine Java-Themen 3
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 0
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
M Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11
KonradN Java 19 Allgemeine Java-Themen 11
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
E Java und integrierte Grafikkarten Allgemeine Java-Themen 18
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
T Java Robot Class - Bot Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
izoards Java Home Pfad unabhängig von der Version Allgemeine Java-Themen 7
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
berserkerdq2 Java sql Allgemeine Java-Themen 15
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
Aartiyadav Comparisons and Swapa in Bubble-sort Java Allgemeine Java-Themen 6
KonradN Java 18 Allgemeine Java-Themen 8
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
O Newton Algorithmus Java Allgemeine Java-Themen 1
P Java Quellen finden Allgemeine Java-Themen 3
M Java Analyse/ SWOT-Analyse Allgemeine Java-Themen 13
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
E java mithilfe url .jar datei öffnen Allgemeine Java-Themen 9
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben