Скачиваний:
71
Добавлен:
01.05.2014
Размер:
14.36 Кб
Скачать
unit Saper;


interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus,Saper2,Saper3, ExtCtrls, Buttons, ImgList;

type

TForm1 = class(TForm)
MainMenu1: TMainMenu;
Game: TMenuItem; // игра
New_Game: TMenuItem; // новая игра
Beginner: TMenuItem; // новичок
Fan: TMenuItem; // любитель
Professional: TMenuItem; // профессионал
Authors: TMenuItem; // авторы
Exit: TMenuItem; // выход
About: TMenuItem; // о программе
Special: TMenuItem; // особые
SpeedButton1: TSpeedButton;//кнопка с солнышком
Panel1: TPanel; // индикатор мин
Image1: TImage; // третий разряд индикатора
Image2: TImage; // второй разряд индикатора
Image3: TImage; // первый разряд индикатора
Panel2: TPanel; // главная панель кнопок
Panel3: TPanel; // объединяющая панель
Panel4: TPanel; // таймер времени
Image4: TImage; // третий разряд таймера
Image5: TImage; // второй разряд таймера
Image6: TImage; // первый разряд таймера
Timer1: TTimer; // таймер
procedure SpecialClick(Sender: TObject);
procedure ExitClick(Sender: TObject);
procedure New_GameClick(Sender: TObject);
procedure StartGame; //начать игру
procedure MakeButtons; //создание поля
procedure FormCreate(Sender: TObject);
procedure DeleteAll; // целое число в картинку
procedure SpeedButton1Click(Sender: TObject); //солнышко
procedure InitPic; // инициализация картинок
procedure IntToPic(num:integer;im1,im2,im3:TImage);
//преобразует число в электронное число(картинку)
procedure Timer1Timer(Sender:TObject); //событие таймера
procedure Time; //таймер
procedure DoSize; //установка размеров формы и др.
procedure AuthorsClick(Sender: TObject);
procedure NewGame(SizeX,SizeY,NumMines:integer);//новая игра
procedure BeginnerClick(Sender: TObject);
procedure FanClick(Sender: TObject);
procedure ProfessionalClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

{доработанная кнопка}
MySpeedButton = class (TSpeedButton)
public
x,y:integer; //положение кнопки на игровом поле
clicked:boolean; //нажата или нет
is_mine:boolean; //находится ли в ней мина
is_flage:boolean; //поставлен ли на ней флаг
procedure Open; //открытие клетки(рекурсивная)
property OnMouseDown;
procedure MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; XX, YY: Integer);//нажатие кнопки
property OnMouseUp;
procedure MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; XX, YY: Integer);//отпустить кнопку
end;
{класс картинок под кнопками}
Myimage =class(TImage)
public
x,y:integer;
property OnMouseDown;
procedure MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; XX, YY: Integer);
//используется, если в клетку поставлен флаг
end;


var
Form1: TForm1;
{игровое поле}
FieldWidth:integer = 9; //ширина поля
FieldHeight:integer = 9; //высота поля
Mines:integer=10; //количество мин
Field:array[0..30,0..24] of MySpeedButton; //поле кнопок
Status:integer; //статус игры:
// 1-не начата,
// 2-начата
// 3-окончена
Opened:integer; //количество открытых клеток
Image:array[0..30,0..24] of MyImage; //поле картинок под кнопками
pic:array[0..13]of TBitmap; //массив мин
sun:array[0..3]of TBitmap; //массив солнышек
Clock:array[0..9]of TBitmap; //массив электронных чисел
getMines:integer; //мины для флажков
i:integer=0; //для счетчика времени
win:boolean; //выиграна игра или нет


implementation


{$R *.dfm}


procedure TForm1.SpecialClick(Sender: TObject);
begin
Form2.ShowModal;
end;

procedure TForm1.ExitClick(Sender: TObject);
begin
Form1.Close;
end;

procedure MySpeedButton.open;
var
c:integer;
i,j:integer;
dx,dy: integer;
begin

//выходим, если кнопка нажата
if (Status=3) or field[x,y].clicked or Field[x,y].is_flage then Exit;
//открываем клетку...
Field[x,y].Visible:=false;
Field[x,y].clicked:=true;

//если в клетке мина...
if Field[x,y].is_mine then
begin
Status:=3;
Form1.SpeedButton1.Glyph:=sun[2];

//рисуем неоткрытые мины
for i:=0 to FieldWidth-1 do
for j:=0 to FieldHeight-1 do
if not Field[i,j].clicked //and Field[i,j].is_mine and not Field[i,j].is_flage
then
begin
//если есть мина, но нет флажка, то рисуем мину
if Field[i,j].is_mine and not Field[i,j].is_flage then
begin
Field[i,j].Visible:=false;
Image[i,j].Canvas.Draw(0,0,pic[10]);
Field[i,j].clicked:=true;
end

else //если есть флажок, но нет мины
if not Field[i,j].is_mine and Field[i,j].is_flage then
begin
Field[i,j].Visible:=false;
Image[i,j].Canvas.Draw(0,0,pic[13]);
end else
if not Field[i,j].is_mine and not Field[i,j].is_flage then
Field[i,j].Enabled:=false;
end;
Image[x,y].Canvas.Draw(0,0,pic[9]);
end

//если в кнопке нет мины
else

//подсчитываем количество мин в соседних клетках
begin
Status:=2;
c:=0;
for dx:=-1 to 1 do
for dy:=-1 to 1 do
if not ((dx=0)and(dy=0)) then
begin
i:=x+dx;
j:=y+dy;
{}
if (i>=0) and(j>=0) and (i<FieldWidth)and(j<FieldHeight) then
c:=c+Integer(Field[i,j].is_mine);
end;
Image[x,y].Canvas.Draw(0,0,pic[c]);

//если клетка пустая
if (c=0) then
//открываем "внутренние клетки"
if (y>0) and (x>0) and (y<FieldHeight-1) and (x<FieldWidth-1) then
begin
Field[x,y-1].Open ;
Field[x-1,y].Open ;
Field[x,y+1].Open ;
Field[x+1,y].Open ;
Field[x-1,y-1].Open ;
Field[x+1,y-1].Open ;
Field[x-1,y+1].Open ;
Field[x+1,y+1].Open ;
end

else {для угловых точек}
{левый верх}
if (y=0) and (x=0) then
begin
Field[x,y+1].Open ;
Field[x+1,y].Open ;
Field[x+1,y+1].Open;
end
else
{левый низ}
if (x=0) and (y=FieldHeight-1) then
begin
Field[x+1,y].Open ;
Field[x,y-1].Open ;
Field[x+1,y-1].Open ;
end
else
{правый верх}
if (y=0) and (x=FieldWidth-1) then
begin
Field[x,y+1].Open ;
Field[x-1,y].Open ;
Field[x-1,y+1].Open ;
end
else
{правый низ}
if (x=FieldWidth-1) and (y=FieldHeight-1) then
begin
Field[x-1,y].Open ;
Field[x,y-1].Open ;
Field[x-1,y-1].Open ;
end
else
{для границ}
{для верхней границы}
if (y=0) then
begin
Field[x-1,y].Open ;
Field[x+1,y].Open ;
Field[x-1,y+1].Open ;
Field[x,y+1].Open ;
Field[x+1,y+1].Open ;
end
else
{для нижней границы}
if (y=FieldHeight-1) then
begin
Field[x,y-1].Open ;
Field[x+1,y-1].Open ;
Field[x-1,y-1].Open ;
Field[x+1,y].Open ;
Field[x-1,y].Open ;
end
else
{для левой границы}
if (x=0) then
begin
Field[x,y-1].Open ;
Field[x,y+1].Open ;
Field[x+1,y+1].Open ;
Field[x+1,y-1].Open ;
Field[x+1,y].Open ;
end
else
{для правой границы}
if (x=FieldWidth-1) then
begin
Field[x-1,y-1].Open ;
Field[x-1,y+1].Open ;
Field[x-1,y].Open ;
Field[x,y+1].Open ;
Field[x,y-1].Open ;
end;
Opened:=opened+1;

//признак победы
if Opened+Mines=FieldWidth*FieldHeight then
begin
Status:=3;
win:=true;
Form1.SpeedButton1.Glyph:=sun[3];

//на не открытых клетках, где находятся мины, рисуем флажки
for i:=0 to FieldWidth-1 do
for j:=0 to FieldHeight-1 do
if Field[i,j].clicked =false then
begin
Field[i,j].Visible:=false;
Image[i,j].Canvas.Draw(0,0,pic[12]);
end;

Form1.IntToPic(0,Form1.Image1,Form1.Image2,Form1.Image3);
end;
end;
end;


procedure TForm1.StartGame; {начало игры}
var i,j,k:integer;
begin
Form1.IntToPic(Mines,Form1.Image1,Form1.Image2,Form1.Image3);
Form1.IntToPic(0,Form1.Image4,Form1.Image5,Form1.Image6);
Opened:=0;
Status:=1;
getMines:=Mines;

for i:=0 to FieldWidth-1 do
for j:=0 to FieldHeight-1 do

Field[i,j].clicked:=false;

//begin
{расставим мины}
Randomize();//генератор ГСЧ
k:=0;
repeat
i:=Random(FieldWidth);
j:=Random(FieldHeight);
if not Field[i,j].is_mine then
begin
Field[i,j].is_mine:=true;{размещаем мину}
k:=k+1;
end
until (k=Mines);
Form1.DoSize;
end;

procedure TForm1.NewGame(SizeX,SizeY,NumMines:integer);
begin
DeleteAll;
FieldWidth:=SizeX;
Fieldheight:=SizeY;
Mines:=NumMines;
Form1.DoSize;
Randomize;
MakeButtons;
StartGame;
i:=0;
Form1.DoSize;
Form1.SpeedButton1.Glyph:=sun[0];
end;

procedure TForm1.New_GameClick(Sender: TObject);{начать игру}
begin
Form1.NewGame(FieldWidth,Fieldheight,Mines);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
InitPic;
MakeButtons;
StartGame;
Form1.SpeedButton1.Parent:=Form1.Panel3;
Form1.Panel1.Parent:=Form1.Panel3;
Form1.Panel4.Parent:=Form1.Panel3;
Form1.DoSize;
end;

procedure TForm1.MakeButtons;
var i,j:integer;
begin

for i:=0 to FieldWidth-1 do
for j:=0 to FieldHeight-1 do
begin

Image[i,j]:=MyImage.Create(nil);
with Image[i,j] do
begin
OnMouseDown:=MouseDown;
if i=0 then Left:=2 else
Left:=i*16+2;
if j=0 then Top:=2 else
Top:=j*16+2;
Width:=16;
Height:=16;
Parent:=Form1.Panel2;
x:=i;
y:=j;
end;

Field[i,j]:=MySpeedButton.Create(nil);
with Field[i,j] do
begin
OnMouseDown:=MouseDown;
OnMouseUp:=MouseUp;
if i=0 then Left:=2 else
Left:=i*16+2;
if j=0 then Top:=2 else
Top:=j*16+2;
Width:=16;
Height:=16;
Parent:=Form1.Panel2;
x:=i;
y:=j;
end;
end;


end;




procedure TForm1.DeleteAll;
var i,j:integer;
begin
for i:=0 to FieldWidth-1 do
for j:=0 to FieldHeight-1 do
begin
Image[i,j].Destroy;
Field[i,j].Destroy;
end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Form1.NewGame(FieldWidth,FieldHeight,Mines);
end;

procedure MySpeedButton.MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; XX, YY: Integer);
begin
Form1.SpeedButton1.Glyph:=sun[1];
if (Button=mbLeft) and (Status<>3) and not
(Field[x,y].is_flage) and
(Field[x,y].Visible=true)
then
begin
Field[x,y].Open;
end
else
//поставить флажок
if (Button=mbRight) and (Status<>3) and not (Field[x,y].is_flage)then
begin
getMines:= getMines-1;
Form1.IntToPic(getMines,Form1.Image1,Form1.Image2,Form1.Image3);
Field[x,y].is_flage:=true;
Field[x,y].Visible:=false;
Image[x,y].Canvas.Draw(0,0,pic[12]);
end ;

end;

procedure MySpeedButton.MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; XX, YY: Integer);

begin
if Status<>3 then
if not (Field[x,y].is_mine) then Form1.SpeedButton1.Glyph:=sun[0] else
Form1.SpeedButton1.Glyph:=sun[2];
end;


procedure MyImage.MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; XX, YY: Integer);
begin
if (Field[x,y].is_flage=true) and (Button=mbRight) then
begin
(Sender as MyImage).Canvas.Draw(0,0,pic[0]);
Field[x,y].Visible:=true;
Field[x,y].is_flage:=false;
getMines:= getMines+1;
Form1.IntToPic(getMines,Form1.Image1,Form1.Image2,Form1.Image3);
end;
end;

procedure TForm1.InitPic;
var i:integer;
begin
for i:=0 to 8 do
begin
pic[i]:=TBitmap.Create;
pic[i].LoadFromFile('Mines\'+inttostr(i)+'.bmp');
end;
pic[9]:=TBitmap.Create;
pic[10]:=TBitmap.Create;
pic[11]:=TBitmap.Create;
pic[12]:=TBitmap.Create;
pic[13]:=TBitmap.Create;
pic[9].LoadFromFile('Mines\km.bmp');
pic[10].LoadFromFile('Mines\sm.bmp');
pic[11].LoadFromFile('Mines\flag.bmp');
pic[12].LoadFromFile('Mines\flag1.bmp');
pic[13].LoadFromFile('Mines\notMine.bmp');

for i:=0 to 3 do
sun[i]:=TBitmap.Create;
sun[0].LoadFromFile('Mines\sungood.bmp');
sun[1].LoadFromFile('Mines\sun.bmp');
sun[2].LoadFromFile('Mines\sunbad.bmp');
sun[3].LoadFromFile('Mines\sunover.bmp');
Form1.SpeedButton1.Glyph:=sun[0];


for i:=0 to 9 do
begin
Clock[i]:=TBitmap.Create;
Clock[i].LoadFromFile('Numbers\'+inttostr(i)+'.bmp');
end;
end;

procedure TForm1.IntToPic(num:integer;im1,im2,im3:TImage);

begin
if num<10 then //число 0..9
begin
Im1.Canvas.Draw(0,0,Clock[0]);
Im2.Canvas.Draw(0,0,Clock[0]);
Im3.Canvas.Draw(0,0,Clock[num]);
end;

if (num>9) and (num<100) then //числа 10..99
begin
Im1.Canvas.Draw(0,0,Clock[0]);
Im2.Canvas.Draw(0,0,Clock[num div 10]);
Im3.Canvas.Draw(0,0,Clock[num mod 10]);
end;

if (num>99) then//числа 100..667
begin
Im1.Canvas.Draw(0,0,Clock[num div 100]);
Im2.Canvas.Draw(0,0,Clock[(num-100*(num div 100))div 10]);
Im3.Canvas.Draw(0,0,Clock[(num-100*(num div 100)) mod 10]);
end

end;

procedure TForm1.Timer1Timer(sender:TObject);
begin
if Status=2 then
Form1.Time;
end;

procedure TForm1.Time;
begin
i:=i+1;
if i<1000 then
Form1.IntToPic(i,Form1.Image4,Form1.Image5,Form1.Image6);
end;

procedure TForm1.DoSize;

begin
//размеры формы
Form1.Width:=16*(FieldWidth+1)+8;
Form1.Height:=16*(FieldHeight+1)+102;
//главная панель
Form1.Panel3.Left:=8;
Form1.Panel3.Top:=8;
Form1.Panel3.Width:=16*(FieldWidth-1)+20;
Form1.Panel2.Height:= 16*(FieldHeight-1)+20;
//панель кнопок
Form1.Panel2.Left:=8;
Form1.Panel2.Top:=55;
Form1.Panel2.Width:=16*(FieldWidth-1)+20;
Form1.Panel2.Height:=16*(FieldHeight-1)+20;
//счетчик мин
Form1.Panel1.Left:=8;
Form1.Panel1.Top:=8;
//таймер
Form1.Panel4.Left:= Form1.Panel3.Width-8-Form1.Panel4.Width;
Form1.Panel4.Top:=8;
//кнопка с солнышком
Form1.SpeedButton1.Left:=(Form1.Panel3.Width-Form1.SpeedButton1.Width )div 2+1;
Form1.SpeedButton1.Top:=8;
end;


procedure TForm1.AuthorsClick(Sender: TObject);//авторы
begin
Form3.ShowModal;
end;

procedure TForm1.BeginnerClick(Sender: TObject); //новичок
begin
Form1.NewGame(9,9,10);
end;

procedure TForm1.FanClick(Sender: TObject); //любитель
begin
Form1.NewGame(16,16,40);
end;

procedure TForm1.ProfessionalClick(Sender: TObject); //профессионал
begin
Form1.NewGame(30,16,99);
end;

end.
Соседние файлы в папке Курсовая по ООП1
  • #
    01.05.2014342 б71MY_saper.dpr
  • #
    01.05.2014876 б71MY_saper.res
  • #
    01.05.201495 б109README!!!!!!.txt
  • #
    01.05.201419.02 Кб72Saper.dcu
  • #
    01.05.2014357.52 Кб70Saper.dfm
  • #
    01.05.201414.36 Кб71Saper.pas
  • #
    01.05.20145.44 Кб70Saper2.dcu
  • #
    01.05.20144.06 Кб71Saper2.dfm
  • #
    01.05.20141.94 Кб71Saper2.pas
  • #
    01.05.20143.75 Кб70Saper3.dcu
  • #
    01.05.20143.47 Кб70Saper3.dfm