Aller au contenu


Photo

Je M'essaie Pour Un Petit Bot - Tribalwars


  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 Cherenkov

Cherenkov

    Gamer lvl 2

  • Membres
  • 165 messages

Posté 08 March 2013 - 04:19

Bonjour,

Pour apprendre à faire un bot je me suis dis que ça pourrait être plus amusant de faire un bot facile à faire pour un jeux simple.

Le jeux en question est un jeux online tribalwars.net.

Voici une image du lieu d'envoi des troupes étant la tâche la plus répétitive du jeux.

Image IPB

Il faut que j'entre:
1. Les troupes à envoyer (dans ce cas-ci disons 5 - c'est tout ce que j'ai :( ).
2. les coordonnées en X et Y
3. On répète mais avec d'autres coordonnés.
4. Le bot s'arrête quand il n'y a plus de troupes (donc au final c'est le numéro trois et ce point c'est la condition d'arrêt de la boucle).


Jusqu'ici voici mon bout de code:
;Local $pos = MouseGetPos()
;MsgBox(0, "Mouse x,y:", $pos[0] & "," & $pos[1])

Const $xcoord=388
Const $ycoord=759

Mousemove(1225,374,0)
mouseclick("left")
send(22)
Mousemove(1221,543,3)
mouseclick("left")
send($xcoord)
;Mousemove(1295,560,5)
;mouseclick("left")
sleep(300)
send($ycoord)
;Mousemove(1530,557,5)
Send("{TAB}")
send("{ENTER}")


Ne marche que pour une coordonné. Je n'ai pas trouvé comment faire pour demander au programme de lire une liste que je peux éditer (et donc rajouter au fur et à mesure des coordonnés).

Pour que le bot sache combien de fois il doit envoyer un certain nombre de troupes avant de s'arrêter j'ai pensé à un truc du style:
const $5unit=InputBox("","Combien d'hommes de pique?")
const $unit=$5unit/=5

Ça ne marchera que pour des multiples de 5 (puisque dans le code ci-haut on envoi des paquets de 5 hommes par attaques).
La valeur $unit servira à mettre fin à la boucle (je ne sais pas laquelle? Do/Until peut-être?).

Bon bref, premiers 24h d'autoit, je sais que j'en demande beaucoup. Pas besoin de me répondre en entier; une toute petite aide est la bienvenue!

En passant vous remarquerez que il y a des ;, les actions ont été remplacé par soit Tab ou simplement parce que dans le cas des coordonnés en Y, une fois la case en X remplie on passe à celle en Y.

#2 Anakha

Anakha

    Khon

  • Admin Gms
  • 3286 messages
  • Location :Grenoble
  • Trade : Mediator

Posté 08 March 2013 - 15:45

Déjà première règle :
Il faut que tu sache dans quel mode de coordonnées tu es et tu utilise : Pour ça, cherche du côté de la fonction Opt() et des options "MouseCoordMode".

Ensuite :
- tu n'as aucune sleep ! Le bot va tenter d'enchainer les actions : gros risques d'erreurs.
- tu peux faire un mouseclick a une position, au lieu de move/click

;Local $pos = MouseGetPos()
;MsgBox(0, "Mouse x,y:", $pos[0] & "," & $pos[1])

Global $xcoord=388
Global $ycoord=759

MouseClick("left",1225,374) 
Sleep(100)
Send(22)
Sleep(100)
MouseClick("left",1221,543)
Sleep(100)
send($xcoord)
Sleep(100)
MouseClick("left",1295,560)
Sleep(100)
Send($ycoord)
Sleep(100)
MouseClick("left",1530,557)
Sleep(200)
Send("{TAB}")
Sleep(100)
send("{ENTER}")

Pour ta liste de coordonnées, tu vas t'embêter plus qu'autre chose. Ceci dis tu peux faire quelque chose du genre :

Local $coords[3][2] = [ _
					   [1225,374], _
					   [1221,543], _
					   [1295,560] _
					  ]	
					  
MouseClick("left",$coords[0][0],$coords[0][1]) 
Sleep(100)
Send(22)
Sleep(100)
MouseClick("left",$coords[1][0],$coords[1][1])
Sleep(100)
send($xcoord)
Note: les _ permettent de faire des déclaration de tableau sur plusieurs lignes, sinon tout doit être sur la même ligne.


Enfin pour ton nombre "d'homme de pique" tu prend le problème à l'envers je pense : au lieu de donner un nombre et /5, le plus simple c'est faire l'inverse
Global $unit	= InputBox("","Combien de groupe de 5 hommes de pique voulez vous envoyer ?")
Global $5unit	= $unit * 5

Au passage sinon, c'est
Global $unit=$5unit / 5
la syntaxe correcte, pas
Global $unit=$5unit/=5

Enfin, il est recommandé dans AutoIT d'utilisé Local et Global dans tes déclaration de variable, évite les "const" et "dim" qui sont trop ambigu.
  • Cherenkov aime ceci

Aucun support ne sera fait en privé. Si vous avez un problème, faites un post.

 Ne pas hésiter à mettre un petit (+) si mon post vous plait ou vous a servi !

#3 Cherenkov

Cherenkov

    Gamer lvl 2

  • Membres
  • 165 messages

Posté 08 March 2013 - 17:19

Gros merci!

Concernant la déclaration de variable, je peux tout déclaré en global or?
Dans le tuto j'ai relu plusieurs fois mais sans exemple concret je n'ai pas bien saisi l'utilité des variable local c-à-d que j'ai bien compris qu'elles permettent d'être utiliser localement dans une fonction sans affecter la constante globale. Si je comprend, on peut tout aussi bien créer d'autre constantes globale il me semble?

Pour en revenir au tableau des coordonnés, à chaque fois que le bot entre une valeur es-ce que je dois réécrire le bout de code mais avec différentes coordonnés?
Je n'ai pas beaucoup de coordonnés de village pour le moment mais plus tard ça risque d'augmenter. Bref, j'avais pensé que le programme resterait actif et dès que des troupes reviennent, ils les envoient à la prochaine coordonné de la liste (une qui n'a pas encore été utilisé). Il doit donc savoir où il est rendu dans sa liste de coordonnés et c'est le problème que je vois de ''multiplier'' le code pour différente valeurs puisqu'il va exécuter l'action sans qu'il puisse avoir de questionnement style ''où je suis rendu dans la liste'', ''y a t'il assez de troupe (si un jour le bot doit détecter le retour des troupes)''. Mais bon c'est trop complexe pour moi pour le moment je crois :P

Dans le future je vois un bot qui détecterait le retour des troupes et les enverraient à des destinations une par une dans une liste. Ça, ça serait un vrai bot.

#4 Anakha

Anakha

    Khon

  • Admin Gms
  • 3286 messages
  • Location :Grenoble
  • Trade : Mediator

Posté 08 March 2013 - 19:24

Pour l'exemple Local / Global, l'exemple suivant devrait t'aider à comprendre :

Func testGlobal()
	$test = 10
	ConsoleWrite("func testGlobal : " & $test & @CRLF)
EndFunc

Func testLocal()
	Local $test
	$test = 11
	ConsoleWrite("func testLocal : " & $test &@CRLF)
EndFunc

Global $test
$test = 5
ConsoleWrite("hors fonction  : " &$test &@CRLF)
testGlobal()
ConsoleWrite("hors fonction  : " &$test &@CRLF)
testLocal()
ConsoleWrite("hors fonction  : " &$test &@CRLF)

Résultat :

hors fonction : 5
func testGlobal : 10
hors fonction : 10
func testLocal : 11
hors fonction : 10



Pour la detection : plusieurs choix : pixelSearch, lecture de l'html pour trouver l'info que tu cherches. Après le reste ça dépend de ton besoin. Perso j'aime pas les tableau de coords, c'est pas pratique a utiliser

Aucun support ne sera fait en privé. Si vous avez un problème, faites un post.

 Ne pas hésiter à mettre un petit (+) si mon post vous plait ou vous a servi !

#5 Cherenkov

Cherenkov

    Gamer lvl 2

  • Membres
  • 165 messages

Posté 08 March 2013 - 21:26

Merci encore!

Je me suis mis au pixelsearch pour trouver mes coordonnés. Ça va mieux en effet ^^

Le plus gros problème présentement c'est d'être capable de faire une loop avec ma variable x et y qui change.

Style:

Do

Envoi 5 spear
X = xxx
Y = yyy

Until (compteur égale à la valeur calculée en fonction de $unit)

où xxx = (111,222,333, ..., nnn) et yyy=(111,222,333,...,nnn)
bref, à chaque boucle il insère une valeur différente.

J'ai regardé dans les forums et il ne semble pas y avoir de solu :S

J'ai l'impression que c'est pas possible avec autoit. Devrais-je m'essayer avec C/C++?

#6 Cherenkov

Cherenkov

    Gamer lvl 2

  • Membres
  • 165 messages

Posté 09 March 2013 - 00:41

Un petit update:

;script farm

Global $xcoord[2]= [388,399]
Global $ycoord[2]= [759,780]

Global $couleur=0x655C58 ;spearman
Global $couleur=0xFAD2D2 ;coords X

For $i= 0 to 1
$pos = PixelSearch(0,0,1920,1200,$couleur)
mouseclick("left",$pos[0]+30,$pos[1]+10)  
;MouseClick("left",1225,338) 
Sleep(100)
Send(22)
Sleep(100)
;MouseClick("left",1221,506) coordx
$pos = PixelSearch(0,0,1920,1200,$couleur) ;search red color on attack
mouseclick("left",$pos[0]-300,$pos[1]+10) ;click on x coord
Sleep(100)
send($xcoord[$i])
Sleep(200)
Send($ycoord[$i])
Sleep(100)
Send("{TAB}")
Sleep(100)
send("{ENTER}")
Sleep(2000)
Next

Bon le code merde mais il entre des valeurs différente et fait deux boucles!
Voilà pour ceux qui seraient intéressés par la solution :)