1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| type
type
tdirection=record
offsetX:integer;
offsetY:integer;
end;
ttab=array[0..9] of array[0..9] of byte;
tcase=record
ligne:byte;
colonne:byte;
end;
tcoup=record
nb_cases:integer;
cases:array[0..100] of tcase;
prises:integer;
tableauApres:ttab;
end;
tcoups=record
nb_coups:integer;
coups:array[0..100] of tcoup;
end;
const
directions:array [0..7] of tdirection=(
(offsetX:-1;offsetY:-1),
(offsetX:-1;offsetY:1),
(offsetX:1;offsetY:-1),
(offsetX:1;offsetY:1));
var
tableau:ttab;
//joueur vaut 1 (noir) ou 2 (blanc), case vide vaut 0, dame noire : 3, dame blanche : 4
function concateneCoups(a,b:tcoup;tableau:ttab):tcoup;
var i:integer;
begin
result.nb_cases:=a.nb_cases+b.nb_cases;
for i:=0 to a.nb_cases-1 do
result.cases[i]:=a.cases[i];
for i:=0 to b.nb_cases-1 do
result.cases[i+a.nb_cases]:=b.cases[i];
result.tableau:=tableau;
result.prises:=a.prises+b.prises;
end;
function buildCoupAtomique(ligne:byte;colonne:byte;tableau:ttab;prises:integer=0):tcoup;
var tempcase:tcase;
begin
tempcase.ligne:=ligne;
tempcase.colonne:=colonne;
result.nb_cases:=1;
result.cases[0]:=tempcase;
result.tableauApres:=tableau;
result.prises:=prises;
end;
function prises(tableau:ttab;case_:tcase;joueur:integer):tcoups;//donne toutes les prises possibles
var coup:tcoup;
begin
result.coups.nb_coups:=1;
coup:=buildCoupAtomique(case_.ligne,case_.colonne,tableau);
result.coups[0]:=coup;
prisesAux(tableau,coup,result,joueur);
end;
function prisesAux(tableau:ttab;coup : tcoup; var coupsTotaux : tcoups;joueur:integer):ttab;//fonctiona auxiliaire
var i,j,offsetX,offsetY,ligne,colonne:integer;
case,tempcase:tcase;
tempcoup:tcoup;
temptab:ttab;
begin
case:=coup.cases[coup.nb_coups-1];
ligne:=case.ligne;
colonne:=case.colonne;
if tableau[case.ligne,case.colonne]<>joueur then
exit;
//recherche des prises possibles
if joueur < 3 then//pion
begin
for i:=0 to 3 do
begin
temptab:=tableau;
offsetX:=directions[i].offsetX;
offsetY:=directions[i].offsetY;
//vérifie si sort du tableau
if (ligne+2*offsetY<0) or (ligne+2*offsetY>9) or (colonne+2*offsetX<0) or (colonne+2*offsetX>9) then
continue;
if tableau[ligne+offsetY,colonne+offsetX]=3-joueur and tableau[ligne+2*offsetY,colonne+2*offsetX]=0 then
//ya prise
begin
temptab[ligne+offsetY,colonne+offsetX]:=0;
temptab[ligne+2*offsetY,colonne+2*offsetX]:=joueur;
tempcoup:=concateneCoups(coup,buildCoupAtomique(ligne+2*offsetY,colonne+2*offsetX,temptab,1),temptab);
//aboutement à coupsTotaux
coupsTotaux.nb_coups:=coupsTotaux.nb_coups+1;
coupsTotaux.coups[coupsTotaux.nb_coups-1]:=tempcoup;
//appel récursif
prisesAux(temptab,tempcoup,coupsTotaux,joueur);
end;
end;
end
else//dame
begin
for i:=0 to 3 do
begin
temptab:=tableau;
offsetX:=directions[i].offsetX;
offsetY:=directions[i].offsetY;
for j:=2 to 9 do//déplacement de la dame
begin
//vérifie si sort du tableau
if (ligne+j*offsetY<0) or (ligne+j*offsetY>9) then
continue;
for k:=1 to j-1 do//emplacement du pion adverse
begin
if tableau[ligne+k*offsetY,colonne+k*offsetX]=3-joueur and tableau[ligne+j*offsetY,colonne+j*offsetX]=0 then
//ya prise
begin
temptab[ligne+k*offsetY,colonne+k*offsetX]:=0;
temptab[ligne+j*offsetY,colonne+j*offsetX]:=joueur;
tempcoup:=concateneCoups(coup,buildCoupAtomique(ligne+j*offsetY,colonne+j*offsetX,temptab,1),temptab);
//aboutement à coupsTotaux
coupsTotaux.nb_coups:=coupsTotaux.nb_coups+1;
coupsTotaux.coups[coupsTotaux.nb_coups-1]:=tempcoup;
//appel récursif
prisesAux(temptab,tempcoup,coupsTotaux,joueur);
end;
end;
end;
end;
end;
end; |
Partager