Новичок
Джуниор
Регистрация: 10.10.2018
Сообщений: 1
|
Помогите написать комментари
Здравствуйте добрые люди. Поможете написать комментарий, там чуть чуть есть но надо дополнить . Игра змейка в делфи.
Код:
var
FormMain: TFormMain;
S:array[1..30,1..30] of integer; //поле
Move:array[1..1000] of record X,Y:integer; end;
Sn: record
S1,S2:integer; //координаты головы змеи
Se1,Se2:integer; //координаты хвоста змеи
N:integer; //n направление(как на трубе)
K:integer; //количество частей тела)
New:boolean;
end;
i,k,Score:integer;
BG:TBitmap;
C1: TColor;
C2: TColor;
C3: TColor;
WS:integer;
implementation
uses Unit1;
{$R *.dfm}
{Процедура установки фрукта}
procedure GenApple;
var x,y:integer; // координаты фрукта
begin
repeat
x:=random(WS)+1; y:=random(WS)+1; {генерируем случайные координаты}
until S[x,y]=0; {если ячейка пустая заполняем ее фруктом, иначе возвращаемся к генерации}
S[x,y]:=3;
end;
{Процедура инициализации игры}
procedure TFormMain.FormCreate(Sender: TObject);
begin
{если программа запущена первый раз, то нужно проинициализировать пользовательские параметры}
if WS=0 then
begin
WS:=30;
C1:=clLime;
C2:=clGreen;
C3:=clRed;
end;
{создаем поле рисования}
BG:=TBitmap.Create;
BG.Width:=Width;
BG.Height:=Height;
randomize;
for i:=1 to WS do
for k:=1 to WS do
S[i,k]:=0;
S[WS-5,1]:=1; S[WS-5,2]:=2;
Sn.S1:=WS-5; Sn.S2:=2;
Sn.Se1:=WS-5; Sn.Se2:=1;
Move[1].X:=WS-5; Move[1].Y:=2;
Move[2].X:=WS-5; Move[2].Y:=1;
GenApple;
Sn.N:=6;
Sn.K:=2;
Score:=0;
N01.Caption:='Счёт: '+inttostr(Score);
P.Height:=WS*10+12; P.Width:=WS*10+12;
end;
{Процедура передвижения змейки}
procedure Movement(X,Y:integer);
begin
if not Sn.New then S[Move[Sn.K].X,Move[Sn.K].Y]:=0 else
begin
Sn.New:=false;
Sn.K:=Sn.K+1;
end;
for i:=Sn.K downto 1 do
begin
Move[I].X:=Move[I-1].X;
Move[I].Y:=Move[I-1].Y;
end;
Move[1].X:=X; Move[1].Y:=Y;
end;
{Функция проверки состояния змейки}
function TFormMain.Check:boolean;
begin
Result:=true;
if (Sn.S1>WS) or (Sn.S1<1) then Result:=false;
if (Sn.S2>WS) or (Sn.S2<1) then Result:=false;
case S[Sn.S1,Sn.S2] of
0: ;
1,2: Result:=false;
3: begin
Score:=Score+10;
N01.Caption:='Счёт: '+inttostr(Score);
Sn.New:=true;
GenApple;
end;
end;
end;
{Процедура кадра - одного хода змейки}
procedure TFormMain.TimerTimer(Sender: TObject);
{Подпроцедура конца игры}
procedure Finish;
begin
Timer.Enabled:=false;
MessageDlg('Вы проиграли!'+#13+#10+'Ваш счёт: '+inttostr(Score),mtWarning,[mbOK],0);
end;
{Проверяем к чему приведет передвижение змейки, обрабатываем каждое направление}
begin
case Sn.N of
2: begin
Sn.S1:=Sn.S1-1;
if not Check then begin Finish; exit; end;
S[Sn.S1,Sn.S2]:=2;
S[Sn.S1+1,Sn.S2]:=1;
Movement(Sn.S1,Sn.S2);
end;
4: begin
Sn.S2:=Sn.S2-1;
if not Check then begin Finish; exit; end;
S[Sn.S1,Sn.S2]:=2;
S[Sn.S1,Sn.S2+1]:=1;
Movement(Sn.S1,Sn.S2);
end;
6: begin
Sn.S2:=Sn.S2+1;
if not Check then begin Finish; exit; end;
S[Sn.S1,Sn.S2]:=2;
S[Sn.S1,Sn.S2-1]:=1;
Movement(Sn.S1,Sn.S2);
end;
8: begin
Sn.S1:=Sn.S1+1;
if not Check then begin Finish; exit; end;
S[Sn.S1,Sn.S2]:=2;
S[Sn.S1-1,Sn.S2]:=1;
Movement(Sn.S1,Sn.S2);
end;
end;
PatBlt(BG.Canvas.Handle,0,0,Width,Height,WHITENESS);
PaintField;
end;
{Процедура прорисовки кадра}
procedure TFormMain.PaintField;
begin
for i:=1 to WS do
for k:=1 to WS do
begin
case S[k,i] of
1: begin
BG.Canvas.Brush.Color:=C2;
{Прорисовка головы}
BG.Canvas.Ellipse(i*10,k*10,i*10+10,k*10+10);
end;
2: begin
{Прорисовка хвоста}
BG.Canvas.Brush.Color:=C1;
BG.Canvas.Ellipse(i*10,k*10,i*10+10,k*10+10);
end;
3: begin
{Прорисовка фруктов}
BG.Canvas.Brush.Color:=C3;
BG.Canvas.Ellipse(i*10,k*10,i*10+10,k*10+10);
end;
end;
end;
P.Picture.Bitmap:=bg;
end;
{Процедура обработки нажатия клавиш}
procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_RIGHT: begin
if Sn.N<>4 then Sn.N:=6; {обработка направлений движения змейки, если направление противоположное
мы игнорируем нажатие клавиши}
end;
VK_LEFT: begin
if Sn.N<>6 then Sn.N:=4;
end;
VK_UP: begin
if Sn.N<>8 then Sn.N:=2;
end;
VK_DOWN: begin
if Sn.N<>2 then Sn.N:=8;
end;
VK_ESCAPE,VK_PAUSE:begin
Timer.Enabled:=false;
MessageDlg('ПАУЗА!'+#13+#10+'Нажмите ENTER для продолжения',mtInformation,[mbOK],0);
Timer.Enabled:=true;
end;
end;
end;
{Процедура выхода из игры}
procedure TFormMain.N2Click(Sender: TObject);
begin
halt
end;
{Процедура новой игры}
procedure TFormMain.N1Click(Sender: TObject);
begin
OnCreate(self);
Timer.Enabled:=true;
end;
{Процедура обработки модального окна настроек}
procedure TFormMain.N3Click(Sender: TObject);
var
WS_tmp:integer;
begin
Timer.Enabled:=false;
{Запускаем модальную форму и обрабатываем ее, если была нажата кнопка ОК}
if Form1.ShowModal = mrOK then
begin
C1:=Form1.ColorBox1.Selected;
C2:=Form1.ColorBox2.Selected;
C3:=Form1.ColorBox3.Selected;
Timer.Interval:=StrToInt(Form1.Edit1.Text);
if (StrToInt(Form1.Edit2.Text)>5) and (StrToInt(Form1.Edit2.Text)<31) then
begin
WS_tmp:=StrToInt(Form1.Edit2.Text);
if (WS_tmp<>WS) then
begin
WS:=WS_tmp;
OnCreate(self);
end;
end;
end;
Timer.Enabled:=true;
end;
end.
Последний раз редактировалось ErsultanK; 22.11.2018 в 16:06.
|