Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

змейка [D7]


ghjtyu21 ©   (2011-12-28 23:04:00) 

что здесь не так?

unit ttt;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, ExtCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   Image1: TImage;
    MainMenu1: TMainMenu;
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormKeyPress(Sender: TObject; var Key: Char);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
TSnake=Class
   length:Byte;
   Body:array of TPoint;
   dx,dy:Integer;
   Constructor Create(length0:byte);
   Procedure ChangeDirection(arg:char);
   Procedure Move;
   Procedure Show(arg:TCanvas);

 end;
var
 Form1: TForm1;
 Snake:TSnake;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.Brush.Color:=Form1.Color;
 Image1.Canvas.Rectangle(0,0,form1.ClientWidth,form1.ClientHeight);
 snake:=TSnake.Create(5);
 end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
snake.Move;
Snake.Show(image1.Canvas);
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
snake.ChangeDirection(key);
end;
Procedure TSnake.ChangeDirection(arg:char);
begin
  case arg of
    #65: begin dx:=0;dy:=-1;end;
    #66: begin dx:=-1;dy:=0;end;
    #68: begin dx:=0;dy:=1;end;
    #67: begin dx:=1;dy:=0;end;
   end;
end;
Constructor TSnake.Create(length0:byte);
var i:integer;
begin
 length:=length0;
 Setlength(body,length);
 for i:=length-1 downto 0 do
  begin
    body[i].X:=(Form1.ClientWidth div 2)-10*(length-1-i);
    body[i].Y:=Form1.ClientHeight div 2;
  end;
  dx:=1;
  dy:=0;
end;
Procedure TSnake.Move;
var i:integer;
 begin

  for i:=0 to length-1 do
   body[i]:=body[i+1];
  body[length-3].X:=body[length-3].X+10*dx;
  body[length-3].Y:=body[length-3].Y+10*dy;
 end;
Procedure TSnake.Show(arg:TCanvas);
var i:integer;
begin
 with arg do
  begin
   Rectangle(0,0,form1.ClientWidth,form1.ClientHeight);
    for i:=length-1 downto 0 do
     Rectangle(body[i].X-4,body[i].Y-4,body[i].X+4,body[i].Y+4);
    end;
    end;

end.


KilkennyCat   (2011-12-29 01:08:00) [1]

таймер выключен, стопудово.


Германн   (2011-12-29 00:45:00) [2]

В таких случаях положено приводить не только pas, но и dfm.

> ghjtyu21 ©   (28.12.11 23:20) [2]
>
> вообще не ползет...(
>

А отладчик в OnKeyPress формы заходит?


RWolf   (2011-12-28 23:56:00) [3]

очевидно, что код некорректно обращается с индексами:
Procedure TSnake.Move;
var i:integer;
begin
 for i:=0 to length-2 do //фикс №1
   body[i]:=body[i+1];
 body[length-1].X:=body[length-1].X+10*dx; //фикс №2
 body[length-1].Y:=body[length-1].Y+10*dy; //
end;


Rouse_   (2011-12-28 23:35:00) [4]

В настройках компирера Range check error и  т.д. - короче при отладке все настройки по максимуму выставь :)


ghjtyu21   (2011-12-28 23:34:00) [5]

что включить?


Rouse_   (2011-12-28 23:27:00) [6]

Ну для начала выходы за пределы в настройках компилера включи, а то не понятно как вот это у тебя отработало:


Procedure TSnake.Move;
var i:integer;
begin

 for i:=0 to length-1 do
  body[i]:=body[i+1];
 body[length-3].X:=body[length-3].X+10*dx;
 body[length-3].Y:=body[length-3].Y+10*dy;
end;


ghjtyu21   (2011-12-28 23:20:00) [7]

вообще не ползет...(


Сергей М.   (2011-12-28 23:18:00) [8]

ползет, гадит и не убирает за собой ?)


Наверх

Титульная страница Поиск, карта сайта Написать письмо