Objectif
L’objectif est de placer le cavalier sur une case aléatoire et d’effectuer des sauts en passant une fois et une seule sur toutes les cases de l’échiquier.
Etape 1 : Codage de l’échiquier (Théo) :
Il faut pouvoir générer une grille de 8×8 ou il n’y a que des zéro à partir de python et mettre le cavalier, le point, sur une case aléatoire donc sa case de départ. La case de départ et le chiffre 1et a chaque déplacement le 0 se change en nombre suivant.
Coder l’échiquier : Pour cela il faut utiliser une liste en 2 dimensions, avec 2 indices : un premier indice représentant la liste générale, avec sa valeur représentant les éléments de cette liste, et un deuxième indice représentant les valeurs dans les listes de la liste générale. Le 1er indice correspond a une ligne et le 2ème a une colonne.
echiquier = [[0,0,0], [0,0,0], [0,0,0]]
Pour remplacer une valeur de la liste (un des 0), on va devoir écrire ceci :
echiquier = [[0,0,0], [0,0,0], [0,0,0]] echiquier[1][1]=1 # Ceci va remplacer le deuxième 0 de la deuxième liste de la liste générale.
Pour mettre en forme l’échiquier, on va importer et installer la librairie tabulate pour faire un échiquier sous forme de tableau :
# Permet de générer l'échiquier 8 par 8 en important la librairie tabulate. from tabulate import tabulate n=8 p=8 echiquier=[[0 for i in range(n)]for j in range(p)] print(tabulate(echiquier)) #- - - - - - - - #0 0 0 0 0 0 0 0 #0 0 0 0 0 0 0 0 #0 0 0 0 0 0 0 0 #0 0 0 0 0 0 0 0 #0 0 0 0 0 0 0 0 #0 0 0 0 0 0 0 0 #0 0 0 0 0 0 0 0 #0 0 0 0 0 0 0 0 #- - - - - - - -
Etape 2 : Choix case aléatoire (Arthur) :
Pour cela, nous allons utiliser la librairie random. Deux chiffres entre 0 et 7 vont être choisi au hasard pour définir les deux indices des listes et la position de départ du cavalier
import random from tabulate import tabulate n=8 p=8 echiquier=[[0 for i in range(n)]for j in range (p)] caseDepartLigne = random.randint(0,7) caseDepartColonne = random.randint(0,7) echiquier[caseDepartLigne][caseDepartColonne]=1 print(tabulate(echiquier)) # Ceci va générer l'échiquier avec un taleau sous cette forme, et un nombre 1 placé aléatoirement à la place d'un 0 en guise de position de base du cavalier : # - - - - - - - - # 0 0 0 0 0 0 0 0 # 0 0 0 0 0 0 0 0 # 0 0 0 1 0 0 0 0 # 0 0 0 0 0 0 0 0 # 0 0 0 0 0 0 0 0 # 0 0 0 0 0 0 0 0 # 0 0 0 0 0 0 0 0 # 0 0 0 0 0 0 0 0 # - - - - - - - -
Etape 3 : Interface graphique (Arthur) :
Pour l’interface graphique, nous allons utiliser pygame. Il faut générer une interface carré avec 8×8 carrés de couleurs qui alterne un sur deux entre noir et blanc et afficher un cavalier. Voici le code qui permet de générer le damier et le cavalier :
Fonction def damier :
- for in range
- condition, dessiner un carré noir ou blanc
- afficher tout cela
import pygame import random noir=(0,0,0) blanc=(255,255,255) cases=80 echiquier=[0 for i in range(8)] def damier(): for j in range(8): for i in range(8): if j%2==1: if i%2==0: pygame.draw.rect(ecran,blanc, (cases*i,cases*j,cases,cases)) else: pygame.draw.rect(ecran,noir, (cases*i,cases*j,cases,cases)) else: if i%2==1: pygame.draw.rect(ecran,blanc, (cases*i,cases*j,cases,cases)) else: pygame.draw.rect(ecran,noir, (cases*i,cases*j,cases,cases)) pygame.init() ecran = pygame.display.set_mode((640, 640)) image = pygame.image.load("cavalier.png") image=pygame.transform.scale(image,(cases,cases)) damier() X1=2 ecran.blit(image, (cases*X1,0))
Etape 4 : Déplacement du cavalier (Thomas) :
Pour ses déplacement, le cavalier peut uniquement se déplacer en L c’est à dire il peut avancer de deux cases vers l’avant et une case sur la droite ou la gauche ou avancer d’une case vers l’avant et deux cases sur la droite ou la gauche. Il faut aussi vérifier si il est déjà passé par une case ou non.
Il va falloir définir une fonction pour dire au cavalier d’avancer, il faut qui sache si il peut aller sur la case, vers le haut , vers le bas, gauche ou droite. Il faut d’abord lire la position de la souris quand on clic pour permettre de de déplacer le cavalier au bon endroit. Il faut utiliser une double condition, une pour savoir si on c’est bien déplacer de 2 cases a l’horizontal ou a la vertical et une autre pour savoir si on c’est bien déplacer d’une case a l’horizontal et a la vertical suivant l’ancien déplacement.
Voici le programme avec les déplacement marchant dans la console sans interface graphique :
import pygame import random from tabulate import tabulate echiquier=[[0 for i in range(8)]for j in range(8)] compteur=1 mouvements_possibles=[(-1, -2), (1, -2), (-2, -1), (2, -1), (-2, 1), (2, 1), (-1, 2), (1, 2)] #mouvements possible du cavalier X1=random.randint(0,7) Y1=random.randint(0,7) echiquier[Y1][X1]=echiquier[Y1][X1]+compteur #permet le placement du cavalier aléatoirement sur l'echiquier compteur=compteur+1 print(tabulate(echiquier)) continuer = True position=[] while continuer: X=int(input("deplacement X : ")) #Question pour savoir le déplacement Y=int(input("deplacement Y : ")) if (X,Y) in mouvements_possibles: X1=X1+X Y1=Y1+Y if 0<X1<7 and 0<Y1<7: if echiquier[Y1][X1]==0: if (X,Y) in mouvements_possibles: echiquier[Y1][X1]=echiquier[Y1][X1]+compteur print(tabulate(echiquier)) compteur=compteur+1 else : print("mouvement impossible") else: print("case déjà visitée") X1=X1-X Y1=Y1-Y if compteur ==64: print("Vous avez gagné !") else: print("mouvement impossible") X1=X1-X Y1=Y1-Y else: print("mouvement impossible")
#Voici une partie du code avec pygame permettant de se déplacer n’importe où sauf sur une case visitée : continuer = True position=[] #On fait une boucle qui permet de déplacer le cavalier d'une case à une autre en vérifiant si il a déjà été dessus while continuer: for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONDOWN: position = event.pos X=int(position[0]/80) Y=int(position[1]/80) if echiquier[X]==0: echiquier[X]=echiquier[X]+1 damier() ecran.blit(image, (cases*X, cases*Y)) print(echiquier) X1=X Y1=Y else: print("case déjà visitée") damier() ecran.blit(image, (cases*X1, cases*Y1)) pygame.display.flip() if event.type == pygame.KEYDOWN: continuer = False pygame.display.flip() pygame.quit()
import random from tabulate import tabulate n=8 p=8 echiquier=[[0 for i in range(n)]for j in range (p)] caseDepartLigne = random.randint(0,7) caseDepartColonne = random.randint(0,7) echiquier[caseDepartLigne][caseDepartColonne]=1 deplacement=[(1,2);(2,1);(-1,2);(2,-1);(1,-2);(-2,1);(-1,-2);(-2,-1)] print(tabulate(echiquier))
Etape 5 : Numérotation positions cavalier et fin du jeu (Théo) :
Code terminé et fonctionnel avec l’interface graphique :
import random from tabulate import tabulate noir=(0,0,0) blanc=(255,255,255) couleur=(random.randint(0,255),random.randint(0,255),random.randint(0,255)) cases=80 echiquier=[[0 for i in range(8)]for j in range(8)] compteur=1 def damier(): for i in range(8): for j in range(8): if j%2==1: if i%2==0: pygame.draw.rect(ecran,blanc, (cases*j,cases*i,cases,cases)) #Code modifier, chaque chiffres, nombres s'affichent sur chaque cases correctement. else: pygame.draw.rect(ecran,noir, (cases*j,cases*i,cases,cases)) else: if i%2==1: pygame.draw.rect(ecran,blanc, (cases*j,cases*i,cases,cases)) else: pygame.draw.rect(ecran,noir, (cases*j,cases*i,cases,cases)) if echiquier[i][j]>0: font = pygame.font.Font(None, 35) num = font.render(str(echiquier[i][j]), 1, couleur) ecran.blit(num, (cases*j + 35, cases*i + 35)) pygame.init() ecran = pygame.display.set_mode((640, 640)) image = pygame.image.load("cavalier.png") image=pygame.transform.scale(image,(cases,cases)) damier() mouvements_possibles=[(-1, -2), (1, -2), (-2, -1), (2, -1), (-2, 1), (2, 1), (-1, 2), (1, 2)] X1=random.randint(0,7) Y1=random.randint(0,7) damier() ecran.blit(image, (cases*X1,cases*Y1)) echiquier[Y1][X1]=echiquier[Y1][X1]+compteur compteur=compteur+1 ecran.blit(image, (cases*X1, cases*Y1)) continuer = True position=[] while continuer: for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONDOWN: position_deplacement = event.pos X=int(position_deplacement[0]/80) Y=int(position_deplacement[1]/80) X2=X-X1 Y2=Y-Y1 print(X2) print(Y2) if echiquier[Y][X]==0: if (X2,Y2) in mouvements_possibles: echiquier[Y][X]=echiquier[Y][X]+compteur print(tabulate(echiquier)) X1=X Y1=Y damier() ecran.blit(image, (cases*X, cases*Y)) font = pygame.font.Font(None, 35) num = font.render(str(compteur), 1, couleur) ecran.blit(num, (cases*X1 + 35, cases*Y1 + 35)) compteur=compteur+1 else : print("mouvement impossible") else: print("case déjà visitée") damier() ecran.blit(image, (cases*X1, cases*Y1)) if compteur ==64: print("Vous avez gagné !") pygame.display.flip() if event.type == pygame.KEYDOWN: continuer = False pygame.display.flip() pygame.quit() print("Vous avez gagné !") pygame.display.flip() if event.type == pygame.KEYDOWN: continuer = False pygame.display.flip() pygame.quit()
0 commentaire