Les bots, comment fonctionnent-ils? Disent-ils au jeu vidéo qu'une touche a été enfoncée ou que la souris a été cliquée?
Si non, y a-t-il un moyen de faire dire à votre programme qu'un autre programme a appuyé sur une touche? Je voudrais faire un programme pour battre un jeu. Donc, toutes les ressources ou exemples sont appréciés.
pdate: Donc, une façon est d'émuler les frappes, alors quelles sont les méthodes pour le faire (dans n'importe quelle langue)?
J'ai écrit un tas de bots à un moment ou à un autre (des jeux Pogo aux Yohoho Puzzle Pirates). Pour les fenêtres, vous allez généralement envoyer des événements Win32 pour simuler les mouvements de la souris, ou usurper les messages de bas niveau réellement envoyés entre les fenêtres lorsque vous cliquez sur la souris. Cela dépend en grande partie de la réaction du programme (en acceptant le message avec les coordonnées ou, dans le cas de Java, en lisant immédiatement les coordonnées de la souris). La partie "automatisation" implique généralement la lecture de l'écran et l'écriture d'heuristiques ou d'algorithmes pour déterminer l'état, mais peut aussi être aussi agréable que le reniflage de paquets (beaucoup d'informations là-bas dans de mauvaises implémentations de poker) ou aussi hacky que la lecture directe des emplacements de mémoire. Assez grand "champ", et mal documenté car il est assez rentable et pas difficile d'y entrer.
Pour les clés, essayez CodeProject:
http://www.codeproject.com/KB/cpp/sendkeys_cpp_Article.aspx
Et des messages:
http://www.codeproject.com/KB/threads/sendmsg.aspx
Votre meilleur pari est d'apprendre à envoyer des messages à l'aide de l'API Win32, puis à utiliser quelque chose comme Spy ++ ou ses dérivés pour "rétroconcevoir" comment les KeyPresses et les mouvements de souris sont envoyés à la fenêtre.
Java a une classe Robot incroyablement portable qui est capable de:
Je donnerais un coup de feu si vous cherchez rapide et facile.
Ceci est décrit en détail ailleurs sur Internet, mais la plupart des bots suivent un flux de programme d'état-machine simple. Vous lisez l'écran (ou les paquets, ou la mémoire), découvrez dans quel "état" vous vous trouvez en fonction de vos lectures et des données passées, effectuez des calculs et renvoyez le résultat au programme.
La lecture de l'écran peut être difficile, mais peut être facilitée si vous considérez que la plupart du temps, il y a quelques pixels "chanceux" par rapport à la fenêtre qui vous donneront une idée de l'état du programme. Le processus de la recherche de ces pixels peut être automatisée.
Il existe plusieurs types de robots. D'après ce dont je me souviens quand je jouais à CS (il y a très longtemps)
Certains bots utilisent les bibliothèques de l'application elle-même pour inspecter l'environnement (la carte, où se trouvent les joueurs etc ...) Les bots utilisent également la bibliothèque pour contrôler les mouvements. Je doute qu'il existe de nombreuses implémentations de bots qui invoquent des messages de souris pour indiquer au jeu comment se déplacer, etc.
Certains bots émulent le protocole au niveau de l'application (s'il s'agit de plusieurs joueurs). En d'autres termes, le jeu n'a même pas besoin de fonctionner. Un bot peut fonctionner dans un jeu virtuel.
Je vais aller à l'encontre de ce qu'une autre affiche a suggéré: écrire un robot de jeu est probablement un exercice plus précieux que de jouer réellement au jeu, et être curieux de savoir comment ils fonctionnent est un bon signe. :)
Certains programmes (tels que ceux que Grind vous propose dans un MMORPG) émulent simplement les frappes. Un outil pour ce faire est AutoIt .
En ce qui concerne les bots qui jouent réellement aux jeux eux-mêmes, je n'ai vraiment rien fait avec eux, mais je suppose qu'ils utiliseraient une sorte d'ensemble d'actions prédéfinies, peut-être une heuristique, mais peu probable.
Le plus gros défaut de ce concept n'est pas l'entrée, mais la sortie du jeu. Votre bot ne peut pas simplement appuyer sur des touches au hasard, il a besoin de savoir ce qui "se passe". Très peu de jeux vous permettent d'interroger ces données, ce qui laisserait votre bot pour résoudre un problème très délicat - Conversion de 60 images par seconde de données visuelles 2D en un espace virtuel.
Il existe actuellement des jeux qui permettent non seulement aux joueurs de bot, mais les encouragent. Open RTS en fait partie, mais il y en a aussi des plus simples comme GUN-TACTYX et crobots qui sont de bons points de départ.
Un bot comme vous le décrivez émulera simplement les pressions sur les touches et les mouvements/clics de la souris, de sorte que le jeu ne peut pas dire si un humain joue ou un autre programme. Il n'aurait pas du tout à s'interfacer avec le jeu.
Les bots agiront en tant que clients du jeu (serveur). Ensuite, ils peuvent envoyer des données appropriées comme un utilisateur peut envoyer manuellement. Le bot (client) analysera les données du serveur ("quelqu'un est sur le point d'attaquer par la gauche"), et cetera. Le client doit alors être en mesure de calculer le meilleur mouvement et d'envoyer les données appropriées au serveur pour l'exécuter.
Je ne sais pas si cela fonctionnera avec tous les jeux.
Cela dépend beaucoup du jeu. Par exemple, j'ai créé un bot pour Travian (qui est un jeu en ligne) qui utilise Internet Explorer activeX pour automatiser les déplacements. J'ai worte l'application en c # et pour le faire faire des choses a pris environ 30 minutes. Il est simple d'appeler des méthodes sur l'ActiveX et de lui faire faire des choses comme remplir des champs de texte ou cliquer sur des boutons. Pour la connexion par exemple, j'ai utilisé ce qui suit:
var inputs = web.Document.GetElementsByTagName("input").
Cast<HtmlElement>();
var nume = inputs.First(h => h.GetAttribute("type") == "text");
var pass = inputs.First(h => h.GetAttribute("type") == "password");
var login = inputs.First(h => h.GetAttribute("type") == "image");
var form = web.Document.GetElementsByTagName("form")[0];
nume.SetAttribute("value", "user");
pass.SetAttribute("value", "pass");
login.InvokeMember("Click");
Pour les jeux sur ordinateur, les choses deviennent plus compliquées. Windows permet à une application d'envoyer des messages à une autre application, donc je suppose que vous pouvez l'utiliser pour envoyer des messages à un jeu (bien que cela fonctionne pour les jeux qui utilisent directX pour la saisie, je ne sais pas)
Je pense que AutoIT est un excellent langage pour faire ce genre de logiciel. Même si je ne l'ai pas utilisé pour créer des robots, l'envoi de clics et de clés a été très facile.
Ma compréhension est que la plupart des robots de jeu haut de gamme utilisent des appels système pour se mapper dans l'espace mémoire du client de jeu, procéder à une ingénierie inverse de sa disposition et manipuler directement les variables internes du programme client. C'est beaucoup plus de travail que je ne le ferais que pour le plaisir.
Lorsque vous dites "contrôler un programme", pensez à la façon dont les programmes sont contrôlés. La plupart acceptent la saisie au clavier/souris.
Si vous écrivez un programme pour simuler la saisie clavier/souris, c'est parti.
Un corollaire à cela serait que si un programme acceptait des arguments passés à travers une zone de saisie, écrire un programme pour envoyer des arguments comme s'ils étaient envoyés via une zone de saisie.
C'est ainsi que fonctionnent tous les bots. J'espère que cela vous éclairera!
Edit: Voici comment la grande majorité des bots fonctionnent :-)
Vous pouvez émuler les mouvements/clics de souris et la saisie au clavier dans Java avec la classe Robot . Il vous permet également de prendre des captures d'écran.