[LUA] Problème avec l'IA
Posté le 17/10/2010 17:35
Yo!
J'ai un petit problème dans l’algorithme alpha beta pour l'IA de 4-power: je ne comprends pas trop comment il fonctionne, et comment bien utiliser eval_local. L'algo alpha-beta utilise un programme d'évaluation du tableau (qui lui est incomplet, voyez plus bas), retournant un "score" en fonction des placement faits.
Puis l'algo trie les possibilités en fonction du score à chaque hypothèse de placement, puis en fonction du meilleur score, place le pion.
Avec veb, on a décidé de le prendre, car cet
algo est très puissant.
Le problème étant que je ne comprends pas l'algorithme, et que j'ai plusieurs problèmes:
- eval_local (fonction d'évaluation) étant incomplet (je dois enlever des points quand un pion coupe une série, comme XXOX))
- Le jeu d'arrête car à chaque tentative de calcul, le programme se cale sur l'errur liberr(1), c'est à dire quand la case demandée ne correspond pas au joueur...
Notre alphabeta est une fonction récursive, elle modife le résultat précédent afin d'accélérer le calcul, résultat: calul quasi-intantané...
L'algo en question:
-eval_local, détermination du score du joueur
function eval_local(x,y,joueur, adv,scorej,scoreadv)
if mata[y][x]~=joueur then lib.error(1) end
-- detection des points ajoutés à joueur
local alimax= {1,1,1,1}
local arret = {false,false,false,false}
local x1,y1,nbaligne
-- diagonale 1
x1=x+3; y1 = y+3 ; x1min= x-3
while (x1>7 or y1 > 6) do x1=x1-1 ;y1=y1-1 end
while (x1>=4 and y1 >= 4 and x1>=x1min ) do
nbaligne = 0
for i=0,3,1 do
if mata[y1-i][x1-i] == adv then nbaligne = 0 ;arret[1]=true;break end
if mata[y1-i][x1-i] == joueur then nbaligne = nbaligne +1 end
end
if alimax[1] < nbaligne then alimax[1]= nbaligne end
x1=x1-1; y1=y1-1
end
-- diagonale 2
x1=x+3; y1 = y-3 ; x1min= x-3
while (x1>7 or y1 < 1) do x1=x1-1 ;y1=y1+1 end
while (x1>=4 and y1 <= 3 and x1>=x1min ) do
nbaligne = 0
for i=0,3,1 do
if mata[y1+i][x1-i] == adv then nbaligne = 0 ;arret[2]=true;break end
if mata[y1+i][x1-i] == joueur then nbaligne = nbaligne +1 end
end
if alimax[2] < nbaligne then alimax[2]= nbaligne end
x1=x1-1; y1=y1+1
end
-- horizontal
x1=x+3; x1min= x-3
while (x1>7) do x1=x1-1 end
while (x1>=4 and x1>=x1min ) do
nbaligne = 0
for i=0,3,1 do
if mata[y][x1-i] == adv then nbaligne = 0 ;arret[3]=true;break end
if mata[y][x1-i] == joueur then nbaligne = nbaligne +1 end
end
if alimax[3] < nbaligne then alimax[3]= nbaligne end
x1=x1-1
end
-- vertical
y1 = y-3 ; y1max= y+3
while (y1 < 1) do y1=y1+1 end
while (y1 <= 3 and y1<=y1max ) do
nbaligne = 0
for i=0,3,1 do
if mata[y1+i][x] == adv then nbaligne = 0 ;arret[4]=true;break end
if mata[y1+i][x] == joueur then nbaligne = nbaligne +1 end
end
if alimax[4] < nbaligne then alimax[4]= nbaligne end
y1=y1+1
end
for i=1,4,1 do
nbaligne= alimax[i ] --espace volontaire, car il est considéré comme balise...
if nbaligne ==4 then scorej=scorej+100000
elseif nbaligne ==3 then scorej=scorej+100
elseif nbaligne ==2 then scorej=scorej+10 end
end
-- detection des points perdu à adv
if arret[3] -- coupe serie horizontale
then -- doit tester s'il coupe ou non une serie
end
return scorej --, scoreadv
end
Merci de votre compréhension.
Fichier joint