{"id":62,"date":"2020-01-14T09:25:12","date_gmt":"2020-01-14T08:25:12","guid":{"rendered":"https:\/\/tutos.jusdeliens.com\/?p=62"},"modified":"2020-01-14T09:25:12","modified_gmt":"2020-01-14T08:25:12","slug":"pytactx-prise-en-main","status":"publish","type":"post","link":"https:\/\/tutos.jusdeliens.com\/index.php\/2020\/01\/14\/pytactx-prise-en-main\/","title":{"rendered":"Prise en main de l&#8217;API PytactX \ud83d\ude80"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2024\/01\/TactX.gif\" alt=\"\" class=\"wp-image-516\"\/><\/figure><\/div>\n\n\n\n<p>Vous souhaitez vous initier \u00e0 la programmation avec Python tout en vous amusant ? <\/p>\n\n\n\n<p>Dans ce tutoriel, vous allez apprendre comment programmer un robot virtuel gladiateur (i.e. un agent) dans une ar\u00e8ne de jeu TactX, pour lui transmettre de l&#8217;intelligence afin de lui permettre d&#8217;affronter  les agents ennemis en temps r\u00e9el, et tout ceci de mani\u00e8re autonome.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\" id=\"connexion\">\ud83c\udf10 Connexion \u00e0 une ar\u00e8ne du jeu<\/h2>\n\n\n\n<p>Avant de se lancer dans le combat dans l&#8217;ar\u00e8ne, il vous faut d&#8217;abord obtenir vos identifiants. Pour cela, rien de plus simple, \ud83d\udc49<a href=\"https:\/\/jusdeliens.com\/ideal-free\" target=\"_blank\" rel=\"noreferrer noopener\">renseignez votre Pr\u00e9nom, Nom et Email dans ce formulaire<\/a>. Vous recevrez vos identifiants gratuitement sous 48h.<\/p>\n\n\n\n<p>Une fois re\u00e7us par mail, \u00e0 vos claviers et neurones ! Sur <a href=\"https:\/\/play.jusdeliens.com\" target=\"_blank\" rel=\"noreferrer noopener\">play.jusdeliens.com<\/a> renseignez vos username et password communiqu\u00e9s par mail, puis s\u00e9lectionnez l&#8217;ar\u00e8ne que vous souhaitez rejoindre.<\/p>\n\n\n\n<p>L&#8217;acc\u00e8s aux ar\u00e8nes publiques est enti\u00e8rement gratuit mais limit\u00e9. Elles sont ouvertes \u00e0 l&#8217;occasion d&#8217;affrontements ou de formations jusdeliens dont les dates vous seront communiqu\u00e9es via la newsletter (\ud83d\udc49<a href=\"https:\/\/jusdeliens.com\/newsletter-challenges\/\" target=\"_blank\" rel=\"noreferrer noopener\">par ici pour vous abonner<\/a>).<\/p>\n\n\n\n<p>Pour plus de libert\u00e9, vous pouvez <a href=\"https:\/\/jusdeliens.com\/ideal-tarifs\/\" target=\"_blank\" rel=\"noreferrer noopener\">cr\u00e9er votre propre ar\u00e8ne priv\u00e9e<\/a> h\u00e9berg\u00e9e sur un serveur jusdeliens, ouverte 24h\/24, 7 jours sur 7 et accessible dans le monde entier avec IDEAL Arena. Dans ce cas, votre ar\u00e8ne priv\u00e9e sera uniquement accessible \u00e0 ceux \u00e0 qui vous communiquerez son nom.<\/p>\n\n\n\n<p>Pour les plus t\u00e9m\u00e9raires, un tutoriel sera bient\u00f4t mis en ligne pour cr\u00e9er votre ar\u00e8ne et l&#8217;h\u00e9berger sur votre serveur priv\u00e9 (avec OVH ou free). Vous pouvez aussi vous \ud83d\udc49<a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">inscrire \u00e0 notre <\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">p<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">r<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">o<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">c<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">h<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">a<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">i<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">n<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">e<\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\"> <\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/jusdeliens.com\/formations-animations\/\" target=\"_blank\">session de formation.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udc63 Vos premiers pas<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"module\">\ud83d\udcda Les modules<\/h3>\n\n\n\n<p>Premier concept \u00e0 ma\u00eetriser : la notion de module en python. <\/p>\n\n\n\n<p>Un module en programmation (appel\u00e9 encore librairie) est un fichier d\u00e9velopp\u00e9 par d&#8217;autres personnes. Il contient un autre programme que vous allez pouvoir utiliser dans votre programme principale. Son int\u00e9r\u00eat principal est de vous faire gagner du temps pour ne pas avoir \u00e0 tout recoder vous-m\u00eame.<\/p>\n\n\n\n<p>Pour jouer dans une ar\u00e8ne TactX, on va importer le module pytactx contenu dans un autre fichier, \u00e0 c\u00f4t\u00e9 de votre fichier main dans l&#8217;arborescence du projet.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2020\/01\/Capture-decran-2024-01-17-133209.png\" alt=\"\" class=\"wp-image-521\"\/><figcaption>Le fichier main.py contient votre programme principal, c&#8217;est dedans que vous d\u00e9velopperez votre programme. Le fichier agent.py dans le dossier j2l\/pytactx contient tout ce qu&#8217;il vous faut pour jouer. L&#8217;extension .py signifie programme PYthon.<\/figcaption><\/figure>\n\n\n\n<p>Dans le fichier main.py, ajoutons donc au d\u00e9but du programme la ligne suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import j2l.pytactx.agent as pytactx<\/code><\/pre>\n\n\n\n<p>Et voil\u00e0 ! Nous pouvons d\u00e9sormais cr\u00e9er notre agent pour combattre dans l&#8217;ar\u00e8ne !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"variables\">\ud83d\udcbe Les variables<\/h3>\n\n\n\n<p>Pour incarner notre agent, il nous faut ma\u00eetriser un 2e concept : la notion de variable. <\/p>\n\n\n\n<p>Dans un programme, une variable est comme une bo\u00eete de rangement. Elle vous permet de stocker une information (un texte, un nombre, une image &#8230;) afin de la manipuler par la suite. On donne un nom \u00e0 cette bo\u00eete afin de pouvoir s&#8217;en servir par la suite.<\/p>\n\n\n\n<p>Dans le module pytactx, la premi\u00e8re variable \u00e0 cr\u00e9er est votre agent. Pour cr\u00e9er cette variable nomm\u00e9e &#8220;agent&#8221; en Python, on utilise l&#8217;op\u00e9rateur \u00e9gal &#8220;=&#8221; (dit aussi op\u00e9rateur d&#8217;affectation). Cette op\u00e9rateur va nous permettre de placer dans notre &#8220;bo\u00eete&#8221; agent ce qu&#8217;il y a \u00e0 droite du \u00e9gal (on dit qu&#8217;on initialise la variable).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>agent = pytactx.Agent(playerId=\"LeNomDeMonSuperAgent\", username=\"VotreUserName\", password=\"VotrePassword\", arena=\"nomDeLArene\")<\/code><\/pre>\n\n\n\n<p>L&#8217;expression \u00e0 droite permet de cr\u00e9er votre agent et de le connecter \u00e0 l&#8217;ar\u00e8ne de jeu. A vous de remplacer les caract\u00e8res entre guillemets:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&#8220;LeNomDeMonSuperAgent&#8221; : c&#8217;est le nom de votre agent qui apparaitra dans l&#8217;ar\u00e8ne<\/li><li>&#8220;VotreUserName&#8221; : \u00e0 remplacer par le username transmis par mail<\/li><li> &#8220;VotrePassword&#8221; : \u00e0 remplacer par le password transmis par mail <\/li><li> &#8220;NomDeLArene&#8221; : \u00e0 remplacer par le nom de l&#8217;ar\u00e8ne \u00e0 rejoindre<\/li><\/ul>\n\n\n\n<p>Une fois cr\u00e9\u00e9e, cette variable agent va notamment vous permettre d&#8217;acc\u00e9der aux variables de votre agent indiqu\u00e9e ci-dessous.  Attention par contre, ces variables sont en lecture seule, autrement dit vous ne pourrez pas les modifier directement ! (D\u00e9sol\u00e9 les tricheurs en herbe \ud83d\ude09 ) <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2024\/01\/image-1024x529.png\" alt=\"\" class=\"wp-image-505\"\/><figcaption>  Les variables de l&#8217;agent vous renseignent sur l&#8217;\u00e9tat de votre agent dans  le jeu. Elles ne sont accessibles qu&#8217;en lecture seule. Les nombres qu&#8217;elles contiennent sont des entiers positifs (type &#8216;int&#8217; pour  integer  en Python).  <\/figcaption><\/figure><\/div>\n\n\n\n<p>Gr\u00e2ce \u00e0 ces variables, vous pourrez modifier le comportement de votre agent en fonction de son environnement. Par exemple, si sa vie diminue, c&#8217;est &#8230; qu&#8217;il SE FAIT TIRER DESSUS !! Auquel cas, il serait pertinent de riposter !<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 Mais tu nous a pourtant dit qu&#8217;il n&#8217;\u00e9tait pas possible de les modifier directement ? <\/p><\/blockquote>\n\n\n\n<p>Et oui, pour les modifier, il faudra utiliser quelque chose d&#8217;autre de bien plus puissant, les fonctions !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fonctions\">\u2699\ufe0fLes fonctions<\/h3>\n\n\n\n<p>Heureusement, il est aussi possible de faire passer votre agent \u00e0 l&#8217;action ! 3e concept : les fonctions.<\/p>\n\n\n\n<p>Une fonction est un sous programme qui, d\u00e8s lors qu&#8217;on l&#8217;appelle, ex\u00e9cute une suite d&#8217;instructions. Vous pouvez cr\u00e9er vos propres fonctions, par exemple si vous souhaitez ordonner votre programme, ou appeler plusieurs fois la m\u00eame suite d&#8217;instructions (comme une routine ou une proc\u00e9dure). Vous pouvez aussi utiliser des fonctions que d&#8217;autres d\u00e9veloppeurs ont cod\u00e9es pour vous.<\/p>\n\n\n\n<p>Pour appeler une fonction en Python, il suffit d&#8217;\u00e9crire sur une nouvelle ligne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nomDeVotreFonction(parametre1, parametre2)<\/code><\/pre>\n\n\n\n<p>On reconnait une fonction par ses parenth\u00e8ses apr\u00e8s le nom de la fonction. Ces parenth\u00e8ses d\u00e9limitent les param\u00e8tres d&#8217;entr\u00e9e \u00e0 passer \u00e0 la fonction. Selon la fonction, le nombre de param\u00e8tres peut varier.  S&#8217;il y en a plusieurs, ils sont s\u00e9par\u00e9s par des virgules. Il peut ne pas avoir de param\u00e8tre du tout. Auquel cas, il n&#8217;y aura rien \u00e0 mettre en parenth\u00e8se <\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background-color:#fdfeff\"><code># Importe le module de maths pour faire des calculs complexes\nimport math\n\n# Appelle la fonction sqrt pour calculer la racine carr\u00e9 du nombre 4\nmath.sqrt(4)\n\n# Appelle la fonction pow pour calculer 2 \u00e0 la puissance 4 \nmath.pow(2,4) <\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 C&#8217;est quoi ces lignes qui commencent par des &#8216;#&#8217; ?<\/p><\/blockquote>\n\n\n\n<p>Ce sont des commentaires en python. Ce n&#8217;est pas du code qui sera ex\u00e9cut\u00e9, mais une aide pour mieux se rep\u00e9rer dans le code. Une bonne habitude \u00e0 prendre avant de coder est de toujours commencer par le commentaire, puis d&#8217;ajouter le code correspondant. De cette mani\u00e8re, si vous deviez reprendre votre code des mois plus tard, ou si un autre d\u00e9veloppeur devait reprendre votre travail, cela serait d&#8217;une aide consid\u00e9rable !<\/p>\n\n\n\n<p>Bon, pour le moment, nous allons nous contenter d&#8217;utiliser les fonctions de votre agent qui ont d\u00e9j\u00e0 \u00e9t\u00e9 d\u00e9velopp\u00e9es pour vous. Voici les principales :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2024\/01\/image-1-1024x530.png\" alt=\"\" class=\"wp-image-506\"\/><figcaption> Les fonctions de votre agent vous permettent de la faire agir pour changer son \u00e9tat. <\/figcaption><\/figure><\/div>\n\n\n\n<p>Pour tirer en rafale tout en d\u00e9pla\u00e7ant votre agent \u00e0 la colonne 6 en partant de la gauche et \u00e0 la ligne 7 en partant du haut de la grille, il faut donc \u00e9crire :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>agent.fire(True)\nagent.moveTowards(6,7)\nagent.update()<\/code><\/pre>\n\n\n\n<p>N&#8217;oubliez pas d&#8217;appeler la fonction <strong>update() <\/strong>une fois toutes vos actions effectu\u00e9es, afin d&#8217;envoyer votre demande au serveur.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 Tu as mis un &#8220;T&#8221; majuscule \u00e0 Towards c&#8217;est normal ?<\/p><\/blockquote>\n\n\n\n<p class=\"has-background\" style=\"background-color:#ead1d1\">\u26d4 <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Important<\/mark><\/strong><br>Oui, Python n&#8217;aime pas les caract\u00e8res sp\u00e9ciaux comme les espaces ou les accents dans les noms de variables et de fonctions. Du coup, on peut mettre une majuscule \u00e0 la place de l&#8217;espace, c&#8217;est la convention <strong>camelCase <\/strong>(comme les bosses du chameau \ud83d\udc2b), ou bien un underscore (le tiret du 8 qui rampe au sol comme un serpent \ud83d\udc0d) qui est la convention <strong>snake_case<\/strong>. Notez que Python est sensible \u00e0 la casse, donc <strong><s>agent.movetowards()<\/s><\/strong> ne marchera pas car la fonction est connu sous le nom <strong>agent.moveTowards()<\/strong>.<\/p>\n\n\n\n<p>Bien maintenant que vous savez comment cr\u00e9er votre agent, r\u00e9cup\u00e9rer ses variables d&#8217;\u00e9tat et le faire ex\u00e9cuter des actions, il ne reste plus qu&#8217;\u00e0 relier tout cela avec de belles structures conditionnelles !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"conditions\">\ud83d\udeaaLes structures conditionnelles<\/h3>\n\n\n\n<p>Et bien oui, c&#8217;est bien beau de savoir tirer mais vu votre nombre de munitions, il vaut mieux tirer uniquement quand un ennemi est devant vous non ? Et pour \u00e7a, il nous faut traduire l&#8217;expression suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Si un ennemi est devant nous\n    Alors on lui tire dessus en rafale\nSinon\n    On arr\u00eate de tirer en rafale pour \u00e9conomiser nos pr\u00e9cieuses munitions<\/code><\/pre>\n\n\n\n<p>Cette expression &#8220;Si Alors Sinon&#8221; est dite conditionnelle car l&#8217;action \u00e0 r\u00e9aliser d\u00e9pend d&#8217;une condition. En python, cette expression se traduirait par cela :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ( agent.distance != 0 ):\n     agent.tirer(True)\nelse:\n     agent.tirer(False)<\/code><\/pre>\n\n\n\n<p>Pour savoir si un ennemi est devant nous, nous comparons la variable d&#8217;\u00e9tat de l&#8217;agent &#8220;agent.distance&#8221;. Si elle est diff\u00e9rente de 0, c&#8217;est qu&#8217;un ennemi est devant dans la direction de notre agent. Si elle est \u00e9gale \u00e0 0, c&#8217;est qu&#8217;aucun ennemi n&#8217;est visible dans cette direction.<\/p>\n\n\n\n<p>En python, on peut r\u00e9aliser diff\u00e9rents tests \u00e0 l&#8217;aides des op\u00e9rateurs suivants.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table><tbody><tr><td>COMPARAISON<\/td><td>OP\u00c9RATEUR PYTHON<\/td><\/tr><tr><td>Strictement sup\u00e9rieur \u00e0<\/td><td>&gt;<\/td><\/tr><tr><td>Sup\u00e9rieur ou \u00e9gal \u00e0<\/td><td>&gt;=<\/td><\/tr><tr><td>Strictement inf\u00e9rieur \u00e0<\/td><td>&lt;<\/td><\/tr><tr><td>Inf\u00e9rieur ou \u00e9gal \u00e0<\/td><td>&lt;=<\/td><\/tr><tr><td>Egal \u00e0<\/td><td>==<\/td><\/tr><tr><td>Diff\u00e9rent de<\/td><td>!=<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 C&#8217;est normal que tu aies mis 2 signes \u00e9gal pour la comparaison &#8220;\u00e9gal \u00e0&#8221; ?<\/p><\/blockquote>\n\n\n\n<p>Absolument ! Souvenez vous, on a vu au d\u00e9but l&#8217;op\u00e9rateur d&#8217;affection &#8216;=&#8217; pour cr\u00e9er et initialiser une variable. Pour distinguer l&#8217;affection de la comparaison, python (comme d&#8217;autres langages) a fait le choix d&#8217;utiliser 2 signes \u00e9gal &#8216;==&#8217; pour la comparaison.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 Pourquoi as-tu mis &#8216;:&#8217; \u00e0 la fin du &#8216;if&#8217; et du &#8216;else&#8217; ?<\/p><\/blockquote>\n\n\n\n<p>En python les structures conditionnelles, ainsi que les boucles et d\u00e9finitions de fonctions sont des blocs. Comme les blocs qui s&#8217;encapsulent sous Scratch, un bloc un python commence par &#8216;:&#8217; . Les instructions \u00e0 ex\u00e9cuter dans ce bloc doivent \u00eatre pr\u00e9c\u00e9d\u00e9s d&#8217;une indentation.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2020\/01\/image-6.png\" alt=\"\" class=\"wp-image-84\"\/><figcaption>Bloc &#8220;Si Alors&#8221; en Scratch \u00e0 gauche, et le bloc conditionnel correspondant en python \u00e0 droite<\/figcaption><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 Une indentation ? Il faut que j&#8217;aille voir mon dentiste ?!<\/p><\/blockquote>\n\n\n\n<p>Une indentation permet une meilleur lisibilit\u00e9 du code. De cette mani\u00e8re on peut rapidement voir les blocs d&#8217;instructions qui seront ex\u00e9cut\u00e9s selon les conditions. En python, en plus des &#8216;:&#8217; au d\u00e9but du bloc, l&#8217;INDENTATION EST OBLIGATOIRE pour signifier que chaque instruction indent\u00e9e est \u00e0 ex\u00e9cuter dans le bloc sup\u00e9rieur qui la contient.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 Combien de caract\u00e8res espaces as-tu mis pour faire l&#8217;indentation ?<\/p><\/blockquote>\n\n\n\n<p class=\"has-background\" style=\"background-color:#ead1d1\">\u26d4 <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Important<\/mark><\/strong><br>Les indentations ne sont pas des caract\u00e8res d&#8217;espace comme les autres. Il est coutume d&#8217;utiliser la touche tabulation sur le clavier pour faire une indentation (la touche avec 2 fl\u00e8ches parall\u00e8les horizontales et oppos\u00e9es en haut \u00e0 gauche du clavier \u2194\ufe0f). C&#8217;est donc UN SEUL CARACT\u00c8RE TABULATION qui est recommand\u00e9, plut\u00f4t que plusieurs caract\u00e8res avec la touche espace.<\/p>\n\n\n\n<p>Bon maintenant que toutes ces notions sont comprises, on va pouvoir ex\u00e9cuter le code suivant.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import j2l.pytactx.agent as pytactx\n\nagent = pytactx.Agent(playerId=\"jusdeliens\", username=\"monUserName\", password=\"vousNeLeSaurezJamais!\", arena=\"leNomDeVotreArene\")\n\nif ( agent.distance != 0 ):\n     agent.fire(True)\nelse:\n     agent.fire(False)\n\nagent.update()<\/code><\/pre>\n\n\n\n<p>Sous repl.it, il ne vous reste plus qu&#8217;\u00e0 cliquer sur le bouton &#8220;Run&#8221; pour d\u00e9marrer votre programme.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2020\/01\/image-7.png\" alt=\"\" class=\"wp-image-88\"\/><figcaption>Lancement du programme sous repl.it en appuyant sur le bouton &#8220;Run&#8221;<\/figcaption><\/figure><\/div>\n\n\n\n<p>Dans la console (fen\u00eatre noire \u00e0 droite), entrer les informations demand\u00e9es puis entrer. Si la valeur par d\u00e9faut est correcte, tapez simplement entrer.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2020\/01\/image-9-1024x323.png\" alt=\"\" class=\"wp-image-90\"\/><figcaption>Entrez les informations demand\u00e9es dans la console puis entrer.<\/figcaption><\/figure><\/div>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 Il ne se passe rien dans l&#8217;ar\u00e8ne, je ne vois pas mon agent, c&#8217;est normal ?<\/p><\/blockquote>\n\n\n\n<p>C&#8217;est normal ! Nous avons oubli\u00e9 une derni\u00e8re chose !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"boucles\">\u27bfLes boucles<\/h3>\n\n\n\n<p>Si votre agent n&#8217;apparait pas, c&#8217;est parce le programme s&#8217;est termin\u00e9 trop vite. L\u2019interpr\u00e9teur python a bien ex\u00e9cut\u00e9 ligne par ligne le programme demand\u00e9, mais un fois arriv\u00e9e \u00e0 la ligne 13 le programme se termine.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud83e\udd14 Tu veux dire qu&#8217;on a oubli\u00e9 de lui dire de r\u00e9p\u00e9ter nos instructions pour ne pas s&#8217;arr\u00eater ?<\/p><\/blockquote>\n\n\n\n<p>Exactement ! Et pour \u00e7a, il nous faut ma\u00eetriser un dernier concept : les boucles !<\/p>\n\n\n\n<p>&#8220;R\u00e9p\u00e9ter tant que&#8221;, &#8220;r\u00e9p\u00e9ter pour chaque valeur de 0 jusqu&#8217;\u00e0 10&#8221;, voici de nouveaux blocs qui nous permettront d&#8217;enrichir nos programmes ! <\/p>\n\n\n\n<p>On distingue 2 types de boucles : les born\u00e9es et les non born\u00e9es.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>les boucles born\u00e9es : r\u00e9p\u00e8te des instructions pour un nombre d&#8217;it\u00e9rations donn\u00e9es. Par exemple : &#8220;r\u00e9p\u00e9ter 10 fois&#8221;<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2020\/01\/image-11.png\" alt=\"\" class=\"wp-image-92\"\/><figcaption>Boucle born\u00e9e en Scratch \u00e0 gauche, et bloc \u00e9quivalent en Python \u00e0 droite. Les commentaires entre 3 doubles guillemets sont \u00e0 remplacer par une ou plusieurs instructions sans les guillemets.<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>les boucles non-born\u00e9es : r\u00e9p\u00e8te des instructions tant qu&#8217;une condition est vraie ou jusqu&#8217;\u00e0 ce qu&#8217;une condition soit fausse. Par exemple : &#8220;r\u00e9p\u00e9ter tant que mon agent est en vie&#8221;<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2020\/01\/image-10.png\" alt=\"\" class=\"wp-image-91\"\/><figcaption> Boucle non born\u00e9e en Scratch \u00e0 gauche, et bloc \u00e9quivalent en Python \u00e0 droite. Les commentaires entre  3 doubles guillemets sont \u00e0 remplacer par des conditions et instructions sans les guillemets. <\/figcaption><\/figure><\/div>\n\n\n\n<p>Comme les structures conditionnelles, les boucles sont des blocs. En python, elle commence donc par un test suivi de &#8216;:&#8217; puis chaque instruction du bloc est indent\u00e9e d&#8217;une tabulation par rapport au bloc sup\u00e9rieur la contenant.<\/p>\n\n\n\n<p>Parfait ! Maintenant, votre 1er programme fonctionnel !<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import j2l.pytactx.agent as pytactx\n\nagent = pytactx.Agent(playerId=\"jusdeliens\", username=\"monUserName\", password=\"vousNeLeSaurezJamais!\")\n\nwhile (agent.life&gt; 0 ):\n     if ( agent.distance != 0 ):\n          agent.fire(True)\n     else:\n          agent.fire(False)\n\n     agent.update()<\/code><\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2020\/01\/image-12-1024x333.png\" alt=\"\" class=\"wp-image-94\"\/><\/figure><\/div>\n\n\n\n<p>Vous devriez voir appara\u00eetre votre agent sur la grille \u00e0 une position al\u00e9atoire. Premier constat, il ne fait pas grand chose &#8230; Normal, car il attend qu&#8217;un ennemi se pr\u00e9sente devant lui pour tirer !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aleatoire\">\ud83c\udfb2 L&#8217;al\u00e9atoire comme strat\u00e9gie de d\u00e9placement<\/h3>\n\n\n\n<p>Pour animer votre agent, je vous propose de le faire se d\u00e9placer de mani\u00e8re al\u00e9atoire sur la grille en utilisant le module random en python.<\/p>\n\n\n\n<p>Comme le serveur de jeu contraint les d\u00e9placements aux cases adjacentes (c&#8217;est \u00e0 dire que votre agent ne peut se d\u00e9placer que comme un roi sur un \u00e9chiquier), il va falloir g\u00e9n\u00e9rer un x et y al\u00e9atoire en + ou &#8211; 1 autour de la position de votre agent.<\/p>\n\n\n\n<p>Par exemple, si votre position (x,y) est (6,7) alors il faudrait g\u00e9n\u00e9rer un couple (x,y) al\u00e9atoire parmi les valeurs suivantes : (6,7) ,  (5,7) , (5,6) , (6,6) ,  (7,6) , (7,7) , (7,8) , (6,8) , (5,8). <\/p>\n\n\n\n<p>Cela revient \u00e0 g\u00e9n\u00e9rer 2 nombres al\u00e9atoire :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>dx = 1er nombre al\u00e9atoire compris entre -1 et +1 inclus. <\/li><li>dy = 2e nombre al\u00e9atoire compris entre -1 et +1 inclus.<\/li><\/ul>\n\n\n\n<p>En python, on g\u00e9n\u00e8re un nombre al\u00e9atoire \u00e0 l&#8217;aide de la fonction randint du module random de la fa\u00e7on suivante. Cette fonction attend 2 param\u00e8tres : un minimum et un maximum. Elle renvoie ensuite un nombre entier al\u00e9atoire compris entre le min et le max inclus.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import random\n\ndxAleatoire = random.randint(-1,1)<\/code><\/pre>\n\n\n\n<p>On fait de m\u00eame pour changer l&#8217;orientation de mani\u00e8re al\u00e9atoire entre 0 (droite) et 3 (bas) et voici le r\u00e9sultat en python :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import j2l.pytactx.agent as pytactx\nimport random\n\n# Cr\u00e9ation de l'agent et connexion \u00e0 l'ar\u00e8ne\nagent = pytactx.Agent(playerId=\"jusdeliens\", username=\"monUserName\", password=\"vousNeLeSaurezJamais!\")\n\n# R\u00e9p\u00e9ter tant que votre agent est en vie\nwhile agent.life &gt; 0:\n  # Tirer si ennemie visible\n  if ( agent.distance != 0 ):\n    agent.fire(True)\n  else:\n    agent.fire(False)\n\n  # D\u00e9placer et orienter de mani\u00e8re al\u00e9atoire\n  dx = random.randint(-1,1)\n  dy = random.randint(-1,1)\n  agent.move(dx, dy)\n  dir = random.randint(0,3)\n  agent.lookAt(dir)\n\n  # Envoyer les ordres au serveur\n  agent.update()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee3\ufe0f Et apr\u00e8s ?<\/h2>\n\n\n\n<p>Vous avez aim\u00e9 ce tutoriel et vous en voulez d&#8217;autres ? <\/p>\n\n\n\n<p>Faites le nous savoir en <strong>\ud83d\udc49<\/strong> <a href=\"https:\/\/g.page\/r\/CQoJnRiyLqsqEB0\/review\">donnant vos avis et vos envies<\/a> et nous nous empresserons de vous en r\u00e9digez d&#8217;autres \ud83d\ude09<\/p>\n\n\n\n<p>C\u2019est fini pour ce tutoriel ! A vous de <a href=\"https:\/\/play.jusdeliens.com\" target=\"_blank\" rel=\"noreferrer noopener\">jouer<\/a> maintenant \ud83d\ude09<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/jusdeliens.com\/wp-content\/uploads\/2019\/01\/R2D2.gif\" alt=\"\" class=\"wp-image-355\"\/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Vous souhaitez vous initier \u00e0 la programmation avec Python tout en vous amusant ? Dans ce tutoriel, vous allez apprendre comment programmer un robot virtuel gladiateur (i.e. un agent) dans une ar\u00e8ne de jeu TactX, pour lui transmettre de l&#8217;intelligence afin de lui permettre d&#8217;affronter les agents ennemis en temps r\u00e9el, et tout ceci de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":514,"comment_status":"closed","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,7],"tags":[],"class_list":["post-62","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-tactx"],"_links":{"self":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/posts\/62","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/comments?post=62"}],"version-history":[{"count":0,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/posts\/62\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/"}],"wp:attachment":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/media?parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/categories?post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/tags?post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}