40 votes

Comment un programme peut-il contrôler un autre programme ?

Les robots, comment ça marche ? Indiquent-ils au jeu vidéo qu'une touche a été pressée ou que la souris a été cliquée ?

Si ce n'est pas le cas, existe-t-il un moyen de faire en sorte que votre programme indique à un autre programme qu'une touche a été pressée ? J'aimerais créer un programme pour battre un jeu. Je ne sais pas si c'est le cas, mais je ne sais pas non plus si c'est le cas, mais c'est le cas.

Mise à jour : L'une des solutions consiste donc à émuler les frappes au clavier. Quelles sont donc les méthodes pour y parvenir (dans n'importe quel langage) ?

52voto

Stefan Mai Points 9477

J'ai écrit un certain nombre de bots à un moment ou à un autre (des jeux Pogo aux Yohoho Puzzle Pirates). Pour Windows, il faut soit envoyer des événements Win32 pour simuler les mouvements de la souris, soit usurper les messages de bas niveau envoyés entre Windows lorsque la souris est réellement cliquée. Cela dépend en grande partie de la façon dont le programme réagit (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 également être aussi agréable que le reniflage de paquets (beaucoup d'informations dans les mauvaises implémentations de poker) ou aussi difficile que la lecture directe d'emplacements de mémoire. Il s'agit d'un "domaine" assez vaste et peu documenté, car il est très rentable et facile d'accès.

Envoi de l'entrée

C/C++ (sous Windows)

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

Le mieux est d'apprendre à envoyer des messages à l'aide de l'API Win32, puis d'utiliser un logiciel comme Spy++ ou ses dérivés pour "rétroconcevoir" la manière dont les pressions sur les touches et les mouvements de la souris sont envoyés à la fenêtre.

Java

Java dispose d'une classe Robot étonnamment portable, capable de.. :

  1. Lire les pixels de l'écran.
  2. Contrôler la souris.
  3. Envoyer les clés.

Je vous conseille de l'essayer si vous cherchez un moyen rapide et facile.

Logique de base

Ce processus est décrit en détail ailleurs sur l'internet, mais la plupart des robots suivent un flux de programme état-machine simple. Vous lisez l'écran (ou les paquets, ou la mémoire), vous déterminez votre "état" en fonction de vos lectures et des données antérieures, vous effectuez des calculs et vous renvoyez le résultat au programme.

La lecture de l'écran peut être difficile, mais elle peut être facilitée si vous considérez que, bien souvent, quelques pixels "chanceux" par rapport à la fenêtre vous donneront une idée de l'état dans lequel se trouve le programme. Le processus de recherche de ces pixels peut être automatisé.

1 votes

+1, principalement parce que vous faites une distinction entre un bot très basique qui fonctionne avec des jeux de type puzzle, et des bots plus compliqués qui utilisent la mémoire de l'application.

0 votes

(+1) pour une bonne réponse et la référence aux pirates du puzzle. Ce jeu me manque.

0 votes

@devinb Lol, je suis content que quelqu'un ait joué à ce jeu. Chaque personne à qui je le mentionne dit "Yohoho quoi ?" et rit, mais ils n'en ont aucune idée ;)

6voto

altCognito Points 23944

Il existe plusieurs types de bots. D'après ce dont je me souviens lorsque je jouais à CS (il y a très, 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 y ait beaucoup d'implémentations de bots qui invoquent les messages de la souris pour dire au jeu comment se déplacer, etc...

Certains bots émulent le protocole au niveau de l'application (s'il s'agit d'un jeu multi-joueurs). En d'autres termes, le jeu n'a même pas besoin de tourner. Un bot peut fonctionner dans un jeu virtuel.

Je vais aller à l'encontre de ce qu'une autre personne a suggéré : écrire un bot de jeu est probablement un exercice plus utile que de jouer au jeu, et être curieux de savoir comment ils fonctionnent est un bon signe :)

4voto

samoz Points 14652

Certains programmes (comme ceux qui s'occupent de la mouture dans un MMORPG) ne font qu'émuler les frappes de clavier. Un outil pour faire cela est AutoIt .

En ce qui concerne les robots qui jouent eux-mêmes aux jeux, je n'ai rien fait avec eux, mais je suppose qu'ils utiliseraient une sorte d'ensemble prédéfini d'actions, peut-être une heuristique, mais ce n'est pas probable.

0 votes

Il existe également des claviers capables d'enregistrer des séquences de touches.

0 votes

Euhhh... comment le bot pourrait-il savoir où se trouvent les obstacles du jeu, ou les ennemis, il semble qu'un bot qui suivrait simplement et aveuglément une série d'instructions serait inutile

0 votes

@altCognito dans le cas de l'émulation des frappes, il faudrait "entraîner" le robot pour qu'il connaisse les limites de sa trajectoire, de son ciblage, de son interaction, etc. D'une certaine manière, l'ensemble des instructions est littéralement "l'utilisation". Si les instructions ne produisent aucun résultat positif, elles sont en effet inutiles.

4voto

SpliFF Points 21945

Le plus grand défaut de ce concept n'est pas l'entrée, mais la sortie du jeu. Votre robot ne peut pas se contenter d'appuyer sur des touches au hasard, il doit savoir ce qui se passe. Très peu de jeux permettent d'interroger ces données, ce qui obligerait votre robot à résoudre un problème très délicat : convertir 60 images par seconde de données visuelles en 2D en un espace virtuel.

Il existe actuellement des jeux qui non seulement autorisent les robots, mais les encouragent. Ouvrir RTS est l'un d'entre eux, mais il en existe d'autres plus simples comme GUN-TACTYX y crobots qui sont de bons points de départ.

1 votes

Dans les jeux multijoueurs, il est souvent possible de lire les conversations sur le réseau et de comprendre ce qui se passe.

2voto

Alan Haggai Alavi Points 34260

Les bots agiront en tant que clients du jeu (serveur). Ils peuvent donc envoyer des données appropriées, tout comme un utilisateur peut le faire manuellement. Le bot (client) analysera les données du serveur ("quelqu'un est sur le point d'attaquer par la gauche"), etc. Le client devrait alors être en mesure de calculer le meilleur mouvement et d'envoyer les données appropriées au serveur pour qu'il l'exécute.

Je ne suis pas sûr que cela fonctionne avec tous les jeux.

0 votes

Il fonctionnera avec tous les jeux, à condition que vous ayez accès aux spécifications du protocole utilisé par un jeu particulier ou que vous puissiez les trouver... Naturellement, pour certains jeux, c'est beaucoup plus difficile que pour d'autres. (Pensez à World of Warcraft par rapport à un serveur d'échecs ASCII).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X