Donc, pour l'instant, si j'ai bien compris, pas d'intelligence artificielle ?Cliquez pour agrandir...
-
Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !Rejeter la notice
[Travail collectif] Projet commun : Echecs
Discussion dans 'Windev' créé par channibal, Juil 6, 2018.
Page 1 sur 2
Sauf si vous voulez qu'on fasse juste un interface qui sert d’intermédiaire entre un interface graphique et des moteurs. mais la ça sera tout une autre démarche.
Faire recours, après, aux moteurs sera essentiel quand on attaquera la partie analyse et IA.
joker apprécie ceci.
Bonsoir,
Si vous voulez bien, je vous propose une première tâche à faire :
Établir les règles des déplacements d'un pion (sur des emplacements vides sans prise de pièce)
sachant que :
- un pion se déplace d'une (1) seule case a la fois vers l'avant
- un pion ne peut pas se déplacer en arrière
- un pion peut se déplacer exceptionnellement de deux (2) cases a la fois si sa position de départ se trouve sur la ligne n° 2
- un pion peut se déplacer d'une (1) seule case a la fois en diagonale (manœuvre appelée prise en passant) si sa position de départ est la ligne 5 (cette règle doit être établi quand même malgré qu'on va pas encore gérer les prises)
Remarques :
Ces règles doivent être appliquées peu importe la couleur de la pièce (Blanc ou Noir) il faut s'adapter selon les traits (qui joue) la rotation du tapie n'affecte point les règles.
Pour les adaptes de l'idée d’utiliser l'AI, j'ai ajouté un moteur d’échec StockFish 9 + une petite idée de comment l’utiliser
Alors, si vous voulez, vous pouvez faire la même tâche (contrôle des déplacements de pion) en utilisant la communication entre le GUI et le moteur , sachant que le moteur peut retourner si un déplacement est valide ou pas.
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
PS. celui qui terminera cette tâche peut mettre son projet ici avec la mention version 1.0
bon dev.
Je voudrais bien tenter pour voir mais je n'ai pas la version22, serait-il possible de l'avoir en version20 ?
Correction d'une erreur dans la procédure Globale RemplireTableauTapie()
les lignes 35 et 36 :
Il faut commencer par le bas en remplissant le tapie par des images vides. Il faut ajouter un -7)
[windev] {"IMG_Vide_"+NumériqueVersChaîne(i+1)+NumériqueVersChaîne(7-j+1),indChamp}..X = i*48+6
{"IMG_Vide_"+NumériqueVersChaîne(i+1)+NumériqueVersChaîne(7-j+1),indChamp}..Y = j*48+6
[/windev]
joker apprécie ceci.
Réécriture de toute la procédure de rempli de tapie : Position de départ
Maintenant les positions et tous les données des pièces sans correct.
[windev]
PROCEDURE RemplireTableauTapie()
xx est un entier
i, j sont des entiers
c est un entier
nLi,nCol sont des entiers
xx = 0
c = 0
nLi = 0
POUR j = 7 A 0 PAS -1
nLi++
nCol = 0
POUR i = 0 A 7
xx++
nCol++
c = 1 - c
gtabTabTapie[nCol][nLi].nLaPosition = xx
gtabTabTapie[nCol][nLi].nCoordX = i*48+6
gtabTabTapie[nCol][nLi].nCoordY = j*48+6
SI j < 2 OU j > 5 ALORS
gtabTabTapie[nCol][nLi].bPositionLibreON = Faux
SINON
gtabTabTapie[nCol][nLi].bPositionLibreON = Vrai
FIN
gtabTabTapie[nCol][nLi].nPositionCouleur = c
gtabTabTapie[nCol][nLi].nPositionXX = i+1
gtabTabTapie[nCol][nLi].nPositionYY = Abs(j-8)
gtabTabTapie[nCol][nLi].sPositionChaineXX = Caract(65+i)
gtabTabTapie[nCol][nLi].sPositionChaineYY = NumériqueVersChaîne(Abs(j-8))
//Positionne les images vides sur le tapie
{"IMG_Vide_"+NumériqueVersChaîne(i+1)+NumériqueVersChaîne(7-j+1),indChamp}..X = i*48+6
{"IMG_Vide_"+NumériqueVersChaîne(i+1)+NumériqueVersChaîne(7-j+1),indChamp}..Y = j*48+6
[/windev]
joker apprécie ceci.
Voila, j'ai terminé le contrôle des déplacements d'un pion
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Voici la procédure pour ceux qui n’ont pas la version 22
[windev]
PROCEDURE DeplacementValide(nCDep,nLDep,nCArr,nLArr)
bEstValide est un booléen = Vrai
nIndice est un entier = 0
POUR i = 1 A 32
SI gtabTabPieces.nIDPiece = gnIDPiece_Selectionnee ALORS
nIndice = i
FIN
FIN
SI nIndice = 0 ALORS
RENVOYER Faux
FIN
SELON gtabTabPieces[nIndice].nIDPiece
CAS 20 A 27
//pion blanc
// trace(nCDep,nLDep,nCArr,nLArr)
//Même colonne
SI nCDep = nCArr ALORS
//recule?
SI nLArr < nLDep ALORS
//recule
RENVOYER Faux
FIN
//une seule case?
SI nLArr - nLDep = 1 ALORS
RENVOYER Vrai
FIN
//plus que 2 cases?
SI nLArr - nLDep > 2 ALORS
RENVOYER Faux
FIN
//2 cases?
SI nLArr - nLDep = 2 ALORS
//Ligne 2?
SI nLDep = 2 ALORS
//Saut?
// trace(gtabTabTapie[nCDep][nLDep+1].sPositionChaineXX,gtabTabTapie[nCDep][nLDep+1].sPositionChaineYY)
RENVOYER gtabTabTapie[nCDep][nLDep+1].bPositionLibreON
SINON
RENVOYER Faux
FIN
FIN
SINON
//pas la même colonne
//Plus d'une case?
SI Abs(nCArr - nCDep) > 1 ALORS
RENVOYER Faux
FIN
//Ligne 5?
SI nLDep = 5 ALORS
//Y a t-il passage?
//contrôle la possibilité de prise en passant
SI nLArr <> 6 ALORS
RENVOYER Faux
FIN
SINON
RENVOYER Faux
FIN
FIN
CAS -27 A -20
//pion noir
// trace(nCDep,nLDep,nCArr,nLArr)
//Même colonne
SI nCDep = nCArr ALORS
//recule?
SI nLArr > nLDep ALORS
//recule
RENVOYER Faux
FIN
//une seule case?
SI Abs(nLArr - nLDep) = 1 ALORS
RENVOYER Vrai
FIN
//plus que 2 cases?
SI Abs(nLArr - nLDep) > 2 ALORS
RENVOYER Faux
FIN
//2 cases?
SI Abs(nLArr - nLDep) = 2 ALORS
//Ligne 2?
SI nLDep = 7 ALORS
//Saut?
// trace(gtabTabTapie[nCDep][nLDep-1].sPositionChaineXX,gtabTabTapie[nCDep][nLDep-1].sPositionChaineYY)
RENVOYER gtabTabTapie[nCDep][nLDep-1].bPositionLibreON
SINON
RENVOYER Faux
FIN
FIN
SINON
//pas la même colonne
//Plus d'une case?
SI Abs(nCArr - nCDep) > 1 ALORS
RENVOYER Faux
FIN
//Ligne 5?
SI nLDep = 4 ALORS
//Y a t-il passage?
//contrôle la possibilité de prise en passant
SI nLArr <> 3 ALORS
RENVOYER Faux
FIN
SINON
RENVOYER Faux
FIN
FIN
AUTRE CAS
FIN
RENVOYER bEstValide
[/windev]
Je passe aux autres pièces (Tour et Fou)
Sachant que :
Les Tours.
- une tour ne se déplace que sur la même colonne
- une tour ne se déplace que sur la même ligne
- une tour ne peut pas sauter une autre pièce
Les Fous.
- un Fou ne se déplace qu'on diagonal
- un Fou ne peut pas sauter une autre pièce
Bon dev.
joker apprécie ceci.
Contrôle déplacements Tour et Fou terminé
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Voici le code pour la version 20
Code (Text):PROCEDURE DeplacementValide(nCDep,nLDep,nCArr,nLArr)
bEstValide est un booléen = Vrai
nIndice est un entier = 0
nDif est un entier
nDif2 est un entier
c,l sont des entiers
POUR i = 1 A 32
SI gtabTabPieces.nIDPiece = gnIDPiece_Selectionnee ALORS
nIndice = i
FIN
FIN
SI nIndice = 0 ALORS
RENVOYER Faux
FIN
SELON gtabTabPieces[nIndice].nIDPiece
CAS 20 A 27
//pion blanc
// trace(nCDep,nLDep,nCArr,nLArr)
//Même colonne
SI nCDep = nCArr ALORS
//recule?
SI nLArr < nLDep ALORS
//recule
RENVOYER Faux
FIN
//une seule case?
SI nLArr - nLDep = 1 ALORS
RENVOYER Vrai
FIN
//plus que 2 cases?
SI nLArr - nLDep > 2 ALORS
RENVOYER Faux
FIN
//2 cases?
SI nLArr - nLDep = 2 ALORS
//Ligne 2?
SI nLDep = 2 ALORS
//Saut?
// trace(gtabTabTapie[nCDep][nLDep+1].sPositionChaineXX,gtabTabTapie[nCDep][nLDep+1].sPositionChaineYY)
RENVOYER gtabTabTapie[nCDep][nLDep+1].bPositionLibreON
SINON
RENVOYER Faux
FIN
FIN
SINON
//pas la même colonne
//Plus d'une case?
SI Abs(nCArr - nCDep) > 1 ALORS
RENVOYER Faux
FIN
//Ligne 5?
SI nLDep = 5 ALORS
//Y a t-il passage?
//contrôle la possibilité de prise en passant
SI nLArr <> 6 ALORS
RENVOYER Faux
FIN
SINON
RENVOYER Faux
FIN
FIN
CAS -27 A -20
//pion noir
// trace(nCDep,nLDep,nCArr,nLArr)
//Même colonne
SI nCDep = nCArr ALORS
//recule?
SI nLArr > nLDep ALORS
//recule
RENVOYER Faux
FIN
//une seule case?
SI Abs(nLArr - nLDep) = 1 ALORS
RENVOYER Vrai
FIN
//plus que 2 cases?
SI Abs(nLArr - nLDep) > 2 ALORS
RENVOYER Faux
FIN
//2 cases?
SI Abs(nLArr - nLDep) = 2 ALORS
//Ligne 2?
SI nLDep = 7 ALORS
//Saut?
// trace(gtabTabTapie[nCDep][nLDep-1].sPositionChaineXX,gtabTabTapie[nCDep][nLDep-1].sPositionChaineYY)
RENVOYER gtabTabTapie[nCDep][nLDep-1].bPositionLibreON
SINON
RENVOYER Faux
FIN
FIN
SINON
//pas la même colonne
//Plus d'une case?
SI Abs(nCArr - nCDep) > 1 ALORS
RENVOYER Faux
FIN
//Ligne 5?
SI nLDep = 4 ALORS
//Y a t-il passage?
//contrôle la possibilité de prise en passant
SI nLArr <> 3 ALORS
RENVOYER Faux
FIN
SINON
RENVOYER Faux
FIN
FIN
CAS 30,31,-30,-31
//Tour
//si pas la même ligne ni la même colonne
SI nLDep <> nLArr ET nCDep <> nCArr ALORS
//
RENVOYER Faux
FIN
//Même colonne ?
SI nCDep = nCArr ALORS
// trace("Même colonne")
//Saut?
nDif = nLArr - nLDep
SI nDif > 1 ALORS
// Trace("Saut?")
POUR i = nLDep+1 _A_ nLArr-1
// trace("i = "+i)
// trace("EmplacementLibre "+gtabTabTapie[nCDep].bPositionLibreON)
SI PAS gtabTabTapie[nCDep].bPositionLibreON ALORS
RENVOYER Faux
FIN
FIN
FIN
SI nDif < -1 ALORS
// Trace("Saut?")
POUR i = nLDep-1 _A_ nLArr+1 PAS -1
// trace("i = "+i)
// trace("EmplacementLibre "+gtabTabTapie[nCDep].bPositionLibreON)
SI PAS gtabTabTapie[nCDep].bPositionLibreON ALORS
RENVOYER Faux
FIN
FIN
FIN
FIN
//Même ligne ?
SI nLDep = nLArr ALORS
// trace("Même ligne")
//Saut?
nDif = nCArr - nCDep
SI nDif > 1 ALORS
// Trace("Saut?")
POUR i = nCDep+1 _A_ nCArr-1
// trace("i = "+i)
// trace("EmplacementLibre "+gtabTabTapie[nlDep].bPositionLibreON)
SI PAS gtabTabTapie[nLDep].bPositionLibreON ALORS
RENVOYER Faux
FIN
FIN
FIN
SI nDif < -1 ALORS
// Trace("Saut?")
POUR i = nCDep-1 _A_ nCArr+1 PAS -1
// trace("i = "+i)
// trace("EmplacementLibre "+gtabTabTapie[nLDep].bPositionLibreON)
SI PAS gtabTabTapie[nLDep].bPositionLibreON ALORS
RENVOYER Faux
FIN
FIN
FIN
FIN
CAS 50,51,-50,-51
//Fou
//si la même ligne ou la même colonne
SI nLDep = nLArr OU nCDep = nCArr ALORS
RENVOYER Faux
FIN
//pas diagonal?
nDif = Abs(nCDep-nCArr)
nDif2 = Abs(nLDep-nLArr)
SI nDif <> nDif2 ALORS
// trace("Pas de diagonal")
RENVOYER Faux
FIN
//Saut?
nDif = nCArr-nCDep
nDif2 = nLArr-nLDep
c = nCDep
l = nLDep
//NE : Nord EST C+ L+
SI nDif > 0 ET nDif2 > 0 ALORS
// Trace("NE : Nord EST C+ L+")
POUR i = nLDep+1 _A_ nLArr-1
c++
l++
// Trace(c,l)
SI PAS gtabTabTapie[c][l].bPositionLibreON ALORS
RENVOYER Faux
FIN
FIN
FIN
//NO : Nord OUEST C- L+
SI nDif < 0 ET nDif2 > 0 ALORS
// Trace("NO : Nord OUEST C- L+")
POUR i = nLDep+1 _A_ nLArr-1
c--
l++
// Trace(c,l)
SI PAS gtabTabTapie[c][l].bPositionLibreON ALORS
RENVOYER Faux
FIN
FIN
FIN
//SE : Sud EST C+ L-
SI nDif > 0 ET nDif2 < 0 ALORS
// trace("SE : Sud EST C+ L-")
POUR i = nCDep+1 _A_ nCArr-1
c++
l--
// Trace(c,l)
SI PAS gtabTabTapie[c][l].bPositionLibreON ALORS
RENVOYER Faux
FIN
FIN
FIN
//SO : Sud OUEST C- L-
SI nDif < 0 ET nDif2 < 0 ALORS
// trace("SO : Sud OUEST C- L-")
POUR i = nLDep-1 _A_ nLArr+1 PAS -1
c--
l--
// Trace(c,l)
SI PAS gtabTabTapie[c][l].bPositionLibreON ALORS
RENVOYER Faux
FIN
FIN
FIN
AUTRES CAS
FIN
RENVOYER bEstValide
Prochaine Étape Raine et Roi
sachant que :
La reine se déplace exactement comme l'ensemble {Tour + fou}
Pour le roi une case à la fois dans n'importe quelle direction (avec prise en charge du petit roque 0-0 et grand roque 0-0-0 )
Bon dev
Bonjour
Reine et Roi terminé
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Je passe aux cavaliers
sachant que:
- déplacement de deux (2) cases en colonne ou en rangé + une (1) seule case en rangé ou en colonne .. c'est un vrai challenge
- possibilité de sauter
exemple d'une position de départ au milieu pour un cavalier:
Code de la procédure pour la version 20
Fichiers attachés:
intéressant de voir la progression du code.
j'ai eu a peine le temps de comprendre le code du point que tu es déjà au cavalier.
cela reste intéressant, mais vu la vitesse ne comptez pas sur moi.
je vais tout de même suivre le post avec intérêt.
channibal apprécie ceci.
Je suis également le sujet de prêt mais j'ai bien peur d'être largué niveau programmation (n'étant pas mon métier à la base)
Mais c'est très instructif et formateur !
intéressant de voir la progression du code.
j'ai eu a peine le temps de comprendre le code du point que tu es déjà au cavalier.
cela reste intéressant, mais vu la vitesse ne comptez pas sur moi.
je vais tout de même suivre le post avec intérêt.Cliquez pour agrandir...
Tout le programme se base sur la notion pièce et emplacement. si on met l'aspect "graphique" à coté, tout ce qui nous importe c'est une matrice de 64 cases (positions)
Dans le projet cette matrice est représenté par un tableau a 2 dimensions 8 x 8 de structure gtabTabTapie qui contient tout les information sur une case donnée a un instant donnée :
- nLaPosition : un numéro séquentiel de la case de 1 a 64
- nCoordX : coordonnée X pour la graphique
- nCoordY : coordonnée y pour la graphique
- nPositionXX : colonne de 1 a 8
- nPositionYY : rangé (linge) de 1 a 8
- sPositionChaineXX : colonne de "a" a "h"
- sPositionChaineYY : rangé (linge) de 1 a 8
- bPositionLibreON : vrai ou faux si la case est libre ou pas
- nPositionCouleur : couleur de la case 0 ou 1 noir ou blanc
Un tableau de 1 dimension de 32 structures gtabTabPieces pour stocker les information sur chaque pièce :
nIDPiece : un identifiant unique pour chaque pièce détaillé sur image dans la fenêtre principale (de 20 a 27 pour les pions, 30 et 31 pour les tour ... et les mèmes en négatif pour les pièces noirs)
sNomPiece : Nom de la pièce
nCouleurPiece : couleur de la pièce 0 ou 1 (noir / blanc)
nPositionXX : de 1 a 8
nPositionYY : de 1 a 8
sPositionChaineXX : de "a" a "h"
sPositionChaineYY : de 1 a 8
nTypePiece : type de la pièce de 1 a 6
sNomTypePiece : Type de la pièce (pion, roi ...)
nValeurPiece : valeur de la pièce de 1 à 5 (valeur d'un cheval est de 2, celle d'une tour est de 3...)
bCaptureeON : pièce capturé ou pas
bActiveON : pièce active ou pas (au départ)
sImagePiece : image de la pièce
nLaPosition : séquentielle position de départ
nCoordX : coordonnées graphiques
nCoordY : coordonnées graphiques
voici un exemple de code de remplissage pour un roi blanc :
Code (Text):
gtabTabPieces[i].bActiveON = Faux
gtabTabPieces[i].bCaptureeON = Faux
gtabTabPieces[i].nCoordX = 198
gtabTabPieces[i].nCoordY = 342
gtabTabPieces[i].nCouleurPiece = 0
gtabTabPieces[i].nIDPiece = 1
gtabTabPieces[i].nLaPosition = 5
gtabTabPieces[i].nPositionXX = 5
gtabTabPieces[i].nPositionYY = 1
gtabTabPieces[i].nTypePiece = 4
gtabTabPieces[i].nValeurPiece = 5
gtabTabPieces[i].sImagePiece = "IMG_KingWhite"
gtabTabPieces[i].sNomPiece = "K"
gtabTabPieces[i].sNomTypePiece = "King"
gtabTabPieces[i].sPositionChaineXX = "E"
gtabTabPieces[i].sPositionChaineYY = "1"
gtabTabPieces[i].bCaptureeON = Faux
gtabTabPieces[i].nCoordX = 198
gtabTabPieces[i].nCoordY = 342
gtabTabPieces[i].nCouleurPiece = 0
gtabTabPieces[i].nIDPiece = 1
gtabTabPieces[i].nLaPosition = 5
gtabTabPieces[i].nPositionXX = 5
gtabTabPieces[i].nPositionYY = 1
gtabTabPieces[i].nTypePiece = 4
gtabTabPieces[i].nValeurPiece = 5
gtabTabPieces[i].sImagePiece = "IMG_KingWhite"
gtabTabPieces[i].sNomPiece = "K"
gtabTabPieces[i].sNomTypePiece = "King"
gtabTabPieces[i].sPositionChaineXX = "E"
gtabTabPieces[i].sPositionChaineYY = "1"
Ou démarrage d'une nouvelle partie on commence par créer une nouvelle tapie avec une position de départ
La procédure RelevePosition(MoiMême..Nom) qui se trouve dans chaque code de clic des images vides et des images des pièces sert a relever et a traiter 2 cas :
- Position de départ (doit être une pièce ) si c'est ok alors la variable globale gnIDPiece_Selectionnee est renseigner avec la valeur de l'ID de la pièce sélectionnée et la variable gbSelection = vrai
ou
- Position d'arrivée qui peut être une case vide ou une pièce adverse a capturer gbSelection = faux
Une procédure DeplacementValide(nColDepart,nLigDepart,nCol,nLig) pour vérifier si un déplacement est autorisé ou pas
Une procédure MovePiece(gnIDPiece_Selectionnee,nCol,nLig) pour faire déplacer les pièce et mettre a jour nos 2 tableaux (tapie et pièces)
Voila j’espère que ça peut aider a mieux comprendre le concept
joker apprécie ceci.