unit nastavenia;
interface
uses
Graphics,ExtCtrls,Classes,SysUtils;
type
TDefault=class
farba:TColor;
font:string;
policokx,policoky,min:integer;
private
tile,mina,qmark,flag,krizik,trava,kvet:TBitmap;
constructor Create;
end;
TMina=class
private
stav:byte;
zaminovane:integer; //0..8 -pocet min, 10.. -mina
zakryta:boolean;
constructor Create;
procedure Pripocitaj;
end;
THra=class
private
minovepole:array[0..49,0..39] of TMina;
maxi, maxj:integer;
public
def:TDefault;
cas:integer;
prvy:boolean;
neoznacenych:integer;
boo:boolean;
prazdnych:integer;
constructor Create(Image1:TImage);
procedure Odkry(x,y:integer;Image1:TImage);
procedure Zmen(x,y:integer;Image1:TImage);
procedure PrvyKlik(i,j:integer;tim:TTimer);
procedure NovaHra(Image1:TImage);
private
procedure NakresliMinu(x,y:integer;bmp:TBitmap;Image1:TImage);
procedure Vypis(x,y:integer;min:integer;Image1:TImage);
procedure Zaminuj(i,j:integer);
procedure UkazPole(Image1:TImage);
procedure Pripocitaj(x,y:integer);
procedure Pomocna(i,j:integer);
procedure Odkry1(x,y:integer;Image1:TImage);
end;
TIkony=class //ikony pre Form2, kvoli resourcu musia byt zadefinovane tu
ico1,ico2,ico3,ico1b,ico2b,ico3b:TBitmap;
constructor Create;
destructor Destroy;override;
end;
implementation
constructor TDefault.Create;
begin
farba:=clBtnFace;
policokx:=10;
policoky:=10;
min:=17;
tile:=TBitmap.Create;
tile.LoadFromResourceName(HInstance,'tile');
qmark:=TBitmap.Create;
qmark.LoadFromResourceName(HInstance,'otaznik');
qmark.TransparentColor:=qmark.Canvas.Pixels[0,0];
qmark.Transparent:=true;
flag:=TBitmap.Create;
flag.LoadFromResourceName(HInstance,'flag');
flag.TransparentColor:=flag.Canvas.Pixels[0,0];
flag.Transparent:=true;
mina:=TBitmap.Create;
mina.LoadFromResourceName(HInstance,'mina');
mina.TransparentColor:=mina.Canvas.Pixels[0,0];
mina.Transparent:=true;
krizik:=TBitmap.Create;
krizik.LoadFromResourceName(HInstance,'krizik');
krizik.TransparentColor:=krizik.Canvas.Pixels[0,0];
krizik.Transparent:=true;
trava:=TBitmap.Create;
trava.LoadFromResourceName(HInstance,'trava');
trava.TransparentColor:=trava.Canvas.Pixels[0,0];
trava.Transparent:=true;
kvet:=TBitmap.Create;
kvet.LoadFromResourceName(HInstance,'kvet');
kvet.TransparentColor:=kvet.Canvas.Pixels[0,0];
kvet.Transparent:=true;
font:='Typewriter';
end;
constructor THra.Create(Image1:TImage);
begin
def:=TDefault.Create;
NovaHra(Image1);
end;
procedure THra.NovaHra(Image1:TImage);
var
i,j:integer;
begin
maxi:=def.policokx-1;
maxj:=def.policoky-1;
Image1.Width:=def.policokx*20;
Image1.Height:=def.policoky*20;
Image1.Picture.Bitmap:=TBitmap.Create;
Image1.Picture.Bitmap.Width:=def.policokx*20;
Image1.Picture.Bitmap.Height:=def.policoky*20;
for i:=0 to maxi do begin
for j:=0 to maxj do begin
NakresliMinu(i,j,def.tile,Image1);
minovepole[i,j]:=TMina.Create;
end;
end;
cas:=0;
boo:=true;
neoznacenych:=def.min;
prazdnych:=def.policokx*def.policoky-def.min;
prvy:=true;
Image1.Canvas.Font.Size:=12;
Image1.Canvas.Font.Style:=[fsBold];
Image1.Canvas.Font.Color:=clNavy;
Image1.Canvas.Brush.Color:=def.farba;
end;
procedure THra.Odkry(x,y:integer;Image1:TImage);
begin
if minovepole[x,y].stav=0
then
if minovepole[x,y].zakryta
then
if minovepole[x,y].zaminovane>9
then
UkazPole(Image1)
else
Odkry1(x,y,Image1);
if prazdnych=0
then
boo:=false;
end;
procedure THra.Odkry1(x,y:integer;Image1:TImage);
begin
if (x<0)or(y<0)or(x>maxi)or(y>maxj)
then
else begin
if minovepole[x,y].zakryta
then
if minovepole[x,y].stav=0
then begin
Vypis(x,y,minovepole[x,y].zaminovane,Image1);
minovepole[x,y].zakryta:=false;
if minovepole[x,y].zaminovane=0
then begin
Odkry1(x-1,y-1,Image1);
Odkry1(x-1,y,Image1);
Odkry1(x-1,y+1,Image1);
Odkry1(x,y-1,Image1);
Odkry1(x,y+1,Image1);
Odkry1(x+1,y-1,Image1);
Odkry1(x+1,y,Image1);
Odkry1(x+1,y+1,Image1);
end;
end;
end;
end;
procedure THra.Zmen(x,y:integer;Image1:TImage);
begin
if minovepole[x,y].zakryta
then begin
minovepole[x,y].stav:=(minovepole[x,y].stav+1)mod 3;
case minovepole[x,y].stav of
0:NakresliMinu(x,y,def.tile,Image1);
1:begin
NakresliMinu(x,y,def.tile,Image1);
NakresliMinu(x,y,def.flag,Image1);
neoznacenych:=neoznacenych-1;
end;
2:begin
NakresliMinu(x,y,def.tile,Image1);
NakresliMinu(x,y,def.qmark,Image1);
neoznacenych:=neoznacenych+1;
end;
end;
end;
end;
procedure THra.NakresliMinu(x,y:integer;bmp:TBitmap;Image1:TImage);
begin
Image1.Canvas.Draw(x*20,y*20,bmp);
end;
procedure THra.Vypis(x,y:integer;min:integer;Image1:TImage);
var
pom:byte;
begin
prazdnych:=prazdnych-1;
Image1.Canvas.FillRect(Rect(x*20,y*20,x*20+20,y*20+20));
case min of
0:begin
pom:=random(4);
if pom=0
then
Image1.Canvas.Draw(x*20,y*20,def.kvet)
else
Image1.Canvas.Draw(x*20,y*20,def.trava)
end;
else
Image1.Canvas.TextOut(x*20+6,y*20,IntToStr(minovepole[x,y].zaminovane))
end;
end;
procedure THra.PrvyKlik(i,j:integer;tim:TTimer);
begin
prvy:=false;
tim.Enabled:=true;
Zaminuj(i,j);
end;
procedure THra.Zaminuj(i,j:integer);
var
x,y,pom:integer;
begin
pom:=def.min;
while pom>0 do begin
x:=random(def.policokx);
y:=random(def.policoky);
while (minovepole[x,y].zaminovane>9)or((x=i)and(y=j)) do begin
x:=(x+1)mod def.policokx;
if x=0
then
y:=(y+1) mod def.policoky;
end;
minovepole[x,y].zaminovane:=10;
Pripocitaj(x,y);
pom:=pom-1;
end;
end;
procedure THra.UkazPole(Image1:TImage);
var
i,j:integer;
begin
boo:=false;
for i:=0 to maxi do
for j:=0 to maxj do begin
if (minovepole[i,j].zaminovane>9)and(minovepole[i,j].stav<>1)
then begin
Image1.Canvas.FillRect(Rect(i*20,j*20,i*20+20,j*20+20));
NakresliMinu(i,j,def.mina,Image1);
end
else
if (minovepole[i,j].zaminovane<9)and(minovepole[i,j].stav=1)
then begin
Image1.Canvas.FillRect(Rect(i*20,j*20,i*20+20,j*20+20));
NakresliMinu(i,j,def.krizik,Image1);
end;
end;
end;
procedure THra.Pomocna(i,j:integer);
begin
if (i<0)or(j<0)or(i>maxi)or(j>maxj)
then
else begin
minovepole[i,j].Pripocitaj;
end;
end;
procedure THra.Pripocitaj(x,y:integer);
begin
pomocna(x-1,y-1);
pomocna(x-1,y);
pomocna(x-1,y+1);
pomocna(x,y-1);
pomocna(x,y+1);
pomocna(x+1,y-1);
pomocna(x+1,y);
pomocna(x+1,y+1);
end;
constructor TMina.Create;
begin
zaminovane:=0;
zakryta:=true;
stav:=0;
end;
procedure TMina.Pripocitaj;
begin
zaminovane:=zaminovane+1;
end;
constructor TIkony.Create;
begin
ico1:=TBitmap.Create;
ico1.LoadFromResourceName(HInstance,'ico1');
ico2:=TBitmap.Create;
ico2.LoadFromResourceName(HInstance,'ico2');
ico3:=TBitmap.Create;
ico3.LoadFromResourceName(HInstance,'ico3');
ico1b:=TBitmap.Create;
ico1b.LoadFromResourceName(HInstance,'ico1b');
ico2b:=TBitmap.Create;
ico2b.LoadFromResourceName(HInstance,'ico2b');
ico3b:=TBitmap.Create;
ico3b.LoadFromResourceName(HInstance,'ico3b');
end;
destructor TIkony.Destroy;
begin
ico1.Free;
ico2.Free;
ico3.Free;
ico1b.Free;
ico2b.Free;
ico3b.Free;
inherited;
end;
end.
|