Un problème avec intélligence artificielle

NGUYEN -  
toninsa Messages postés 1 Statut Membre -
Bonjour,
Je suis en train de faire un jeu MORPION 3x3 de type AI sur Delphi mais j'ai rencontré un problème. Le programme maintenent n'est pas encore intélligent comme je veux. Je croix que ma Procédure de l'élagage alpha beta ne marche pas très bien. Est-ce que vous pouvez m'aider de chercher les erreurs? Voici le code source de minmaxalphabeta.
Merci en avance!

Procedure minmaxalphabeta( jeu:morpion; depth:byte; joueur:byte;var lecoup:coup; var score,alpha,beta:integer);
var
i,MM_score: integer;
MM_board : morpion;
prof:byte;
couppos : coupjeu;
MM_move : coup;

begin
{ incrémente la profondeur de recherche }
prof:=depth;
inc(prof);
alpha:=-99;beta:=99;
{vérifier le nombre de coups possibles}
if (coups_possibles(couppos,jeu,joueur )<>0 ) then
begin
if joueur=humain then
{ execute tous les coups possibles }
for i := 1 to couppos.ncoups do
Begin
score:=alpha;
move(jeu,MM_board,sizeof(morpion));
{ appel minmax avec la reccursivité }
{ ici on est à un noeud de l'arbre }
jouer_le_coup( MM_board, couppos.coups[i] );
if (prof<>9) and (not evaluation_jeu(MM_board,ordinateur)) then
minmaxalphabeta( MM_board, prof, inversejoueur(joueur), MM_move,MM_score,score,beta)
else
if (prof=9) or (evaluation_jeu(MM_board,humain)) or (evaluation_jeu(MM_board,ordinateur)) then
MM_score:=evaluation(jeu); { ici, on est aux feuilles de l'arbre. }
if score<MM_score then
Begin
score:=MM_score;
lecoup:=couppos.coups[i];
if score>=beta then exit;
end;
end;
if joueur=ordinateur then
for i := 1 to couppos.ncoups do
Begin
score:=beta;
move( jeu, MM_board, sizeof( morpion ) );
jouer_le_coup(MM_board, couppos.coups[i] );
if (prof<>9) and (not evaluation_jeu(MM_board,humain)) then
minmaxalphabeta(MM_board, prof, inversejoueur(joueur), MM_move,MM_score,alpha,score)
else
if (prof=9) or (evaluation_jeu(MM_board,humain)) or (evaluation_jeu(MM_board,ordinateur)) then
MM_score:=evaluation(jeu);
if MM_score<score then
Begin
score:=MM_score;
lecoup:=couppos.coups[i];
end;
if score<=alpha then exit;
end;
if joueur=humain then alpha:=MM_score else if joueur=ordinateur then beta:=MM_score;
end;
end;
A voir également:

2 réponses

franky* Messages postés 167 Statut Membre 5
 
Salut,

Je ne connais pas Delphi, donc j'ai du mal à tout suivre (surtout l'appel des sous fonctions : elles sont dans le code que tu as donné ?), mais tout me semble correct...

Juste une chose : comment tu compte ton score ? (fonction evaluation) -> il ne dépasse jamais de l'intervalle -99,99 ?

Sinon, ben... Vu que le problème est simple, tu peux demander à ton programme de te retourner toutes les valeurs intermédiaires, et faire la même chose en même temps que lui : tu verras tout de suite où ça coince !

Bonne chance.

Eléctions : Bush filled his SOUl with HOpe
0
toninsa Messages postés 1 Statut Membre
 
evaluation(jeu)=1 si humain gagne et -1 si ordinateur gagne.
evaluation(jeu) à l'état quelconque = nombre de lignes/colonnes/diagonales ouvertes pour humain - nombre de lignes/colonnes/diagonales ouvertes pour ordinateur
Aussi, evaluation_jeu(jeu,joueur) retourne vrai si joueur gagne.
0