{"id":237,"date":"2023-01-13T09:34:32","date_gmt":"2023-01-13T08:34:32","guid":{"rendered":"http:\/\/yb-isn.fr\/2022\/nsi\/garthur\/?p=237"},"modified":"2023-03-03T09:38:35","modified_gmt":"2023-03-03T08:38:35","slug":"projet-cavalier-deuler","status":"publish","type":"post","link":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/2023\/01\/13\/projet-cavalier-deuler\/","title":{"rendered":"Projet Cavalier d&rsquo;Euler :"},"content":{"rendered":"\n<h5 class=\"has-text-color has-background\" style=\"background-color:#b2b2b2;color:#ff0000;font-size:25px;font-style:normal;font-weight:700\">Objectif<\/h5>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p>L&rsquo;objectif est de placer le cavalier sur une case al\u00e9atoire et d&rsquo;effectuer des sauts en passant une fois et une seule sur toutes les cases de l&rsquo;\u00e9chiquier.<\/p>\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"has-text-color has-background\" style=\"background-color:#b8b8b8;color:#ff0000;font-size:25px;font-style:normal;font-weight:700\">Etape 1 : Codage de l&rsquo;\u00e9chiquier (Th\u00e9o) :<\/h2>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p>Il faut pouvoir g\u00e9n\u00e9rer une grille de 8&#215;8 ou il n&rsquo;y a que des z\u00e9ro \u00e0 partir de python et mettre le cavalier, le point, sur une case al\u00e9atoire donc sa case de d\u00e9part. La case de d\u00e9part et le chiffre 1et a chaque d\u00e9placement le 0 se change en nombre suivant.<\/p>\n<p><\/p>\n<p><strong><span style=\"text-decoration: underline\">Coder l&rsquo;\u00e9chiquier :<\/span><\/strong> Pour cela il faut utiliser une liste en 2 dimensions, avec 2 indices : <span>un&nbsp;<\/span>premier indice<span>&nbsp;repr\u00e9sentant la liste g\u00e9n\u00e9rale, avec sa valeur repr\u00e9sentant les \u00e9l\u00e9ments de cette liste, et un&nbsp;<\/span>deuxi\u00e8me indice<span> repr\u00e9sentant les valeurs dans les listes de la liste g\u00e9n\u00e9rale. Le 1er indice correspond a une ligne et le 2\u00e8me a une colonne.&nbsp;<\/span><\/p>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">echiquier = [[0,0,0],\n             [0,0,0],\n             [0,0,0]]<\/pre>\n\n\n<p><span>Pour remplacer une&nbsp;<\/span><strong>valeur de la liste<\/strong><span>&nbsp;(un des 0), on va devoir \u00e9crire ceci :<\/span><\/p>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">echiquier = [[0,0,0],\n             [0,0,0],\n             [0,0,0]]\nechiquier[1][1]=1\n# Ceci va remplacer le deuxi\u00e8me 0 de la deuxi\u00e8me liste de la liste g\u00e9n\u00e9rale.<\/pre>\n\n\n<p><span>Pour mettre en forme l\u2019\u00e9chiquier, on va&nbsp;<\/span><strong>importer et installer la librairie<span>&nbsp;<\/span><em>tabulate<\/em><\/strong><span>&nbsp;pour faire un \u00e9chiquier sous forme de tableau :<\/span><\/p>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Permet de g\u00e9n\u00e9rer l'\u00e9chiquier 8 par 8 en important la librairie tabulate.\n\nfrom tabulate import tabulate\nn=8\np=8\n\nechiquier=[[0 for i in range(n)]for j in range(p)]\n\nprint(tabulate(echiquier))\n\n#-  -  -  -  -  -  -  -\n#0  0  0  0  0  0  0  0\n#0  0  0  0  0  0  0  0\n#0  0  0  0  0  0  0  0\n#0  0  0  0  0  0  0  0\n#0  0  0  0  0  0  0  0\n#0  0  0  0  0  0  0  0\n#0  0  0  0  0  0  0  0\n#0  0  0  0  0  0  0  0\n#-  -  -  -  -  -  -  -<\/pre>\n\n\n\n<div style=\"height:77px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"has-text-color has-background\" style=\"background-color:#b8b8b8;color:#ff0000;font-size:25px;font-style:normal;font-weight:700\">Etape 2 : Choix case al\u00e9atoire (Arthur) :<\/h2>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p><span>Pour cela, nous allons utiliser la librairie random. Deux chiffres entre 0 et 7 vont \u00eatre choisi au hasard pour d\u00e9finir les deux indices des listes et la position de d\u00e9part du cavalier<\/span><\/p>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import random\nfrom tabulate import tabulate\nn=8\np=8\nechiquier=[[0 for i in range(n)]for j in range (p)]\ncaseDepartLigne = random.randint(0,7)\ncaseDepartColonne = random.randint(0,7)\nechiquier[caseDepartLigne][caseDepartColonne]=1\nprint(tabulate(echiquier))\n# Ceci va g\u00e9n\u00e9rer l'\u00e9chiquier avec un taleau sous cette forme, et un nombre 1 plac\u00e9 al\u00e9atoirement \u00e0 la place d'un 0 en guise de position de base du cavalier :\n# -  -  -  -  -  -  -  -\n# 0  0  0  0  0  0  0  0\n# 0  0  0  0  0  0  0  0\n# 0  0  0  1  0  0  0  0\n# 0  0  0  0  0  0  0  0\n# 0  0  0  0  0  0  0  0\n# 0  0  0  0  0  0  0  0\n# 0  0  0  0  0  0  0  0\n# 0  0  0  0  0  0  0  0\n# -  -  -  -  -  -  -  -<\/pre>\n\n\n\n<div style=\"height:89px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"has-text-color has-background\" style=\"background-color:#b8b8b8;color:#ff0000;font-size:25px;font-style:normal;font-weight:700\"> Etape 3 : Interface graphique (Arthur) :<\/h2>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p><span>Pour l\u2019interface graphique, nous allons utiliser pygame. Il faut g\u00e9n\u00e9rer une interface carr\u00e9 avec 8\u00d78 carr\u00e9s de couleurs qui alterne un sur deux entre noir et blanc et afficher un cavalier. Voici le code qui permet de g\u00e9n\u00e9rer le damier et le cavalier :<\/span><\/p>\n<p><span style=\"text-decoration: underline\">Fonction def damier :<\/span>&nbsp;<\/p>\n<ul>\n<li>for in range<\/li>\n<li>condition, dessiner un carr\u00e9 noir ou blanc<\/li>\n<li>afficher tout cela<\/li>\n<\/ul>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" src=\"http:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-content\/uploads\/sites\/9\/2023\/01\/Capture-2.png\" alt=\"\" class=\"wp-image-259\" width=\"426\" height=\"425\" srcset=\"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-content\/uploads\/sites\/9\/2023\/01\/Capture-2.png 642w, https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-content\/uploads\/sites\/9\/2023\/01\/Capture-2-300x300.png 300w, https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-content\/uploads\/sites\/9\/2023\/01\/Capture-2-150x150.png 150w\" sizes=\"(max-width: 426px) 100vw, 426px\" \/><\/figure><\/div>\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pygame\nimport random\nnoir=(0,0,0)\nblanc=(255,255,255)\ncases=80\nechiquier=[0 for i in range(8)]\ndef damier():\n    for j in range(8):\n        for i in range(8):  \n            if j%2==1:\n                if i%2==0:\n                    pygame.draw.rect(ecran,blanc, (cases*i,cases*j,cases,cases))\n                else:\n                    pygame.draw.rect(ecran,noir, (cases*i,cases*j,cases,cases))\n            else:\n                if i%2==1:\n                    pygame.draw.rect(ecran,blanc, (cases*i,cases*j,cases,cases))\n                else:\n                    pygame.draw.rect(ecran,noir, (cases*i,cases*j,cases,cases))\npygame.init()\necran = pygame.display.set_mode((640, 640))\nimage = pygame.image.load(\"cavalier.png\")\nimage=pygame.transform.scale(image,(cases,cases)) \ndamier()\nX1=2\necran.blit(image, (cases*X1,0))\n<\/pre>\n\n\n\n<div style=\"height:85px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"has-text-color has-background\" style=\"background-color:#b8b8b8;color:#ff0000;font-size:25px;font-style:normal;font-weight:700\">Etape 4 : D\u00e9placement du cavalier (Thomas) :<\/h2>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p><span>Pour ses d\u00e9placement, le cavalier peut uniquement se d\u00e9placer en L c\u2019est \u00e0 dire il peut avancer de deux cases vers l\u2019avant et une case sur la droite ou la gauche ou avancer d\u2019une case vers l\u2019avant et deux cases sur la droite ou la gauche. Il faut aussi v\u00e9rifier si il est d\u00e9j\u00e0 pass\u00e9 par une case ou non.<\/span><\/p>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"http:\/\/www.creachess.com\/cours\/imgs\/deplacement-cavalier.jpg\" alt=\"\" width=\"265\" height=\"268\" \/><\/figure><\/div>\n\n<p>Il va falloir d\u00e9finir une fonction pour dire au cavalier d&rsquo;avancer, il faut qui sache si il peut aller sur la case, vers le haut , vers le bas, gauche ou droite. Il faut d&rsquo;abord lire la position de la souris quand on clic&nbsp; pour permettre de de d\u00e9placer le cavalier au bon endroit. Il faut utiliser une double condition, une pour savoir si on c&rsquo;est bien d\u00e9placer de 2 cases a l&rsquo;horizontal ou a la vertical et une autre pour savoir si on c&rsquo;est bien d\u00e9placer d&rsquo;une case a l&rsquo;horizontal et a la vertical suivant l&rsquo;ancien d\u00e9placement.<\/p>\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p>Voici le programme avec les d\u00e9placement marchant dans la console sans interface graphique :<\/p>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pygame\nimport random\nfrom tabulate import tabulate\nechiquier=[[0 for i in range(8)]for j in range(8)]\ncompteur=1\n\nmouvements_possibles=[(-1, -2), (1, -2), (-2, -1), (2, -1), (-2, 1), (2, 1), (-1, 2), (1, 2)]  #mouvements possible du cavalier \n\nX1=random.randint(0,7)\nY1=random.randint(0,7)\nechiquier[Y1][X1]=echiquier[Y1][X1]+compteur      #permet le placement du cavalier al\u00e9atoirement sur l'echiquier\ncompteur=compteur+1\nprint(tabulate(echiquier))\n\n\ncontinuer = True\nposition=[]\nwhile continuer:\n            X=int(input(\"deplacement X : \"))        #Question pour savoir le d\u00e9placement\n            Y=int(input(\"deplacement Y : \"))    \n            if (X,Y) in mouvements_possibles:\n                X1=X1+X\n                Y1=Y1+Y\n                if 0&lt;X1&lt;7 and 0&lt;Y1&lt;7:\n                    if echiquier[Y1][X1]==0:\n                        if (X,Y) in mouvements_possibles:\n                            echiquier[Y1][X1]=echiquier[Y1][X1]+compteur\n                            print(tabulate(echiquier))\n                            compteur=compteur+1\n                        else :\n                            print(\"mouvement impossible\")\n                    else:\n                        print(\"case d\u00e9j\u00e0 visit\u00e9e\")\n                        X1=X1-X\n                        Y1=Y1-Y\n                    if compteur ==64:\n                        print(\"Vous avez gagn\u00e9 !\")\n                else:\n                    print(\"mouvement impossible\")\n                    X1=X1-X\n                    Y1=Y1-Y\n            else:\n                    print(\"mouvement impossible\")<\/pre>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:49px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#Voici une partie du code avec pygame permettant de se d\u00e9placer n\u2019importe o\u00f9 sauf sur une case visit\u00e9e :\n\ncontinuer = True\nposition=[]\n\n#On fait une boucle qui permet de d\u00e9placer le cavalier d'une case \u00e0 une autre en v\u00e9rifiant si il a d\u00e9j\u00e0 \u00e9t\u00e9 dessus\nwhile continuer:\n    for event in pygame.event.get():\n        if event.type == pygame.MOUSEBUTTONDOWN:\n            position = event.pos\n            X=int(position[0]\/80)\n            Y=int(position[1]\/80)\n            if echiquier[X]==0:\n                echiquier[X]=echiquier[X]+1\n                damier()\n                ecran.blit(image, (cases*X, cases*Y))\n                print(echiquier)\n                X1=X\n                Y1=Y\n            else:\n                print(\"case d\u00e9j\u00e0 visit\u00e9e\")\n                damier()\n                ecran.blit(image, (cases*X1, cases*Y1))\n            pygame.display.flip()\n    if event.type == pygame.KEYDOWN:\n        continuer = False\n    pygame.display.flip()\n    \n    \npygame.quit()<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import random\nfrom tabulate import tabulate\nn=8\np=8\nechiquier=[[0 for i in range(n)]for j in range (p)]\ncaseDepartLigne = random.randint(0,7)\ncaseDepartColonne = random.randint(0,7)\nechiquier[caseDepartLigne][caseDepartColonne]=1\ndeplacement=[(1,2);(2,1);(-1,2);(2,-1);(1,-2);(-2,1);(-1,-2);(-2,-1)]\nprint(tabulate(echiquier))\n <\/pre>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"has-text-color has-background\" style=\"background-color:#b8b8b8;color:#ff0000;font-size:25px;font-style:normal;font-weight:700\">Etape 5 : Num\u00e9rotation positions cavalier et fin du jeu (Th\u00e9o) :<\/h2>\n\n\n<p>Code termin\u00e9 et fonctionnel avec l&rsquo;interface graphique :\u00a0<\/p>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import random\nfrom tabulate import tabulate\nnoir=(0,0,0)\nblanc=(255,255,255)\ncouleur=(random.randint(0,255),random.randint(0,255),random.randint(0,255))\ncases=80\nechiquier=[[0 for i in range(8)]for j in range(8)]\ncompteur=1\ndef damier():\n    for i in range(8):\n        for j in range(8):  \n            if j%2==1:\n                if i%2==0:\n                    pygame.draw.rect(ecran,blanc, (cases*j,cases*i,cases,cases))       #Code modifier, chaque chiffres, nombres s'affichent sur chaque cases correctement.\n                else:\n                    pygame.draw.rect(ecran,noir, (cases*j,cases*i,cases,cases))\n            else:\n                if i%2==1:\n                    pygame.draw.rect(ecran,blanc, (cases*j,cases*i,cases,cases))\n                else:\n                    pygame.draw.rect(ecran,noir, (cases*j,cases*i,cases,cases))\n            if echiquier[i][j]&gt;0:\n                font = pygame.font.Font(None, 35)\n                num = font.render(str(echiquier[i][j]), 1, couleur)\n                ecran.blit(num, (cases*j + 35, cases*i + 35))\n                \n                \n \npygame.init()\necran = pygame.display.set_mode((640, 640))\nimage = pygame.image.load(\"cavalier.png\")\nimage=pygame.transform.scale(image,(cases,cases)) \ndamier()\n\nmouvements_possibles=[(-1, -2), (1, -2), (-2, -1), (2, -1), (-2, 1), (2, 1), (-1, 2), (1, 2)]\n\nX1=random.randint(0,7)\nY1=random.randint(0,7)\ndamier()\necran.blit(image, (cases*X1,cases*Y1))\nechiquier[Y1][X1]=echiquier[Y1][X1]+compteur\ncompteur=compteur+1\necran.blit(image, (cases*X1, cases*Y1))\n\ncontinuer = True\nposition=[]\nwhile continuer:\n    for event in pygame.event.get():\n        if event.type == pygame.MOUSEBUTTONDOWN:\n            position_deplacement = event.pos\n            X=int(position_deplacement[0]\/80)\n            Y=int(position_deplacement[1]\/80)\n            X2=X-X1\n            Y2=Y-Y1\n            print(X2)\n            print(Y2)\n            if echiquier[Y][X]==0:\n                if (X2,Y2) in mouvements_possibles:\n                    echiquier[Y][X]=echiquier[Y][X]+compteur\n                    print(tabulate(echiquier))\n                    X1=X\n                    Y1=Y\n                    damier()\n                    ecran.blit(image, (cases*X, cases*Y))\n                    font = pygame.font.Font(None, 35)\n                    num = font.render(str(compteur), 1, couleur)\n                    ecran.blit(num, (cases*X1 + 35, cases*Y1 + 35))\n                    compteur=compteur+1\n                else :\n                    print(\"mouvement impossible\")\n            else:\n                print(\"case d\u00e9j\u00e0 visit\u00e9e\")\n                damier()\n                ecran.blit(image, (cases*X1, cases*Y1))\n            if compteur ==64:\n                print(\"Vous avez gagn\u00e9 !\")\n            pygame.display.flip()\n        if event.type == pygame.KEYDOWN:\n            continuer = False\n        pygame.display.flip()\n    \n    \npygame.quit()\n\n                print(\"Vous avez gagn\u00e9 !\")\n            pygame.display.flip()\n        if event.type == pygame.KEYDOWN:\n            continuer = False\n        pygame.display.flip()\n    \n    \npygame.quit()<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Objectif L&rsquo;objectif est de placer le cavalier sur une case al\u00e9atoire et d&rsquo;effectuer des sauts en passant une fois et une seule sur toutes les cases de l&rsquo;\u00e9chiquier. Etape 1 : Codage de l&rsquo;\u00e9chiquier (Th\u00e9o) : Il faut pouvoir g\u00e9n\u00e9rer une grille de 8&#215;8 ou il n&rsquo;y a que des [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/posts\/237"}],"collection":[{"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/comments?post=237"}],"version-history":[{"count":66,"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/posts\/237\/revisions"}],"predecessor-version":[{"id":367,"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/posts\/237\/revisions\/367"}],"wp:attachment":[{"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/media?parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/categories?post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yb-isn.fr\/2022\/nsi\/garthur\/wp-json\/wp\/v2\/tags?post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}