Forum Programmation.c ia d'échec...

Posté par  .
Étiquettes : aucune
0
21
juil.
2004
Voila mon problème :
Je cherches a faiure une ia pour jeu d'échec...
j'ai bien commencé mon jeu, vous pouveze télécharger les sources ici :
http://coucou747.hopto.org/c/echecs.zip(...)

J'ai deux bugs non déclarés : on ne peut pas roquer, et pas d'ia... l'ia c'est normal, j'ai pas mis la fonction, mais pour le roque, je sais pas d'ou ça vient...

Voila, j'aimerais que qqn m'aide car j'ai un peu peur du vide, et voila, je suis un peu perdu (LOL) je sais pas par ou commencer, j'ai pas un jeu structurel alors voila...

Pour jouer, mettez la première lettre du nom de la pièce en majuscule puis la case d'arrivée ex : Cc3 pour le cavalier en c3. Quand une pièce prends on met un x entre la pièce et la case d'arrivée ex : Cxe4. Si deux pièces peuvent arriver au même endroit, on met la colone de départ : Cbc3

Pour les pions, c'est un peu différent, on met seulement la case d'érrivée. Si un pion prneds on met la colone de départ puis x puis la case d'arrivée ex : e4 ou dxe5 ect...

Pour roquer c'est O-O pour le petit roque et O-O-O pour le grand

Voila, je crois avoir tout dis...
Sauf merci d'avance c'est assez complexe.
  • # code

    Posté par  (site web personnel) . Évalué à 3.

    essai de mieux structurer ton code, et de bien te mettre à la place du programme :
    par exemple tu fais plusieurs comparaisons à la suite comme ca :
    if (coup[0]==84) piece=2; /*ici une tour*/
    if (coup[0]==67) piece=3; /*ici un cavalier*/
    if (coup[0]==70) piece=4; /*ici un fou*/
    if (coup[0]==68) piece=5;
    etc.
    ton programme va faire chaque test à chaque fois alors que toi tu sais qu'il n'y aura qu'un seul cas de possible...

    tu peux améliorer en faisant celà :
    if (coup[0]==84) piece=2; /*ici une tour*/
    else if (coup[0]==67) piece=3; /*ici un cavalier*/
    else if (coup[0]==70) piece=4; /*ici un fou*/
    else if (coup[0]==68) piece=5;

    ou encore plus propre :
    switch(coup[0]){
    case 67: piece=3;break;
    case 70: piece=4;break;
    case 68: piece=5;break;
    etc.
    default://met ici les autres cas bizzare.
    }

    tu peux ajouter de la lisibilité plutôt que de mettre des commentaires, par exemple :
    au début du programme :
    #define TOUR 84
    #define CAVALIER 67
    #define FOU 70

    et dans le code :

    switch(coup[0]){
    case TOUR: ...
    case CAVALIER: ...

    etc.

    sinon la boucle infinie, tu peux mettre while(1)

    un dernier conseil : essai de faire des fonctions pour bien séparer les différences parties de ton code.

    Avec tous ces conseils tu devrais déjà avoir un code plus lisible et beaucoup plus facilement débuguable !

    Tu sembles débuter en programmation, mais surtout ne te décourage pas, on est tous passsés par là ;)
    • [^] # Re: code

      Posté par  . Évalué à 0.

      bah en fait, ça fait 4 ans que je débutte en programmation...
      je reviens d'un long parcours difficile (de s'en séparer) en Qbasic, 104 programmes a télécharger sur mon site...
      Ensuite, j'ai fais du html pour créer mon site, puis du javascript pour améliorer mon site...
      Il y a un an, du tibasic pour le lycé et du C pour ma satisfaction personelle... Donc, j'ai appris le C seul depuis octobre a peu près.Voila, donc, comme j'avance lentement, on peut dire que je débute...

      Donc, j'ai pensé a ce que tu as mis, mais la, tu met juste un conseil de programmation, pas la ou est le bug pour les roques, ni comment faire une ia, cependant tes remarques sont très pertinentes sache que j'en tiendrais compte. Tu as dis que je n'avais pas fait plusieurs fonctions... j'en ai mis une par fichier pour plus de claretée, mais j'ai aff echecblanc echecnoir droitblanc droitnoir et main...
      J'aurais pu mettre plus de fonctions mais je sort d'un long parcours dans les sinueux passages du Qbasic...
      donc en fait voila, merci pour ton commentaire, tu m'avance pas vraiment pour ça, mais tu m'avance bien pour ma programmation en général.
      • [^] # Re: code

        Posté par  (site web personnel) . Évalué à 3.

        oué effectivement mes conseils ne change pas grand chose à tes problèmes :)
        Pour les fonctions, ne pas les mettres dans un .h surtout, ça ne sert pas à celà :)
        Le corps des fonctions dois toujours être placé dans des fichiers .c. Dans le .h tu déclare juste les prototypes.
        Je m'explique :
        dans fonctions.h :
        void mafonction(int a); // c'est juste une déclaration (.h --> header --> en-tête)

        dans fonctions.c :
        #include "fonctions.h" // j'indique ici les déclarations histoire que le compilo vérifie que ca colle bien

        void mafonction(int a){
        ici je fais le boulot
        }

        dans autre.c :
        #include "fonctions.h" // j'indique ici que je veux utiliser les fonctions dont les signatures sont dans fonctions.h

        à la compilation :
        gcc -c fonctions.c --> créer le module compilé fonctions.o
        gcc -c autre.c --> créer le module compilé autre.o
        gcc -o monprogram fonctions.o autre.o --> créer le programme final à partir des 2

        Un conseil, achète un bouquin de C ;)

        Pour ce qui est de l'IA, il existe des algo sur le net déjà écrit en C... je penses que tu pourras les utiliser. Voici un exemple de code source de programme d'échec :
        http://tict.ticalc.org/downloads/Chess-5.00.zip(...)
        http://tict.ticalc.org/downloads/crafty179.zip(...)
        tu as surement moyen de réutiliser les algos...

        sinon l'algo le plus simple, algo du minmax :
        - tu calcules tous les coups possibles et tu prends le meilleur. (manger une tour est meilleur que manger un pion, etc. : il faut classer les coups)
        - tu calcules la même chose pour le coup de l'humain en ayant supposer un coup pour la machine : celà te permet d'aller voir un coup en avant, d'anticiper. Tu peux normalement faire celà de manière récursive sur n-coup pour anticiper le plus loins possible dans le temps, avec toujours à chaque fois la même technique : tu choisis le meilleur coup que tu es trouvé.
  • # Commentaire supprimé

    Posté par  . Évalué à 3.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Re: IA

      Posté par  (site web personnel) . Évalué à 2.

      AHHHH .... ca me rappelle mes vieux cours de résolution de problème ... on en vient toujours à ces solutions là ;)

      Par contre, de là à appeler ca de l'IA c'est un autre débat (ou troll c'est au choix) ...

      Dans tes liens, je ne sais pas si c'est bien expliqué , un bon exemple en faisant tourner l'algo est quand même le mieux...

      Vu la profondeur d'un jeu d'echec ... comme on ne va pas au bout des branches... l'évaluation des coups me parait plus difficile

      Je n'ai pas trouvé de fonction d'évaluation celle ci doit etre rapide (ainsi on peut aller très vite loin en profondeur) ... mais également suffisament précise sur la valeur du coup hypothétique (le notre ou adverse)... bref pas vraiment très évident à coder ca!!!
      • [^] # Re: IA

        Posté par  . Évalué à 1.

        C'est la partie la plus difficile la fonction d'evalutation d'une position et c'est pareil pour un joueur humain, apprendre a bouger les pieces c'est le plus facile mais savoir bien les bouger ca c'est le plus dur meme si les meilleurs coups sont les coups les plus simples.
        • [^] # Re: IA

          Posté par  (site web personnel) . Évalué à 2.

          Justement, c'est là que l'IA doit faire des progrès AMHA!
          Si aujourd'hui les grands joueurs arrivent à se mesurer à des super computers, ce n'est parce que eux même arrive à voir à une profondeur de 50 coups, en faisant une bonne évalutation de chaque coup, mais plutôt parce qu'ils marchent avec des schémas, "reconnaissance de situations", ce qui marche par l'apprentissage ...
          J'imagine que les futurs jeux feront ainsi ...

          bon pour un débutant, s'pa évident non plus ;)
      • [^] # Commentaire supprimé

        Posté par  . Évalué à 1.

        Ce commentaire a été supprimé par l’équipe de modération.

        • [^] # Commentaire supprimé

          Posté par  . Évalué à 2.

          Ce commentaire a été supprimé par l’équipe de modération.

  • # Roque

    Posté par  . Évalué à 1.

    Pour le roque c'est un peu complique ca se gere en ajoutant des rois sur les cases que le rois traverse en s'assurant qu'elles sont vides sinon impossible:
    0-0 pour les blancs donne la creation du roi f1 et g1 tu as donc trois rois(e1/f1/g1), au tour des noirs tu verifies si tu peux prendre un roi si oui position illegal (on ne peut pas roquer si le roi passe une case en prise) et au tour suivant (blanc) tu nettoyes les rois supplementaire en conservant celui en g1. Tu sais que tu as roquer car tu as 3 rois blancs sur l'echiquier
    • [^] # Re: Roque

      Posté par  . Évalué à 1.

      Je croyais que le roi ne pouvait plus roque s'il avait ete precedemment mis en echec. Tu as oublie ce cas non ?
  • # Un dossier là dessus dans les LMF

    Posté par  (site web personnel) . Évalué à 2.

    LMF a sorti des articles à ce sujet qui sont tout bonnement excellents:
  • # Intelligence certes mais artificielle quand même....

    Posté par  . Évalué à 1.

    Je sais qu'il existe au échecs une facon de compter les points en fonction: des positions des pièces, et des pièces restante en jeu.

    A partir de là, c'est "facile", tu comptes pour toutes les possibilités de mouvement (en déplacant chaque pièce dans toutes les directions) la valeur finale de ce mouvement, puis, pour chacune d'elle, tu calcules la meilleure position adverse.
    Tu gardes en mémoire la différence de point la plus élevée (en gros, cela veux dire que tu as une amélioration de ta situation). Tu mémorise donc ce premier enchaînement de coup (un pour toi, un pour lui), et tu continue avec cette position théorique, sur un, deux, ou trois coup.

    Ca c'est le principe de base.

    Ensuite, il peux être intéressant de mémoriser d'autres coups (les 3 meileurs par exemple, le moins bon également) au départ pour explorer d'autres solutions.

    En algo, ca donne:

    Score = calculDuScore() //Le score au début du tour
    ScoreAdv = 0;
    For Each pièces
    For Each mouv = mouvement possible
    ScoreTmp = calculDuScore()
    Si ScoreTmp < Score //Régression du score
    Next
    For Each piècesAdverse
    For Each MouvAdv = mouvement possible
    ScoreTmp2 = calculDuScore()
    Si ScoreTmp2 > ScoreAdv
    ScoreAdv = ScoreTmp2
    MouvMem = MouvAdv
    FinSi
    FinFor
    FinFor
    ScoreTmp = ScoreTmp - ScoreAdv
    Si ScoreTmp > Score
    MouvList = MouvList + (Mouv + MouvAdv + ScoreTmp)
    FinSi
    FinFor
    BestMouv = MaxScore(MouvList)

    Voilà pour calculer le Meilleur Mouvement. PLus qu'à faire une fonction Anticiper() qui calcule plusieurs coup d'affilée, et voilou :)
    • [^] # Re: Intelligence certes mais artificielle quand même....

      Posté par  . Évalué à 0.

      Je vous met au défi de batre les ordi qui jouent contre les grands maitre!
      En effet ce que vous dites est inexact, cette année, l'homme a batu l'ordi,n mais l'année dèrnière, une victoire chacun, cinq nules suivit d'une victoire de l'ordi (a 4 heure en moyenne la partie, j'imagine pas le stress...)

      Voila, Je ne sais pas si vous avez tous regardé mon code... j'ai déja fait la fonction pour les roques...
      Je vous détaille rapidement les règles des roques :
      pour O-O-O
      Le roi est en e1 la tour en a1
      Le roi va en c1 la tour en d1
      Le roi et la tour ne doivent pas avoir bougé
      Le roi ne doit pas être échec
      Le roi ne doit pas passer par une position d'échecs...

      ainsi, j'ai fait un enregistrement des cases de départ dans un tableau juste pour ça... Et c'est ça qui bugg il me met le roi a déja bopugé...
      Je penses que ça viens de l'enregistrement des coups dans mon pointeur...
      ainsi, je vais faire 4 variables pour les roques et enlever ce **** de pointeur...

      Voila vous avez peut de chance de réussir a m'aprendre une règle d'échec... j'en fais depuis que je suis tout petit.
      La dame vaut 9
      La tour vaut 5
      le cavalier vaut 3
      le fou vaut 3.5 oou 4
      le pion vaut 1
      et on ne met jamais de valeur au roi dans les tournois... un mat, on mettre une valeur énorme comme 100000 comme ça on ne risque rien.

      évidement ça c'est théorique, on ne peut pas faire ça sur une ia car c'est bien trop faible comme recherche, faut aussi regarder si il y a échec on rajoute 2, si il y a des pions doublés on enlève 0.5 ect...

      Pour connaitre la valeur d'une branche, je penses qu'il faut faire la moyenne entre avant que les noirs jouent et après... sinon, on fausse tout...

      Merci pour vos commentaires, je sais pas si j'y arriverais, j'ai le temps, et vos commentaires seront de toute façon très utililes...

      Je vais commencer par débugger ça, pour l'ia, je chercherais parmi vos codes source et vos sites...
      • [^] # Re: Intelligence certes mais artificielle quand même....

        Posté par  . Évalué à 1.

        J'arrive pas à choper ton code source.

        SI tu pouvais nous lister toutes les façons de compter les points, ca pourrasi nou aider (positionnel, etc, etc...)
        • [^] # Re: Intelligence certes mais artificielle quand même....

          Posté par  . Évalué à 1.

          Bah en fait, mon code source est accesible a
          http://coucou747.hopto.org/c/echecs.zip(...)

          enfin, normalement, c'est en ligne

          Quand on a deux pions sur la même colone, on apelle ça des pions doublés et c'est une faiblesse!
          Si l'autre a un pion passé : un pion qui n'a ni pion adverse devant lui, ni ion adverse a gauche ni adverse a droite : un pion qui n'a pas de pion adverse en obstacle... ce pion la est fort car il peut aller a dame (ah oui, il y a ça que je n'ai pas géré... je ferais cette fonction bientot).

          Si vous pièces sont protégés plus de fois qu'elles sont attaqués...
          Si vous attaquez une pièce plus de fois qu'elle n'est protégé...
          Si il y a échec...
          Si le roi est dèrière un roque solide...
          Si le roque est cassé...
          Si le roi ne peut plus roquer...
          Si le centre est bien maitrisé...
          Mais tout cela, ce n'est que des suptilitées de positions...
          Si un pion s'aprète a aller a dame...

          Ce n'est rien face a un cavalier d'avance (sauf ce qui touche au roque et aux promotions de pions)...

          Enfin, voila quoi toutes ces suptilitées de positions...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.