cs_naton
Messages postés1Date d'inscriptionvendredi 17 décembre 2004StatutMembreDernière intervention23 janvier 2005
-
23 janv. 2005 à 03:32
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 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;
cs_sim51
Messages postés240Date d'inscriptiondimanche 31 octobre 2004StatutMembreDernière intervention31 décembre 20062 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 :
cs_sim51
Messages postés240Date d'inscriptiondimanche 31 octobre 2004StatutMembreDernière intervention31 décembre 20062 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 !!!
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 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.