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
| program bataille_navale;
uses crt;
const LMAX=10; //Nombre maximal de lignes dans la grille
CMAX=10; //Nombre maximal de colonnes dans la grille
TMAX=5; //Taille maximale des bateaux
NBBAT=5; //Nombre de bateaux
type t_element=0..3; //Elements de la grille
t_coord=array[1..TMAX] of integer; //Forme des coordonnées
t_mat=array[1..LMAX,1..CMAX] of t_element; //Les éléments de la grille sont des entiers de 0 à 3
{0:case vide, 1:bateau pas touché, 2:case vide tirée, 3:bateau touché}
t_bat= record //Type des bateaux
nom:string; //Stocke le nom du bateau
coule:boolean; //Stocke si le bateau est coulé ou non
taille:integer; //Stocke la taille du bateau
x,y:t_coord; //Abscisses-Ordonnées du bateau
end;
t_nav=array[1..NBBAT] of t_bat;//Tableau contenant les bateaux (Flotte)
{ Fonctions booléennes de test :
voisin(x1,y1,x2,y2): rend TRUE si la case 2 est autour de la 1
existe(x,y): rend TRUE si la case est dans la grille de jeu
coule: rent TRUE si le bateau est coulé }
procedure selectIA(var x,y:integer;var m,bdd:t_mat;var N:t_nav); //selection de la case à tirer à partir de la base de données par IA
var i,j,k,l:integer;
begin
randomize;
for i:=1 to LMAX do //On parcourt bdd
for j:=1 to CMAX do
if(bdd[i,j]<>0) //La case C de la bdd est un bateau
and not (existe(x,y)) //La case C n'a pas encore été trouvée
and not (coule(m,N,m[i,j])) then //Le bateau considéré n'est pas coulé
begin
for k:=i-1 to i+1 do //On tourne autour de C
for l:=j-1 to j+1 do
if(m[k,l]<>0) //La case autour de C n'a pas été tirée
and(existe(l,k)) //La case existe
and (voisin(j,i,l,k)) then //La case est voisine
begin
if(i-k=1)
or (i-k=-1)then //vertical
begin
repeat
if(i-k=1) then //(haut)
begin
if(random(2)=1) then y:=k-1
else y:=i+1;
end
else //(bas)
begin
if(random(2)=1) then y:=k+1
else y:=i-1;
end;
x:=l;
until (existe(x,y))
and (bdd[y,x]=0);
end
else //horizontal
begin
repeat
if(j-l=1) then //(gauche)
begin
if(random(2)=1) then x:=l-1
else x:=j+1;
end
else //(droite)
begin
if(random(2)=1) then x:=l+1
else x:=j-1;
end;
y:=k;
until (existe(x,y))
and (bdd[y,x]=0);
end;
end;
end;
end; |
Partager