{"id":7,"date":"2019-07-23T10:08:39","date_gmt":"2019-07-23T08:08:39","guid":{"rendered":"http:\/\/tutos.jusdeliens.com\/?p=1"},"modified":"2019-07-23T10:08:39","modified_gmt":"2019-07-23T08:08:39","slug":"simulateur-ia","status":"publish","type":"post","link":"https:\/\/tutos.jusdeliens.com\/index.php\/2019\/07\/23\/simulateur-ia\/","title":{"rendered":"Sauver la plan\u00e8te en C++ \ud83c\udf0d"},"content":{"rendered":"\n<p>Ils nous faut \u00eatre pr\u00eats pour le prochain assaut des extraterrestres ! Et pour cela, rien de mieux que de s&#8217;entra\u00eener sur un simulateur de robot et d&#8217;intelligences artificielles en C++ !  <\/p>\n\n\n\n<p>A vos claviers et souris, on commence ici ! <\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Pr\u00e9requis<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Un ordinateur sous Windows 10 avec les droits administrateur<\/li><li>De bonnes notions en C++ (<a href=\"https:\/\/openclassrooms.com\/fr\/courses\/1894236-programmez-avec-le-langage-c\">partie 1 et 2 du super tuto OpenClassroom<\/a>) <\/li><li>De la patience et une volont\u00e9 de fer pour vaincre les envahisseurs !<\/li><\/ul>\n\n\n\n<p class=\"has-very-light-gray-background-color has-background\">N\u2019h\u00e9sitez pas \u00e0 me contacter <a href=\"https:\/\/jusdeliens.com\/contact\/\">ici<\/a> pour toutes questions sur les notions de C++. A votre disposition si vous souhaitez aussi des cours particuliers \ud83d\ude09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation de l&#8217;environnement de d\u00e9veloppement<\/h3>\n\n\n\n<p>On utilisera Code::Blocks comme environnement avec le compilateur mingw t\u00e9l\u00e9chargeable depuis ce <a href=\"http:\/\/sourceforge.net\/projects\/codeblocks\/files\/Binaries\/17.12\/Windows\/codeblocks-17.12mingw-setup.exe\">lien<\/a>.<\/p>\n\n\n\n<p>Pour bien comprendre comment installer et utiliser l&#8217;IDE, je vous renvoie sur le <a href=\"https:\/\/openclassrooms.com\/fr\/courses\/1894236-programmez-avec-le-langage-c\/1894601-installez-les-logiciels-necessaires-pour-programmer\">tutoriel d&#8217;openclassroom<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">R\u00e9cup\u00e9ration des sources du simulateur<\/h3>\n\n\n\n<p>Entrez votre nom, pr\u00e9nom et mail puis cliquer sur le bouton t\u00e9l\u00e9charger pour obtenir les sources.<\/p>\n\n\n<p>[wpforms id=&#8221;17&#8243; title=&#8221;false&#8221; description=&#8221;false&#8221;]<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Compilation du projet<\/h3>\n\n\n\n<p>Une fois l&#8217;archive .zip t\u00e9l\u00e9charg\u00e9e, d\u00e9compressez-la, puis ouvrez le fichier j2l-SimulateurIA.workspace via double-clic.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2019\/07\/jusdeliens-d\u00e9compression-archive.png\" alt=\"\" class=\"wp-image-30\"\/><figcaption>D\u00e9compressions de l&#8217;archive zip une fois t\u00e9l\u00e9charg\u00e9e<\/figcaption><\/figure>\n\n\n\n<p class=\"has-very-light-gray-background-color has-background\">Ouvrez bien le fichier avec l&#8217;extension .workspace (et non le fichier projet .cpb). Si l&#8217;extension n&#8217;est pas visible, dans l\u2019Explorateur de fichiers -&gt; Affichage -&gt; Afficher\/Masquer cocher Extensions de nom de fichiers.<\/p>\n\n\n\n<p class=\"has-very-light-gray-background-color has-background\">Si le double-clic n&#8217;ouvre pas automatiquement Code::Blocks, ouvrez Code::Blocks manuellement, puis glisser-d\u00e9poser le fichier  j2l-SimulateurIA.workspace dans la fen\u00eatre.<\/p>\n\n\n\n<p>Une fois ouvert, dans la fen\u00eatre &#8220;Management&#8221; vous devriez voir les sources du projet j2l-SimulateurIA, tri\u00e9es dans 3 dossiers virtuels :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"http:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2019\/07\/image-1.png\" alt=\"\" class=\"wp-image-31\"\/><figcaption>Arborescence du projet <\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Agent : Contient les sources de vos classes agents, classes qui devront impl\u00e9menter l\u2019intelligence artificiel d\u00e9crivant comment les entit\u00e9s du jeu vont agir de mani\u00e8re autonome <\/li><li>Jeu : Contient les variables et fonctions pour interagir avec le jeu ; Vous ne pouvez pas modifier ces sources (les r\u00e8gles du jeu sont imp\u00e9n\u00e9trables ^^)<\/li><li>MoteurRendu : Contient vos classes pour afficher les rendus et animations de vos agents<\/li><\/ul>\n\n\n\n<p>Pour lancer l&#8217;application et voir les agents \u00e9voluer dans le jeu, cliquez Build -&gt; Build and run (ou le raccourci clavier F9). Des lignes de commande devraient appara\u00eetre dans la fen\u00eatre &#8220;Logs &amp; others&#8221;, puis l&#8217;application devrait d\u00e9marrer en plein \u00e9cran.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Modifier le comportements des agents<\/h3>\n\n\n\n<p>Pour cela, explorons la classe AgentSpecial impl\u00e9ment\u00e9e dans les fichiers AgentSpecial.cpp et AgentSpecial.hpp.<\/p>\n\n\n\n<p>Dans le fichier header  (le fichier d&#8217;en-t\u00eate avec l&#8217;extension .hpp), vous trouverez les signatures des m\u00e9thodes et attributs de la classe AgentSpecial. Tandis que dans le fichier .cpp, vous trouverez l&#8217;impl\u00e9mentation (le code) de chaque fonctions de la classe (les m\u00e9thodes). <\/p>\n\n\n\n<p class=\"has-very-light-gray-background-color has-background\">En g\u00e9n\u00e9ral, un header donne les informations aux utilisateurs pour savoir comment utiliser une classe, mais ne livre surtout pas le secret de fabrication cach\u00e9 dans le fichier cpp.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class AgentSpecial:\n    public j2l::Agent\n{\n    public:\n        AgentSpecial(int x, int y, int orientation);\n        virtual ~AgentSpecial() {}\n        const char* nom() const;\n\n    protected:\n        void quandActualiser();\n        void quandDistanceFrontaleChange(int ancienneValeur, int nouvelleValeur);\n        void quandMunitionsChange(int ancienneValeur, int nouvelleValeur);\n        void quandVieChange(int ancienneValeur, int nouvelleValeur);\n        void quandPoseChange(int ancienX, int ancienY, int ancienneOrientation, int nouvelX, int nouvelY, int nouvelleOrientation);\n};<\/code><\/pre>\n\n\n\n<p>Les deux premi\u00e8res lignes indiquent que la classe AgentSpecial h\u00e9rite des m\u00e9thodes et attributs de la classe Agent, impl\u00e9ment\u00e9e dans l&#8217;espace de nom j2l. Cela signifie que cette classe fille contient aussi les m\u00e9thodes et attributs de la classe parente Agent, d\u00e9finis dans le fichier Agent.hpp. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Agent\n\t{\n\t\tpublic:\n\t\t\tAgent(int x, int y, int orientation);\n\t\t\tvirtual ~Agent() {}\n\t\t\tvoid actualiser(int x, int y, int orientation, int distance, int vie, int munitions, int&amp; ordreX, int&amp; ordreY, int&amp; ordreOrientation, bool&amp; ordreTir);\n\t\t\tvoid orienter(int orientation);\n\t\t\tvoid deplacer(int x, int y);\n\t\t\tvoid tirer(bool tirerOuNon);\n\t\t\tint munitionsRestantes() const;\n\t\t\tint viesRestantes() const;\n\t\t\tint munitionsInitiales() const;\n\t\t\tint viesInitiales() const;\n\t\t\tint distanceFrontale() const;\n\t\t\tint x() const;\n\t\t\tint y() const;\n\t\t\tint orientation() const;\n\t\t\tvirtual const char* nom() const;\n\n\t\tprotected:\n\t\t\tvirtual void quandActualiser() {}\n\t\t\tvirtual void quandDistanceFrontaleChange(int ancienneValeur, int nouvelleValeur) {}\n\t\t\tvirtual void quandMunitionsChange(int ancienneValeur, int nouvelleValeur) {}\n\t\t\tvirtual void quandVieChange(int ancienneValeur, int nouvelleValeur) {}\n\t\t\tvirtual void quandPoseChange(int ancienX, int ancienY, int ancienneOrientation, int nouvelX, int nouvelY, int nouvelleOrientation) {}\n\t};<\/code><\/pre>\n\n\n\n<p>Cependant elle ne pourra acc\u00e9der qu&#8217;aux m\u00e9thodes et attributs public et  protected (private \u00e9tant accessible uniquement \u00e0 l\u2019int\u00e9rieur des  m\u00e9thodes la classe Agent). <\/p>\n\n\n\n<p>\u00c9l\u00e9ments int\u00e9ressants, la classe Agent parent dispose de m\u00e9thodes virtuelles, ce qui signifie que la classe enfant peut les &#8220;surcharger&#8221; et red\u00e9finir ces propres comportement, par dessus ou \u00e0 la place des m\u00e9thodes parentes :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>quandDistanceFrontaleChange() : appel\u00e9e \u00e0 chaque tour de jeu, quand l&#8217;agent d\u00e9tecte un enemi dans son champs de vision<\/li><li>quandMunitionsChange() : appel\u00e9e  \u00e0 chaque tour de jeu, quand l&#8217;agent perd une munition, signifiant qu&#8217;un tir a bien \u00e9t\u00e9 effectu\u00e9<\/li><li>quandVieChange() : appel\u00e9e \u00e0 chaque tour de jeu, quand l&#8217;agent est sous le feu ennemi<\/li><li>quandPoseChange() : appel\u00e9e \u00e0 chaque tour de jeu, quand l&#8217;agent bouge ou change d&#8217;orientation  <\/li><li>quandActualiser() : appel\u00e9e en dernier \u00e0 chaque tour du jeu<\/li><\/ul>\n\n\n\n<p>Sachant \u00e7ela, il ne vous reste plus qu&#8217;\u00e0 impl\u00e9menter le corps des m\u00e9thodes suivantes dans le fichier AgentSpecial.cpp, de mani\u00e8re \u00e0 d\u00e9finir un comportement intelligent !<\/p>\n\n\n\n<p>Maintenant, \u00e0 vous de jouer !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Les r\u00e8gles du jeu<\/h3>\n\n\n\n<p>Les agents combattent sur un plateau constitu\u00e9 de 15 lignes (y allant de 0 \u00e0 14) et 15 colonnes (x allant de 0 \u00e0 14).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2019\/07\/image-4.png\" alt=\"\" class=\"wp-image-51\"\/><figcaption>Plateau du jeu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Chaque tour du jeu, un agent peut effectuer jusqu&#8217;\u00e0 4 actions en m\u00eame temps parmi les suivantes :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2019\/07\/image-5-1024x392.png\" alt=\"\" class=\"wp-image-52\" width=\"581\" height=\"223\"\/><figcaption>Actions possibles par un agent \u00e0 chaque tour de jeu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ces ordres d&#8217;actions peuvent \u00eatre effectu\u00e9s en appelant les m\u00e9thodes suivantes (depuis les m\u00e9thodes surcharg\u00e9es dans la classe AgentSpecial) :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>tirer() : en passant &#8220;true&#8221; pour activer tir en rafale, ou false pour d\u00e9sactiver<\/li><li>d\u00e9placer() : en passant les coordonn\u00e9es de la case destination (attention de bien choisir une case adjacente dans la limite du plateau)<\/li><li>orienter() : en passant un des quatre points cardinaux (Nord, Sud, Est, Ouest)<\/li><\/ul>\n\n\n\n<p>Chaque tour de jeu, l&#8217;agent re\u00e7oit 5 variables actualis\u00e9es qui l&#8217;informe de son \u00e9tat dans son environnement :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2019\/07\/image-6-1024x441.png\" alt=\"\" class=\"wp-image-53\"\/><figcaption>Donn\u00e9es renseign\u00e9es \u00e0 l&#8217;agent \u00e0 chaque tour de jeu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ces donn\u00e9es d&#8217;\u00e9tat peuvent \u00eatre r\u00e9cup\u00e9r\u00e9es en appelant les m\u00e9thodes suivantes (depuis les m\u00e9thodes surcharg\u00e9es dans la classe AgentSpecial) :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>viesRestantes() : renvoie un entier compris entre 0 et VIE_MAX (\u00e9gal \u00e0 100)<\/li><li>munitionsRestantes() : renvoie un entier compris entre 0 et MUNITIONS_MAX (\u00e9gal \u00e0 10)<\/li><li>x(), y(): renvoie un entier compris respectivement entre 0 et X_MAX et 0 et Y_MAX<\/li><li>orientation()  : renvoie un des quatre points cardinaux  (Nord, Sud, Est, Ouest) <\/li><li>distanceFrontale() : renvoie la distance \u00e0 un obstacle devant l&#8217;agent (0 si pas d&#8217;obstacle en vue)<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Modifier le comportement des rendus<\/h3>\n\n\n\n<p>Dans MoteurRenduAgentSpecial.hpp et MoteurRenduAgentSpecial.cpp<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Initialisation du jeu<\/h3>\n\n\n\n<p>Dans main.cpp<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ils nous faut \u00eatre pr\u00eats pour le prochain assaut des extraterrestres ! Et pour cela, rien de mieux que de s&#8217;entra\u00eener sur un simulateur de robot et d&#8217;intelligences artificielles en C++ ! A vos claviers et souris, on commence ici !<\/p>\n","protected":false},"author":1,"featured_media":13,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,7],"tags":[],"class_list":["post-7","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cpp","category-tactx"],"_links":{"self":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/posts\/7","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=7"}],"version-history":[{"count":0,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/posts\/7\/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=7"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/categories?post=7"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/tags?post=7"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}