Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function TForm1.agore(x,y:integer):integer;
- var br:integer;
- begin
- br:=0;
- if y-1>=0 then
- begin
- if cShots[x,y-1]=0 then
- br:=1+agore(x,y-1)
- else br:=0;
- end
- else br:=0;
- if br>3 then
- agore:=3
- else agore:=br;
- end;
- function TForm1.adole(x,y:integer):integer;
- var br:integer;
- begin
- br:=0;
- if y+1<=9 then
- begin
- if cShots[x,y+1]=0 then
- br:=1+adole(x,y+1)
- else br:=0;
- end
- else br:=0;
- if br>3 then
- adole:=3
- else adole:=br;
- end;
- function TForm1.alevo(x,y:integer):integer;
- var br:integer;
- begin
- br:=0;
- if x-1>=0 then
- begin
- if cShots[x-1,y]=0 then
- br:=1+alevo(x-1,y)
- else br:=0;
- end
- else br:=0;
- if br>3 then
- alevo:=3
- else alevo:=br;
- end;
- function TForm1.adesno(x,y:integer):integer;
- var br:integer;
- begin
- br:=0;
- if x+1<=9 then
- begin
- if cShots[x+1,y]=0 then
- br:=1+adesno(x+1,y)
- else br:=0;
- end
- else br:=0;
- if br>3 then
- adesno:=3
- else adesno:=br;
- end;
- procedure TForm1.zameni(var a,b:integer; max:integer);
- var pom:integer;
- begin
- if b>a then
- begin
- pom:=b;
- b:=a;
- a:=pom;
- end;
- if a>max-1 then
- a:=max-1;
- if b>max-1 then
- b:=max-1;
- end;
- function TForm1.Racunaj(x,y,max:integer):integer;
- var a,b,h,v:integer;
- begin
- if cShots[x,y]=0 then
- begin
- if max=1 then
- racunaj:=1;
- if max=2 then
- begin
- a:=alevo(x,y);
- b:=adesno(x,y);
- zameni(a,b,max);
- if a=1 then
- begin
- if b=1 then
- h:=2;
- if b=0 then
- h:=1;
- end
- else h:=0;
- a:=agore(x,y);
- b:=adole(x,y);
- zameni(a,b,max);
- if a=1 then
- begin
- if b=1 then
- v:=2;
- if b=0 then
- v:=1;
- end
- else v:=0;
- racunaj:=h+v;
- end;
- if max=3 then
- begin
- a:=alevo(x,y);
- b:=adesno(x,y);
- zameni(a,b,max);
- if a=1 then
- begin
- if b=1 then
- h:=1;
- if b=0 then
- h:=0;
- end;
- if a=2 then
- begin
- if b=2 then
- h:=3;
- if b=1 then
- h:=2;
- if b=0 then
- h:=1;
- end;
- if a=0 then
- h:=0;
- a:=agore(x,y);
- b:=adole(x,y);
- zameni(a,b,max);
- if a=1 then
- begin
- if b=1 then
- v:=1;
- if b=0 then
- v:=0;
- end;
- if a=2 then
- begin
- if b=2 then
- v:=3;
- if b=1 then
- v:=2;
- if b=0 then
- v:=1;
- end;
- if a=0 then
- v:=0;
- racunaj:=h+v;
- end;
- if max=4 then
- begin
- a:=alevo(x,y);
- b:=adesno(x,y);
- zameni(a,b,max);
- if a=1 then
- h:=0;
- if a=2 then
- begin
- if b=2 then
- h:=2;
- if b=1 then
- h:=1;
- if b=0 then
- h:=0;
- end;
- if a=3 then
- begin
- if b=3 then
- h:=4;
- if b=2 then
- h:=3;
- if b=1 then
- h:=2;
- if b=0 then
- h:=1;
- end;
- if a=0 then
- h:=0;
- a:=agore(x,y);
- b:=adole(x,y);
- zameni(a,b,max);
- if a=1 then
- v:=0;
- if a=2 then
- begin
- if b=2 then
- v:=2;
- if b=1 then
- v:=1;
- if b=0 then
- v:=0;
- end;
- if a=3 then
- begin
- if b=3 then
- v:=4;
- if b=2 then
- v:=3;
- if b=1 then
- v:=2;
- if b=0 then
- v:=1;
- end;
- if a=0 then
- v:=0;
- racunaj:=h+v;
- end;
- end
- else
- racunaj:=0;
- end;
- function TForm1.Guess:integer;
- var
- a,b,i,j,max,maks,br,k,m1,m2:integer; {max je najveca dostupna duzina broda, a maks je najveci element u prob matrici}
- begin
- if cTurn.brush.color=clGreen then {a(pravac) su funkcije koje vracaju koliko polja ima u tom pravcu da racunar jos nije otvorio}
- begin
- if mode=1 then
- begin
- for i:=1 to 100 do
- maxprob[i]:=0;
- for i:=1 to 4 do
- if pships[i]<>0 then
- max:=i;
- for i:=0 to 9 do
- for j:=0 to 9 do
- begin
- prob[i,j]:=Racunaj(i,j,max);
- end;
- maks:=0;
- for i:=0 to 9 do
- for j:=0 to 9 do
- if prob[i,j]>maks then
- maks:=prob[i,j];
- br:=0;
- for i:=0 to 9 do
- for j:=0 to 9 do
- if prob[i,j]=maks then
- begin
- maxprob[br]:=i*10+j;
- br:=br+1;
- end;
- k:=random(br);
- Guess:=maxprob[k];
- end;
- if mode=2 then
- begin
- if uzast=1 then {DRUGO GADJANJE}
- begin
- a:=prethodni div 10;
- b:=prethodni mod 10;
- if (adesno(a,b)+alevo(a,b))>=(agore(a,b)+adole(a,b)) then {PROVERAVA DA LI IMA VISE NEOTVORENIH POLJA U HORIZONTALI}
- begin
- if alevo(a,b)>=adesno(a,b) then
- begin
- m1:=a-1;
- m2:=b;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a+1;
- m2:=b;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end
- else
- begin
- if agore(a,b)>=adole(a,b) then
- begin
- m1:=a;
- m2:=b-1;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a;
- m2:=b+1;
- k:=m1*10+m2;
- Guess:=k;
- end
- end;
- if uzast=2 then {TRECE GADJANJE}
- begin
- a:=prethodni div 10;
- b:=prethodni mod 10;
- if ort=0 then {HORIZONTALNO}
- begin
- if smer=-1 then
- begin
- if alevo(a,b)<>0 then
- begin
- m1:=a-1;
- m2:=b;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a+2;
- m2:=b;
- smer:=1;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end
- else
- begin
- if adesno(a,b)<>0 then
- begin
- m1:=a+1;
- m2:=b;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a-2;
- m2:=b;
- smer:=-1;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end;
- end;
- if ort=1 then {VERTIKALNO}
- begin
- if smer=-1 then
- begin
- if agore(a,b)<>0 then
- begin
- m1:=a;
- m2:=b-1;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a;
- m2:=b+1;
- smer:=1;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end
- else
- begin
- if adole(a,b)<>0 then
- begin
- m1:=a;
- m2:=b+1;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a;
- m2:=b-1;
- smer:=-1;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end;
- end;
- end;
- if uzast=3 then {CETVRTO GADJANjE}
- begin
- a:=prethodni div 10;
- b:=prethodni mod 10;
- if ort=0 then {HORIZONTALNO}
- begin
- if smer=-1 then
- begin
- if alevo(a,b)<>0 then
- begin
- m1:=a-1;
- m2:=b;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a+3;
- m2:=b;
- smer:=1;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end
- else
- begin
- if adesno(a,b)<>0 then
- begin
- m1:=a+1;
- m2:=b;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a-3;
- m2:=b;
- smer:=-1;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end;
- end;
- if ort=1 then {VERTIKALNO}
- begin
- if smer=-1 then
- begin
- if agore(a,b)<>0 then
- begin
- m1:=a;
- m2:=b-1;
- k:=m1*10+m2;
- Guess:=k;
- end
- else
- begin
- m1:=a;
- m2:=b+3;
- smer:=1;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end
- else
- begin
- m1:=a;
- m2:=b-3;
- smer:=1;
- k:=m1*10+m2;
- Guess:=k;
- end;
- end;
- end;
- end;
- end;
- end;
- end;
- procedure TForm1.cOdigraj;
- var x,y,i:integer;
- begin
- x:=guess;
- y:=x mod 10;
- x:=x div 10;
- if (pBoard[x,y]<>0) and (pBoard[x,y]<>5) then
- begin
- cShots[x,y]:=1;
- pMat[x,y].Brush.Color:=clYellow;
- if x-1>=0 then
- begin
- if y-1>=0 then
- begin
- pMat[x-1,y-1].Brush.Color:=clGray;
- cShots[x-1,y-1]:=2;
- end;
- if y+1<=9 then
- begin
- pMat[x-1,y+1].Brush.Color:=clGray;
- cShots[x-1,y+1]:=2;
- end;
- end;
- if x+1<=9 then
- begin
- if y-1>=0 then
- begin
- pMat[x+1,y-1].Brush.Color:=clGray;
- cShots[x+1,y-1]:=2;
- end;
- if y+1<=9 then
- begin
- pMat[x+1,y+1].Brush.Color:=clGray;
- cShots[x+1,y+1]:=2;
- end;
- end;
- if ispotopljen(x,y,2) then
- begin
- boji(x,y,2);
- mode:=1;
- uzast:=0;
- pShips[pBoard[x,y]]:=pShips[pBoard[x,y]]-1;
- hit:=true;
- end
- else
- begin
- uzast:=uzast+1;
- mode:=2;
- prethodni:=x*10+y;
- hit:=true;
- end;
- end
- else
- begin
- pMat[x,y].Brush.Color:=clGray;
- cShots[x,y]:=2;
- pTurn.brush.color:=clGreen;
- cTurn.brush.color:=clRed;
- end;
- end;
- procedure TForm1.pozovi;
- begin
- hit:=false;
- cOdigraj;
- If hit then
- pozovi;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement