Salut,
Après avoir fait un petit jeu de dominos en JS, j'ai envie de me concentrer sur un jeu plus classique : les échecs.
J'abandonne le JS pour le C# et une appli EXE, histoire d'avoir une plus grande rapidité de traîtement vu ce que je veux faire, et surtout, un modèle objet qui tiens la route.
Jusqu'à présent, j'ai modélisé :
- L'échiquier (Array de 64 lignes, avec un modulo 8 et des divisions entières je devrais être capable de me balader dedans sans problème)
- Les pièces et leurs mouvements possible (un objet "abstract" nommé pièce dont hérite chaque type de pièce qui comporte notamment en interne les mouvements possibles et quelques infos (sauter par dessus les autres pièces, mouvement possible seulement au premier tour, mouvement possible seulement une fois -roque-, etc.)
Maintenant que la base du programme connaît les règles de bases, je veux faire le moteur AI.
Deux solutions s'offraient à moi, une "AI qui apprends", et une "AI qui choisi le meilleur choix parmi X".
La première solution consisterait à enregistrer toutes les parties que le jeu a fait, et comparer le jeu en cours avec un jeu déjà joué, afin de choisir parmi les scénarios déjà vus celui qui lui donne le plus de chances de prendre l'avantage. Cette solution est chiante, car il faudrait jouer des heures et des heures contre un ordinateur complètement débile avant qu'il commence à jouer correctement. Et à coup sûr, les fin de parties seraient catastrophiques de nullité.
La seconde consiste à définir un nombre de "coups futurs" à simuler, et avant chaque mouvement, le PC calcule ce que donnerait au bout de X coup chaque mouvement de chaque pièce, afin de retenir le coup qui offre les meilleures perspectives. Avec X suffisament évolué, ça doit donner une AI capable de rivaliser avec Deep Blue (et des coups qui durent 2 jours je temps de tout simuler )
Je pense retenir la seconde solution étant donné qu'elle est à priori plus simple, et me semble offrir un meilleur niveau de jeu.
Par contre, à mon avis ça demande pas mal d'optimisation... Parceque pour chaque "coup", faut que je recopie énormément de choses en mémoire !
C'est à dire que si je veux juste simuler le prochain coup :
pour chaque piece de mon jeu
pour chaque mouvement possible de ma piece
je recopie l'échiquier et les pièces dans un coin
je fais le mouvement dans cette copie
pour chaque piece du jeu adverse
pour chaque mouvement possible de sa piece
je recopie l'échiquier dans un coin
je fais le mouvement
<éventuellement je fais mon appel récursif ici>
je regarde si c'est bien ou pas
fin pour
fin pour
fin pour
fin pour
Sauf qu'on se rends bien compte que potentiellement, je peux avoir pas loin d'une centaine de tests (et copies) pour un seul niveau et 100^100, ça commence à devenir critique dès le second niveau de récursivité !
Y'a moyen d'améliorer ça ?
De plus, les 10 premiers coup d'une partie sont plus ou moins machinaux. Du moins,on n'a pas besoin de réfléchir deux heures. Là, ça va être l'inverse pour le PC : au départ, avec les 32 pièces, la PC va pleurer tout ce qu'il peut pour bouger un pion. Arrivé vers la fin de la partie, il va mettre 1 ms pour élaborer un plan avec les 100 prochains coups pour te mettre mat...
Du coup, je me tâte : dois-je mixer les deux méthodes : la première tant que les coups sont connus, et pour les coups inconnus qui sont arrivés à une bonne conclusion, et quand l'AI est à cours de coups connus (ou de coups qui l'ont fait gagner), passe à la seconde méthode (ainsi, le PC n'a plus à faire de longs calculs au début du jeu)