• [^] # Re: Désolé...

    Posté par . En réponse au message Programmation d'un jeu de dames chinoises. Évalué à 1.

    Autres idées:

    http://ramal.free.fr/cc_fr.htm
    qui renvoie sur
    http://www.csis.hku.hk/~kao/spc/cc_rule.html#introduction
    J'ai trouvé d'autres liens, mais peu informatifs...

    Le deuxième lien numérote les cases du plateau, mais je pense que le représenter en mémoire sous forme de vecteur de 1 à 121 n'est pas forcément une bonne solution: l'algo qui détermine un coup possible serait très compliqué... Une matrice devrait faire l'affaire: tu perds un peu de mémoire (les coins et une partie des bords ne sont pas utilisés), mais l'algo de déplacement est plus facile à implémenter (et plus rapide probablement), si on fait attention aux bords du plateau. Tu peux considérer que, dans ta matrice, un déplacement à gauche revient à un délacement à gauche sur le plateau, idem à droite, un déplacement en haut sur ta matrice revient à haut-gauche sur le plateau, et prendre la case dans la diagonale haut-droit représente un déplacement haut-droit sur le plateau. idem en bas... C'est bien sûr une représentation, à toi de choisir la tienne (en s'assurant qu'elle soit cohérente (par ex, un coup puis le coup inverse te ramène dans la même case))

    Comme je l'ai dit, tu as entre 2 et 6 joueurs, donc tu as 7 possibilités par case. Définir un type contenant un champs de 4 bits serait donc suffisant (je pense que le C++ permet de le faire, non ?). Ensuite, tu établis ta matrice avec ce type comme "base".

    Ta fonction d'évaluation doit attribuer le score maximal au plateau où tes 10 cases d'arrivée sont prises par tes propres pions; et un score minimal si un des adversaires remplit son coin. Pour le début, il vaut mieux construire une fonction d'évaluation simple comme je l'ai décrit, mais qui marche; une fois que ton programme fonctionnera, tu pourras la faire évoluer.

    D'ailleurs, un petit truc: tu peux créer plusieurs IA dans ton programme. Il suffit de définir un prototype fixe pour ces fonctions, une option de paramétrage de la difficulté, et une fonction appelée par ta boucle de jeu principale qui va appeler la bonne fonction d'évaluation en fonction de la difficulté. (du style: facile -> la fonction f naîve, moyen -> une fonction plus évoluée, difficile -> f plus compliquée, avec plus de demi-coups d'avance). Ca permet, de plus, de faire jouer une IA contre une autre... et donc de vérifier si une IA est plus efficace qu'une autre.

    De tête, le prototype peut ressembler à ça:
    coup evalue(damier, joueur, profondeur)
    où "coup" est le type représentant un coup à jouer, "damier" je te laisse deviner, "joueur" le joueur qui va jouer et "profondeur" le nombre de demi-coups d'avance.

    De plus, ça permet de faire en sorte que ta fonction evalue() puisse utiliser n'importe quel algo, même autre-chose que min-max (le paramètre "profondeur" pouvant être utilisé pour régler ton algo d'une autre manière). Tu sépares ta partie IA du reste, donc tu gagnes en modularité. Tu peux même imaginer ensuite une IA pour laquelle une structure de données différente de celle que tu as choisi au départ est optimale: alors la fonction evalue() peut convertir les paramètres dans le bon format de données avant d'executer l'algo "pour de bon". Pas besoin de tout casser le jour où tu auras trouvé la fonction d'évaluation optimale ;)

    J'avais fait ça en C pour le othello, en C++ tu peux faire de la même manière en procédural, ou en objet (avec chaque IA représentée par une classe ayant une méthode evalue() )