Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Нужна помощь с маленькой программой на Паскале (http://www.tehnari.ru/f41/t50546/)

FPS 16.04.2011 22:42

Нужна помощь с маленькой программой на Паскале
 
Всем привет, очень нужна помощь с небольшой графической программой. Суть её в том, что она выводит один символ, который можно двигать стрелками, а при нажатии Esc появляется второй символ и когда второй символ двигаем к первому, то первый исчезает. Нужно изменить программу так, чтобы когда второй символ приближался к первому, то он бы перепрыгивал первый символ. Ниже код программы. Заранее спасибо)
Цитата:

program dragging;
uses graph, crt, monsters;
var
Vasia : monstr;
Misha : daemon;
x,y : integer;
gd, gm : integer;
begin
gd := detect;
initgraph(gd, gm, 'c:/BP/BIN');
if graphresult <> grOk then begin
writeln('oshibka inicializacii grafiki'); readln; exit end;
Vasia.init(200,200,10,8);
Vasia.draw;
while vasia.drag do;Misha.init(400, 400, 10, 8 ,2); Misha.draw;
while misha.drag do;
end.

FPS 17.04.2011 21:44

Забыл про подключаемый модуль "monsters", в нём менять ничего не надо, вот его код
Цитата:

unit monsters;
interface
uses graph,crt;

type monstr = object
constructor init(x_, y_, health_, ammo_ : word);
procedure attack ; virtual ;
procedure draw ; virtual ;
procedure erase ; virtual ;
procedure hit;
procedure move(x_,y_: word) ;
function drag :boolean;virtual;
private
x, y : word; health, ammo : word; color : word;
end;
daemon = object (monstr)
constructor init(x_, y_, health_, ammo_ ,magic_: word);
procedure attack ; virtual ;
procedure draw ; virtual ;
procedure erase ; virtual ;
procedure wizardry;
private
magic : word;
end;

implementation
{**************************realize method monster*********}
constructor monstr.init(x_,y_,health_,ammo_: word);
begin
x:= x_;
y:=y_;
health:= health_;
ammo:=ammo_;
color:=yellow;
end;
{*****************monstr.attack**********}
procedure monstr.attack;
begin
if ammo = 0 then exit;
dec(ammo); setcolor(color); outtextXY(x+15,y,'ba-bax!');
end;
{***********monstr.draw********}
procedure monstr.draw;
begin
setcolor(color); outtextXY(x,y,'@');
end;
{****************monstr.erase***********}
procedure monstr.erase;
begin
setcolor(black); outtextXY(x,y,'@');outtextXY(x+15,y,'ba-bax!');
end;
{***********monstr.hit************}
procedure monstr.hit;
begin
if health=0 then exit;
dec(health);
if health = 0 then begin color := red; draw;exit;end;
attack;
end;
{************************monstr.move*************}
procedure monstr.move(x_,y_:word);
begin
if health = 0 then exit;
erase; x:=x_;y:=y_; draw;
end;
{*********************monster.drag**************}
function monstr.drag : boolean;
var
key : char;
dx,dy : integer;
step : integer;
begin
step := 5;
key := readkey;
if key = chr(0) then key := readkey; dx := 0; dy := 0;
case ord(key) of
72 : dy := -step;
75 : dx := -step;
77 : dx := step;
80 : dy := step;
27 : begin drag := false; exit end; end;
monstr.move(x + dx, y + dy); drag := true;
end;

{realize method object deamon}
constructor daemon.init ( x_,y_,health_,ammo_,magic_:word);
begin
inherited init ( x_,y_,health_,ammo_);
color:=green;
magic:=magic_;
end;

{daemon.attack}
procedure daemon.attack;
begin
if ammo= 0 then exit;
dec(ammo);
if magic > 0 then begin
outtextXY(x+15,y,'BY-BYX!'); dec(magic); end
else
outtextXY(x+15,y,'by-byx!');
end;
{daemon.draw}
procedure daemon.draw;
begin
setcolor(color); outtextXY(x,y,'%');
end;
{daemon.erase}
procedure daemon.erase;
begin
setcolor(black); outtextXY(x,y,'%)');outtextXY(x+15,y,'by-byx!');outtextXY(x+15,y,'BY-BYX');
end;
{daemon.wizardry}
procedure daemon.wizardry;
begin
if magic = 0 then exit;
outtextXY(x+15,y,'Krible-krable-byms!'); dec (magic);
end;
end.

AlexZir 18.04.2011 08:36

Могу вам облегчить задачу :)

В PASCAL есть целый тип, позволяющий обрабатывать битовые маски (спрайты). Можно сохранять два спрайта в памяти и последовательно их выводить, вычисляя координаты по нажатию управляющей клавиши. Прыжок можно реализовать выводом инверсного спрайта на старом месте и прорисовкой его на новом, отслеживая координаты спрайта.

При этом вам не нужно будет писать сложные многострочные внешние модули :)

FPS 18.04.2011 19:45

А там не много получится писать, вы не подправите как надо?) А я то очень туго в этом соображаю) Щас бы дотянуть ещё полтора месяца до сессии и больше не будет программирования:tehnari_ru_953:


Часовой пояс GMT +4, время: 11:30.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.