
Création d'un jeu d'échec :
Problème n°0 :
Coder un jeu de dames fonctonnel pour ensuite le convertir en jeu d'échec.
Problème n°2 :
Utiliser Processing afin de donner une interface graphique au jeu.
Problème n°1 :
Créer un jeu d'échec fonctionnel en l'affichant dans la console python en créant un principe de tour par tour, tout en prenant un compte les règles particulières du jeu.
Problème n°3 :
Programmer un robot contre lequel jouer qui ne ferait que prendre la pièce avec le plus de "valeur". Sinon il joue un coup légal aléatoire.
12/01
Sous Problématiques ( à partir du Problème n°0 ) :
Sous Problématiques n°1 :
Créer un de dames plateau ( 10x10 ) dans la console en attribuant à chaque une coordonnée via la colonne et la ligne.
Sous Problématiques n°3 :
Ajouter le système de promotion si un pion arrive de l'autre côté du plateau. Il faut alors créer une variante du pion qui possède des mouvements différents.
Sous Problématiques n°2 :
Créer les pions de jeu en prenant d'abord en compte leur capacité de mouvement puis à capturer une pièce.
Sous Problématiques n°4 :
Incorporer un principe de tour par tour tout en permettant de jouer de nouveau si un pièce est capturée.
Sous Problématiques n°5 :
Créer la condition de victoire, soit, toutes les pièces de l'adversaire ont été capturées.
12/01
Sous Problématiques ( à partir du Problème n°1 ) :
Sous Problématique n°1 :
Faire apparaître via la console un échiquier ( 8x8 )en attribuant à chaque case une coordonnée via la ligne et la colonne.
Sous Problématique n°3 :
Permettre les joueurs de jouer au tour par tour, tout en leur laissant le choix de la couleur qu'ils veulent.
Sous Problématique n°5 :
Créer une interface sur processing tout en modifiant la manière de déplacer les pions en cliquant.
Sous Problématique n°2 :
Créer les pièces en prenant un compte leur nom, leur emplacement sur le plateau, leur capacité de mouvement.
Sous Problématique n°4 :
Programmer les conditions de victoire et d'égalité. ( Echec et mat, Pat, si un des rois n'a plus de pièces, proposer l'égalité, 50 coups sans bouger de pions ou capturer une pièce, 3 coups identiques )
Sous Problématiques n°6 :
Coder une machine capable de jouer face à l'utilisateur en jouant des coups au hasard tout en prenant la pièce avec le plus de valeur à chaque occasion
12/01
Création du plateau :
19/01
En utilisant la même méthode que celle utilisée dans le jeu de carte j'ai pu créer un plateau avec ses propres coordonnées.
Suite à cela il me fallait créer les pions et leur emplacement au début du jeu, soit un pion toutes les une case sur deux sur 4 lignes en bas et en haut. J'ai essayé ça pour la première ligne et cela marchait très bien. Cependant pour les prochaines, le code ne marchait plus car en réalité les points étaient posés sur les cases pairs uniquement quand j'essayais d'élargir aux autres.
lignes=[0,1,2,3,4,5,6,7,8,9]
colonnes=[0,1,2,3,4,5,6,7,8,9]
plateau=[[i]+[x] for i in lignes for x in colonnes]
for i in range(10):
if i%2==0:
plateau[i].append("Pb")
02/02
for i in range(10):
if i%2==0:
plateau[i].append("Pb")
if i%2==1:
plateau[i].append("Pb")
for i in range(10):
if i%2==0:
plateau[i].append("Pb")
for i in range(10):
if i%2==1:
plateau[i+10].append("Pb")
for i in range(10):
if i%2==0:
plateau[i+20].append("Pb")
for i in range(10):
if i%2==1:
plateau[i+30].append("Pb")
for i in range(10):
if i%2==0:
plateau[i+90].append("Pn")
for i in range(10):
if i%2==1:
plateau[i+80].append("Pn")
for i in range(10):
if i%2==0:
plateau[i+70].append("Pn")
for i in range(10):
if i%2==1:
plateau[i+60].append("Pn")
J'ai donc essayé de modifier le code sans succès car mon algorithme mettait des pions partout. Ce qui est logique car il met désormais sur les cases impairs et pairs quelque soit la ligne.
J'ai du coup réfléchi en essayant de m'inspirer de Sacha qui lui définissait ses lignes séparément et non pas dans toute une même fonction. Cependant cela ne m'a pas mené à grand chose car je me retrouvais encore avec un autre problème qui est que mon plateau existait mais il était impossible de localiser les cases.
Après une heure de réflexion à tenter d’optimiser ça j'ai été obligé de résoudre mon problème en faisant ce code très moche et très mal écrit pour avoir avancé au moins pendant cette séance.
Affichage du plateau
09/02
Grâce à monsieur Laclaverie j'ai pu avoir un affichage fonctionnel que j'aurai à rendre un peu plus propre en le modifiant afin de créer des cases. Ensuite il me faudra trouver un moyen de sélectionner un des pions via sa ligne et sa colonne.
def dessin_plateau(plateau):
ligne =0
for element in plateau:
if element[0]!=ligne:
print()
ligne +=1
if element[-1]=='Pb':
print('Pb', end="")
if element[-1]=='Pn':
print('Pn', end="")
if element[-1]!='Pb' and element[-1]!='Pn':
print(' ', end="")
dessin_plateau(plateau)
Déplacement des pions
16/02
Maintenant j'ai un "jolie" plateau ( même si très efficace, merci monsieur), et une liste de liste regroupant les informations et la position de chacune des cases ce qui permet de placer et les pions. A terme cela permettra ( si je suis pas trop mauvais ) de les déplacer.
J'ai réussi après bien 30 min à faire ce bout de code qui me permet de récupérer ensemble de valeurs qui sont reliés à une ligne dans la liste plateau
sans trop difficulté. J'en avais déjà une idée grossière. Par exemple si je demande la ligne 2 j'obtiendrai :
[[2, 0, 'Pb'],
[2, 1],
[2, 2, 'Pb'],
[2, 3],
[2, 4, 'Pb'],
[2, 5],
[2, 6, 'Pb'],
[2, 7],
[2, 8, 'Pb'],
[2, 9]]
Il me suffira ensuite de faire passer la liste dans une autre fonction similaire qui va chercher la colonne de la case cette fois.
def ligne_p(ligne_p,plateau):
z=-10
liste_temporaire=[]
for i in range(10):
z=z+10
if ligne_p==plateau[z][0]:
for y in range(10):
liste_temporaire.append(plateau[y+z])
if liste_temporaire==[]:
return(print("Vous avez pris une ligne qui n'est pas dans l'intervalle [0;9]."))
return(liste_temporaire)
def colonne_p(colonne_p,liste_temporaire):
Position=None
for i in range(10):
if colonne_p==liste_temporaire[i][1]:
Position=liste_temporaire[i]
if Position==None:
return(print("Vous avez pris une colonne qui n'est pas dans l'intervalle [0;9]."))
return(Position)
Je suis plutôt fier d'avoir réussi à écrire ces deux fonctions tout seul, car elles me semblaient complexes de prime à bord mais en réalité n'ont pas été si difficile à réaliser. Avec cette fonction, en utilisant les deux de suite, je suis capable de trouver n'importe quelle liste dans la liste et n'importe quelle case sur le plateau ( en plus de connaître ses informations ).
Déplacement des pions
08/03
Maintenant que je peux trouver les positions il me faut créer les possibilités de déplacement. Cependant je trouvais cela un peu compliqué d'utiliser deux fonctions de suite pour trouver ma position. J'aurais alourdi le programme inutilement. J'ai donc créer une fonction position pour n'avoir qu'à l'inscrire elle à chaque fois que l'algorithme demandera une case.
def position_p():
x=int(input("Quelle ligne"))
y=int(input("Quelle colonne"))
position=colonne_p(y,ligne_p(x,plateau))
return(position)
Pour le déplacement d'un pion blanc je me suis fait d'abord un schéma avant de coder. J'en ai conclu qu'il me faut ajouter un à la ligne quand j'avance à chaque fois et soustraire ou ajouter un à la colonne si je vais à gauche ou à droite. Pour les pions noirs le principe est sensiblement le même. Je dois soustraire un à la ligne à chaque fois et soustraire ou ajouter un à la colonne si je vais à gauche ou à droite ( Je prends en référentiel pour la gauche ou la droite la vision en hauteur du plateau ). Il me faut donc créer deux fonctions de déplacements distinctes entre les blancs et les noirs pour simplifier le tout.