Minesweeper -source

[sources.zip] -Minesweeper.dpr, _main.pas (Form1),
nastavenia.pas (hra), unit1.pas (Form2) +dfm, rc, res, bitmapy

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.
[spä¯]