Coucou tout le monde,
Je suis actuellement entrain de programmer un jeu à deux joueurs à somme non nulle et information compléte, il ressemble beaucoup dans la pratique au jeu de l'Attaxx sauf qu'il n'a pas de déplacement double en diagonale et les cases imprenables peuvent être variable selon les terrains et il se joue sur un damier 8*8 cases : Règles de l'Attax .
Pour la programmation d'une IA, l'algorithme min-max est parfait, j'ai donc programmé mon algorithme min-max et tout à l'air de bien fonctionner.
Ma fonction d'évaluation fait une boucle compléte sur le plateau passez en paramétre (sur la situation de jeu) et retourne la différence de score des joueurs :
-Si l'etat de la case est = à l'etat du joueur alors on increment int eval sinon si il est egal à celle de l'adversaire on décremente eval.
-Ma fonction prennais en compte uniquement le score d'une situation, par exemple sur des terrains ou les cases sont éloignés il faut avancer au maximum pour avoir une zone à conquérir .. du coup j'ai décidé d'ajouter une caractéristique position fait une matrice :
Et dans ma fonction d'évaluation j'ajoute à eval la valeur de la case dans position, ainsi si en début de partie nous sommes en bas a droite, on va plutot jouer en diagonale vers le haut qu'à gauche ou droite par exemple. Je pense que je devrais appliquer la matrice uniquement à la case jouées (imaginons qu'on est sur une case de valeurs 5 et qu'on saute sur une case de valeur 4 car le gain de points est considérable, alors on va avoir une valeur de 4 au final, alors que si on se duplique sur une case 2 on aura une valeur 7).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int[] position = { 0,0,1,2,2,1,0,0, 0,2,2,4,4,2,2,0, 1,2,4,5,5,4,2,1, 2,4,5,6,6,5,4,2, 2,4,5,6,6,5,4,2, 1,2,4,5,5,4,2,1, 0,2,2,4,4,2,2,0, 0,0,0,2,2,1,0,0, };
-Enfin pour détecter une fin de partie, je me demandais si c'était quand on avait plus de possibilité de jeu ou lorsqu'on avait plus de possibilité de toucher u adversaire, du coup dans ma boucle principale d'évaluation je vérifie si l'ont a des possibilités de jeu (test des cas dans un if avec 12 conditions en OU) et pour chaque possibilité de jeu ont ajoute 1 point à eval et (respectivement on enlèvre 1 point pour chaque possibilité de l'adversaire).
Sauf qu'au final mon IA à un niveau 4 ou 5 n'est pas transcendante dans ses coups ^^ Je pense, avant de faire un élagage alpha-beta que je devrais revoir ces 3caractéristiques et surtout leurs ratio ! Car je suppose qu'en début de parties la position est plus importante que le nombre de points alors que c'est l'inverse en fin de partie par exemple.
Je cherche des personnes ou des livres, articles qui pourront clairement m'orienter car là je suis un peu perdu et je ne sais pas si je vais dans le bon chemin!
Et ensuite, je voulais savoir si il y a des langages plus à privilégier pour implémenter un algorithme de type minmax. Et enfin si il y a une personne motivé pour m'aider dans mon projet, je suis preneur !
Partager