1. 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.

  1. channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    Bonjour a toutes et a tous,

    Comme je suis en vacances (techniquement :) ) et que je ne peux pas partir en vacances (pratiquement :D ) et que la Coupe de Monde n'est plus intéressante :( et que le Tour de France ne l'est plus depuis les affaires de dopage :( je me suis penché sur mes archives, pas de l’époque de Basic, c++ ou de pascal, mais celles des anciennes versions de windev. Oui je suis accro :)
    Alors une idée m'a venu a l’esprit:
    J'ai travaillé en collectif, depuis le PFE (comme la plus part de nous tous) jusqu’à des gros projets qui nécessitent plus d'organisation et d'effort, et je sais, par expérience, que c'est très intéressant d’échanger les idées et les manières de faire entre des développeurs sur un même projet. Il y a toujours des différentes manières de faire, ce qui met en évidence la créativité du cerveau humain. Si vous avez vécu cette expérience vous me comprendriez facilement.
    L'idée est de mettre en ligne un petit projet, avec une version 0 par exemple, et de fixer un but, une tache a faire, pour passer a la version suivante.
    J'ai trouvé des petits projets genre: sudoku, jeux de cartes, Motus , des chiffres et des lettres, les échecs ... c'était des projets de dimanche ou quand j'avais pas trop de boulot, bref, je passai le temps tout en enrichissant ma maitrise du langage. Et ça m'a beaucoup aidé dans mon long parcours (bientôt 30 ans de programmation et de développement dont 18 ans de windev!) alors pourquoi ne pas en faire profiter des autres ;)

    Si vous êtes d'accord je vous propose, pour commencer, un projet de jeu d’Échecs, version 14 d'origine je crois, que je viens de le passer à la version 22. j'ai choisi les échecs parce que, contrairement aux apparences, est très simple a le faire oui je vous assure ;)

    Nom de projet : Chess
    La méthode de développement : Procédurale. (Pas de POO pour que tout le monde y trouve son bonheur)
    Progression : Je dirais 10%
    Les interfaces moderne des jeux d’Échecs se base sur les puissants moteurs existants et ne font qu’interpréter les commandes en visuel, chose qu'on va pas le faire dans ce projet ;)
    Pas d'utilisation de moteurs, pas encore.
    Si on va intégrer des moteurs comme Stockfish, Houdini, Rybka ..., pour les calculs, contrôle des coups et l'analyse alors ça ne va pas nous laisser grande chose a faire et on aura qu'un simple interface graphique.
    Alors que le but initial est de TOUT faire par nous même ou presque :)
    L’intégration des moteurs sera dans l'étape finale.

    Je vais pas proposer une tache a faire (pas encore) je vous laisse le temps de comprendre la démarche que j'ai choisi et de poser les questions pour qu'on puisse partir sur la même base.

    PS : N'oubliez pas que le but initial est d'exploiter au maximum le langage de programmation pour mieux maitriser notre outil de travail ;)

    Voici le projet.

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Bonnes vacances :D
     
    #1 channibal, Juil 6, 2018
    Dernière édition: Juil 6, 2018
    Tags:
  2. popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,964
    J'aime reçus:
    1,575
    Donc, pour l'instant, si j'ai bien compris, pas d'intelligence artificielle ?
     
  3. obir

    obir Member

    Inscrit:
    Jan 1, 2018
    Messages:
    78
    J'aime reçus:
    78

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Bonjour a toutes et a tous,

    Comme je suis en vacances (techniquement :) ) et que je ne peux pas partir en vacances (pratiquement :D ) et que la Coupe de Monde n'est plus intéressante :( et que le Tour de France ne l'est plus depuis les affaires de dopage :( je me suis penché sur mes archives, pas de l’époque de Basic, c++ ou de pascal, mais celles des anciennes versions de windev. Oui je suis accro :)
    Alors une idée m'a venu a l’esprit:
    J'ai travaillé en collectif, depuis le PFE (comme la plus part de nous tous) jusqu’à des gros projets qui nécessitent plus d'organisation et d'effort, et je sais, par expérience, que c'est très intéressant d’échanger les idées et les manières de faire entre des développeurs sur un même projet. Il y a toujours des différentes manières de faire, ce qui met en évidence la créativité du cerveau humain. Si vous avez vécu cette expérience vous me comprendriez facilement.
    L'idée est de mettre en ligne un petit projet, avec une version 0 par exemple, et de fixer un but, une tache a faire, pour passer a la version suivante.
    J'ai trouvé des petits projets genre: sudoku, jeux de cartes, Motus , des chiffres et des lettres, les échecs ... c'était des projets de dimanche ou quand j'avais pas trop de boulot, bref, je passai le temps tout en enrichissant ma maitrise du langage. Et ça m'a beaucoup aidé dans mon long parcours (bientôt 30 ans de programmation et de développement dont 18 ans de windev!) alors pourquoi ne pas en faire profiter des autres ;)

    Si vous êtes d'accord je vous propose, pour commencer, un projet de jeu d’Échecs, version 14 d'origine je crois, que je viens de le passer à la version 22. j'ai choisi les échecs parce que, contrairement aux apparences, est très simple a le faire oui je vous assure ;)

    Nom de projet : Chess
    La méthode de développement : Procédurale. (Pas de POO pour que tout le monde y trouve son bonheur)
    Progression : Je dirais 10%
    Les interfaces moderne des jeux d’Échecs se base sur les puissants moteurs existants et ne font qu’interpréter les commandes en visuel, chose qu'on va pas le faire dans ce projet ;)
    Pas d'utilisation de moteurs, pas encore.
    Si on va intégrer des moteurs comme Stockfish, Houdini, Rybka ..., pour les calculs, contrôle des coups et l'analyse alors ça ne va pas nous laisser grande chose a faire et on aura qu'un simple interface graphique.
    Alors que le but initial est de TOUT faire par nous même ou presque :)
    L’intégration des moteurs sera dans l'étape finale.

    Je vais pas proposer une tache a faire (pas encore) je vous laisse le temps de comprendre la démarche que j'ai choisi et de poser les questions pour qu'on puisse partir sur la même base.

    PS : N'oubliez pas que le but initial est d'exploiter au maximum le langage de programmation pour mieux maitriser notre outil de travail ;)

    Voici le projet.

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Bonnes vacances :D
    Cliquez pour agrandir...
    _____________________________________________________________________________________________________________________
    Bonjour, a toi

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!


    Voilà un ide intéressant sur le point de vue de partage des connaissances sur le langage de programmation pour mieux maîtriser notre outil de travail !!!
     
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Donc, pour l'instant, si j'ai bien compris, pas d'intelligence artificielle ?
    Cliquez pour agrandir...
    Oui. A mon avis on va pas programmer tout un moteur (ça sert a rien de réinventer la roue) mais juste l’essentiel : comme dire si les trais sont aux blanc, si le joueur noir a le droit de jouer ou pas, préciser les règles de mouvement pour chaque pièces... n'oublions pas que le but est d'exploiter le Langage au maximum possible.

    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.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    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.
     
    joker et Fakirato aiment ça.
  • dohmien

    dohmien Member

    Inscrit:
    Juin 14, 2018
    Messages:
    85
    J'aime reçus:
    34
    Je voudrais bien tenter pour voir mais je n'ai pas la version22, serait-il possible de l'avoir en version20 ?
     
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Je voudrais bien tenter pour voir mais je n'ai pas la version22, serait-il possible de l'avoir en version20 ?
    Cliquez pour agrandir...
    Voici, j’espère que ça marchera, il faut réparer le projet avant

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Bon Dev
     
    joker et dohmien aiment ça.
  • WX1331

    WX1331 Well-Known Member
    MEMBRE WX DUMP TEAM

    Inscrit:
    Jan 1, 2018
    Messages:
    614
    J'aime reçus:
    679
    Salut les développeurs

    Etant joueurs d’échecs (ni un pro ni débutant), je suis intéresse par le projet.

    salutations
     
    Fakirato apprécie ceci.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    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.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    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.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    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.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    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 :D
     
    #12 channibal, Juil 10, 2018
    Dernière édition: Juil 10, 2018
    WX1331 et joker aiment ça.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    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 :p

    - possibilité de sauter

    exemple d'une position de départ au milieu pour un cavalier:

    [​IMG]

    Code de la procédure pour la version 20
     

    Fichiers attachés:

    joker et WX1331 aiment ça.
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,964
    J'aime reçus:
    1,575
    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.
  • dohmien

    dohmien Member

    Inscrit:
    Juin 14, 2018
    Messages:
    85
    J'aime reçus:
    34
    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 !
     
  • WX1331

    WX1331 Well-Known Member
    MEMBRE WX DUMP TEAM

    Inscrit:
    Jan 1, 2018
    Messages:
    614
    J'aime reçus:
    679
    Channibal : sûrement tu viens d'une planète qui s'appelle Kasparov ou Karpov.
     
    channibal apprécie ceci.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    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...
    En fait c'est plus simple qu'en a l'aire :) je m'explique :

    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"
     
    Un troisième tableau de 1 dimension de structure : gtabTabPositions qui stock les coordonnées d'une case et l'ID de la pièce qui y trouve est qui ne sert a rien pour le moment

    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 :D
     
    joker apprécie ceci.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    Récup plus claire de toutes les procédures importantes du projet:

    La Procédure RelevePosition() qui se trouve dans le code clic de chaque image vide sur le tapie
    relève la position de la case d'arrivée si la variable gbSelection = vrai (si une pièce est déjà sélectionnée)

    La procédure ReleveIDPiece() qui se trouve dans le code clic de chaque images de pièce sur le tapie
    relève la position de la case de départ de la pièce +son identité. Cette procédure se compose de 2 sous procédures :
    SI gbSelection = faux alors on relève l'identité de la première pièce
    ReleveIDPiece_1(sNomPiece)
    SINON, on relève l'identité de la deuxième pièce pour savoir s'il s'agit d'une errer (pièces de même couleur) ou d'une prise (pièce adverse)
    ReleveIDPiece_2(sNomPiece)

    La procédure DeplacementValide(nColDepart,nLigDepart,nCol,nLig) pour vérifier si un déplacement est autorisé ou pas

    La procédure MovePiece(gnIDPiece_Selectionnee,nCol,nLig) pour faire déplacer les pièce et mettre à jour nos 2 tableaux (tapie et pièces)

    PS: les prises ne sont pas encore traitées
    Si vous avez des questions je suis en vacances => dispo :D
     
    joker apprécie ceci.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    En fait il parait que le cavalier n'est pas aussi compliqué qu'il en a l'air :D

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    code de la procédure de contrôle

    Code (Text):
            nDif  = Abs(nCArr-nCDep)
            nDif2 = Abs(nLArr-nLDep)
            SI nDif = nDif2  ALORS
                RENVOYER Faux
            FIN
            SI nDif = 0 OU nDif2 = 0 ALORS
                RENVOYER Faux
            FIN
            SI nDif > 2 OU nDif2 > 2 ALORS
                RENVOYER Faux
            FIN
    c'est simple: Il faux obligatoirement qu'une valeur soit égale a 1 et l'autre égale a 2 ou l'inverse
    les deux valeurs ne doivent pas être égaux ni dépasser la valeur 2

    Voila, c'est terminé pour les contrôles

    L’étape suivante et d'attaquer les prises :D
    Si entretemps il y a des erreurs a corriger ou des modifications a suggérer je suis preneur

    Code pour windev 22
     

    Fichiers attachés:

    #19 channibal, Juil 11, 2018
    Dernière édition: Juil 11, 2018
    Motorola et joker aiment ça.
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    C'est vrai que le Cavalier est un cas à part dans le jeux avec son déplacement en L :
    - Xavier Tartakower, dans son Bréviaire des échecs, rapporte la définition suivante de la marche du cavalier due à M. Delangre : « Le Cavalier va d'une case noire à une case blanche (ou inversement) en sautant une case ».
    C'est la seule pièce du jeu qui ne soit pas bloquée dans son déplacement par les autres pièces. (*)

    Une programmation particulière que tu résumes bien :)

    (*) Extrait de

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    [​IMG] (Un Cavalier Staunton)
    Cliquez pour agrandir...
    Bien que je suis plutôt pro Bobby Fischer que Kasparov, vu mes penchés pour les sacrifices, je prône de loin le jeu des cavaliers, c'est un gros atout pour les connaisseurs ;)
    un adepte de fourchette quoi :p miam miam miam :D
     
    WX1331 et joker aiment ça.
  • Partager cette page

    Chargement...