Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2018, 15:28   #1
ErsultanK
Новичок
Джуниор
 
Регистрация: 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.
Вложения
Тип файла: rar UnitMain.rar (2.3 Кб, 5 просмотров)
Тип файла: 7z Змейка (2).7z (174.3 Кб, 5 просмотров)

Последний раз редактировалось ErsultanK; 22.11.2018 в 16:06.
ErsultanK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите написать программу 'Трёхцветная раскраска графа Петерсена' нужно написать на языке С# под консольном приложения вижуал студио lysi Фриланс 4 04.07.2017 22:58
ПОМОГИТЕ НАПИСАТЬ pilevas Помощь студентам 1 17.06.2008 14:22
задача под windows,помогите написать.Надо написать на Borland C++Builder 6. eddddii Помощь студентам 9 23.05.2008 17:04
Помогите написать прогу!Среди заданных целых чисел k, l, m найти пары кратных.Написать по проще чемЭесть vdv08 Паскаль, Turbo Pascal, PascalABC.NET 4 04.04.2008 16:56