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

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

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2013, 10:49   #1
rhino101
Новичок
Джуниор
 
Регистрация: 12.12.2013
Сообщений: 1
По умолчанию Помогите найти ошибку. Модули не видят друг друга

Помогите найти ошибку. Игра змейка состоит из двух юнитов (main, game), main не может найти объекты из game. Может можно объединить юниты в один?

Код:
unit main;

interface

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

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure NewGame;
procedure MoveSnake;
procedure GamePlay;
procedure GameOver;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
SnakeLen, Count : Integer; 
ATails : array[1..1000] of TTail;
AApple : TApple;
AHead : THead;
HeadPic, ApplePic, TailPic : TBitmap; 
dir : String; 

implementation

uses game;

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
MoveSnake;
Game;
Caption := 'Your Score: '+IntToStr(SnakeLen)+'.';
Refresh;
end;

procedure TForm1.NewGame;
begin
SnakeLen := 2;

ApplePic := TBitmap.Create;
ApplePic.LoadFromFile('red.bmp');
ApplePic.Transparent := True;
HeadPic := TBitmap.Create;
HeadPic.LoadFromFile('yellow.bmp');
TailPic := TBitmap.Create;
TailPic.LoadFromFile('green.bmp');

Width := 24 * (Count+1);
Height := Width;

Randomize;
AApple := TApple.Create(random(Count)*24,random(Count)*24,ApplePic);
AHead := THead.Create(random(Count)*24,random(Count)*24,HeadPic);
ATails[1] := TTail.Create(AHead.getX,AHead.getY-24,TailPic);
ATails[2] := TTail.Create(AHead.getX,AHead.getY-48,TailPic);

dir := 'Down';
Timer1.Enabled := True;
Timer1.Interval := 300;
end;

procedure TForm1.MoveSnake;
var i : Integer;
begin
for i := SnakeLen downto 2 do 
begin
ATails[i].setX(ATails[i-1].getX);
ATails[i].setY(ATails[i-1].getY);
end;

ATails[1].setX(AHead.getX);
ATails[1].setY(AHead.getY);

If dir = 'Down' Then AHead.setY(AHead.getY + 24);
If dir = 'Up' Then AHead.setY(AHead.getY - 24);
If dir = 'Left' Then AHead.setX(AHead.getX - 24);
If dir = 'Right' Then AHead.setX(AHead.getX + 24);
end;

procedure TForm1.GamePlay;
var i : Integer;
begin
if (AHead.getX = AApple.getX) and (AHead.getY = AApple.getY) Then
begin
Randomize;
AApple.setX(random(Count)*24); 
AApple.setY(random(Count)*24); 
SnakeLen := SnakeLen + 1;
ATails[SnakeLen] := TTail.Create(ATails[SnakeLen-1].getX,ATails[SnakeLen-1].getY,TailPic);
if Timer1.Interval > 55 Then Timer1.Interval := Timer1.Interval - 5;
end;
for i := 1 to SnakeLen do
if (AHead.getX = ATails[i].getX) and (AHead.getY = ATails[i].getY) Then
GameOver;
if AHead.getX < 0 Then GameOver;
if AHead.getX > (Count+1) * 24 Then GameOver;
if AHead.getY < 0 Then GameOver;
if AHead.getY > (Count+1) * 24 Then GameOver;
end;

procedure TForm1.GameOver;
var i : Integer;
begin
Timer1.Enabled := False;
ShowMessage('GameOver__LOSER!!!');
for i := 1 to SnakeLen do

AHead.Free ;
AAple.Free ;
ATails[i].Free;

SnakeLen := 2;
NewGame;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
Count := 20;
Color := clBlack;
NewGame;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
);
begin
if (Key = VK_LEFT) and (dir <> 'Right') Then dir := 'Left'; 
if (Key = VK_RIGHT) and (dir <> 'Left') Then dir := 'Right'; 
if (Key = VK_DOWN) and (dir <> 'Up') Then dir := 'Down'; 
if (Key = VK_UP) and (dir <> 'Down') Then dir := 'Up'; 
end;

procedure TForm1.FormPaint(Sender: TObject); 
var i : Integer;
begin
for i := 1 to SnakeLen do
Canvas.Draw(ATails[i].getX,ATails[i].getY,Atails[i].getBitmap);

Canvas.Draw(AApple.getX,AApple.getY,AApple.getBitmap);
Canvas.Draw(AHead.getX,AHead.getY,AHead.getBitmap);
end;

end.




unit game;

interface

uses
Classes, SysUtils, Graphics;

type

{ TBase }

TBase = class
private
x : Integer;
y : Integer;
bitmap : TBitmap;
public
Constructor Create(x0,y0 : Integer; bitmap0 : TBitmap);

procedure setX(x0 : Integer); 
procedure setY(y0 : Integer); 
procedure setBitmap(bitmap0 : TBitmap); 

function getX : Integer; 
function getY : Integer; 
function getBitmap : TBitmap; 
end;

TApple = class (TBase)

end;

THead = class (TBase)

end;

TTail = class (TBase)

end;
implementation

uses main;

{ TBase }

constructor TBase.Create(x0, y0: Integer; bitmap0: TBitmap);
begin
x := x0; 
y := y0; 
bitmap := bitmap0; 
end;

procedure TBase.setX(x0: Integer);
begin
x := x0;
end;

procedure TBase.setY(y0: Integer);
begin
y := y0;
end;

procedure TBase.setBitmap(bitmap0: TBitmap);
begin
bitmap := bitmap0;
end;

end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 12.12.2013 в 11:05.
rhino101 вне форума Ответить с цитированием
Старый 12.12.2013, 10:52   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

чем отличаются и для чего нужны interface и implementation части в курсе?
eval вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наложение изображений друг на друга (GD) Chiliec PHP 2 29.12.2012 15:08
Формы не видят друг друга Delphi74 Общие вопросы Delphi 4 23.08.2011 11:46
Комбо не видят друг друга Sergey112233 Microsoft Office Access 0 06.02.2011 20:15
найти друг друга в сети (динамические IP) Лубышев Общие вопросы Delphi 2 21.08.2010 16:30
Найти в массиве квадратные корни наиболее удаленные друг от друга sher_man Помощь студентам 2 05.12.2007 10:15