Probleme avec intelligence aritificielle

cs_naton Messages postés 1 Date d'inscription vendredi 17 décembre 2004 Statut Membre Dernière intervention 23 janvier 2005 - 23 janv. 2005 à 03:32
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 23 janv. 2005 à 23:05
Bonjour à tous,

Maintenent, je suis en train de faire un jeu de type AI sur Delphi, c'est le Morpion. J'ai l'intention de faire ce jeu avec une dimension plus grande possible. Mais, j'ai rencontré tout d'abord avec le type 3x3. Mon programme a pu jouer mais il n'est pas très intélligent comme je veux. En fait, j'ai utilisé l'algorithme élagage alpha beta pour l'écrire. Surtout, je crois que la fonction minmaxalphabeta ne marche pas trop bien mais je ne peux pas trouver les erreurs. Est-ce que vous pouvez m'aider de les trouver?

Voici les codes sources de mon unité MinmaxAlphaBeta:

N.B: La fonction evaluation permet de calculer le note du jeu à l'état quelconque. Elle est égale à 1 si humain gagne, -1 si ordinatuer gagne et 0 si match nul.
Encore, la fonction evaluation_jeu(jeu,joueur) retourne la valeur Vraie si le joueur gagne ce jeu.

Procedure jouer_le_coup(lecoup:coup;var jeu:morpion);
Function coups_possibles(var couppos:coupjeu;jeu:morpion;joueur:byte):byte;
Function inversejoueur(joueur:byte):byte;
Function minmaxalphabeta( jeu:morpion; depth:byte; joueur:byte;
{ valeurs retournées }
var lecoup:coup; var count,alpha,beta:integer):integer;
Function max(x,y:integer):integer;
Function min(x,y:integer):integer;

implementation

Function max(x,y:integer):integer;
Var t:integer;
Begin
t:=x;
if t>=y then t:=x else if t<=y then t:=y;
max:=t;
End;

Function min(x,y:integer):integer;
Var t:integer;
Begin
t:=x;
if t<=y then t:=x else if t>=y then t:=y;
min:=t;
end;

Procedure jouer_le_coup(lecoup:coup; var jeu:morpion);
Begin
jeu[lecoup.x,lecoup.y]:=lecoup.coul;
End;
{chercher le nombre de coups possibles pour un joueur}
Function coups_possibles(var couppos:coupjeu;jeu:morpion;joueur:byte):byte;
Var i,j:byte;
Begin
couppos.ncoups:=0;
For i:=1 to 3 do
For j:=1 to 3 do
if (jeu[i,j]=vide) then
begin
inc(couppos.ncoups);
couppos.coups[couppos.ncoups].x:=i;
couppos.coups[couppos.ncoups].y:=j;
couppos.coups[couppos.ncoups].coul:=joueur;
end;
coups_possibles:=couppos.ncoups;
End;

Function minmaxalphabeta( jeu:morpion; depth:byte; joueur:byte;
var lecoup:coup; var count,alpha,beta:integer):integer;
var
nouveau_note,ancien_note,n,m: integer;
MM_board : morpion;
couppos : coupjeu;
MM_move : coup;


begin
alpha:=-99;beta:=99;
inc(count);m:=1;n:=1;
if (depth=9) or (evaluation_jeu(jeu,joueur)) then minmax:=evaluation(jeu)
else
Begin
if (coups_possibles(couppos,jeu,joueur)<>0) then
Begin
if joueur=humain then
begin
nouveau_note:=alpha;
while (n<=couppos.ncoups) and (nouveau_notealpha) do
Begin
move(jeu,MM_board,sizeof(morpion));
jouer_le_coup(couppos.coups[m],MM_board);
ancien_note:=nouveau_note;
nouveau_note:=min(nouveau_note,minmax(MM_board,depth+1,inversejoueur(joueur),MM_move,count,alpha,nouveau_note));
if beta>nouveau_note then
Begin
if ancien_note>=nouveau_note then
Begin
lecoup:=couppos.coups[m];
beta:=nouveau_note;
end;
end;
inc(m);
end;
end;
if joueur=humain then minmax:=alpha else if joueur=ordinateur then minmax:=beta;
end;
end;
end;

Function inversejoueur(joueur:byte):byte;
Var tg:byte;
Begin tg:=0;
if joueur=humain then tg:=ordinateur
else if joueur=ordinateur then tg:=humain;
inversejoueur:=tg;
end;

Merci d'avance, mes saluations ditinguées.

4 réponses

cs_sim51 Messages postés 240 Date d'inscription dimanche 31 octobre 2004 Statut Membre Dernière intervention 31 décembre 2006 2
23 janv. 2005 à 12:42
Au lieu de nous donner ton code dans lequel on est obligé de chercher à
quoi corresponde les variables, dit nous plutot comment fonctionne ton
algorithme.

En effet déjà je ne vois la création d'un arbre de jeu, donc ton prog
ne fait d'anticipation et c'est pour cela qu'il n'est pas très
intelligent.

De plus pour les petites surfaces de jeu, tu peux créer l'arbre de jeu
en entier, et donc l'ordinateur devrait gagner à tout les coûts.

En site ta fonction évaluation ne prend comme valeur 0,-1 et 1, donc je
ne vois pas comment tu fais la différence entre 2 coups jouables.

Sinon je t'ai trouvé un lien sur la création de l'arbre de jeu avec l'algorithme minmax :

http://members.fortunecity.com/k42/exposeia/html/minmax.htm

Voilà, bon courage et bonne prog

N'oubliez pas de cliquer sur réponse acceptée si la réponse vous convient !!!
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
23 janv. 2005 à 17:00
HS : en 1998 j'ai fait un morpion avec IA sur une calculatrice casio, je ne l'ai jamais battu :(
0
cs_sim51 Messages postés 240 Date d'inscription dimanche 31 octobre 2004 Statut Membre Dernière intervention 31 décembre 2006 2
23 janv. 2005 à 19:19
Merci JulioDelphi pour ce superbe message, mais je crois pas que cela vabeaucoup l'aider
Tu
pourrais au moins dire comment fonctionnais ton Ai ( création de
l'arbre de jeu, ou évaluation des mouvements par rapport à la grille du
jeu )

N'oubliez pas de cliquer sur réponse acceptée si la réponse vous convient !!!
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
23 janv. 2005 à 23:05
c'est bien pour ça que j'ai mis "HS" (Hors Sujet)


euh je vais tenter de me souvenir, j'ai fait mon IA maison :


quand c'est le tour de l'ordi, il verifie si parmis les 8 possibilités
de gagner (3 lignes H, 3 lignes V, 2 Diagonales) il peut gagner, sinon,
il verifie ensuite si moi je peux gagner au prochain tour, si il peux,
il me bloque, si aucun des deux, il regarde là ou il a deja joué et
continue une de ses suites.

pas compris ? voici un screen d'un ordinogramme :

http://diabloporc.free.fr/delphi/demos/ordino_morpion.jpg

en esperant que ça aide =) a toi de coder !
0
Rejoignez-nous