Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ стрельба по самолету из зенитки

Автор: Legat1177 6.12.2010 19:02

Всем добрый день!

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

вот такой код я написал:

uses crt,graph;
const g=9.81;
var device,mode:integer;
x_sam,y_sam:integer; {samolet}
s,h,t,v,a:Real;
x,y,z:integer; {yadro,vzriv}
x_tree,y_tree,i:integer; {derevo}
kl:Char;{upravlenie klsviaturoi}
Procedure tree; forward;
Procedure Landscape;
begin
{nebo}
setfillstyle(1,cyan);
bar(0,0,650,400);
{zemlya}
setfillstyle(1,green);
bar(0,400,650,500);
{sun}
setcolor(yellow);
setfillstyle(1,yellow);
circle(580,40,30);
floodfill(580,40,yellow);
{dereva}
x_tree:=100; y_tree:=400;
tree;
x_tree:=550; y_tree:=380;
tree;
end;
Procedure tree;
begin
setcolor(white); {krona}
ellipse(x_tree,y_tree,0,360,15,30);
setfillstyle(1,lightgreen);
floodfill(x_tree,y_tree,white);
setfillstyle(1,brown); {stvol}
bar(x_tree-3,y_tree+30,x_tree+3,y_tree+60);
end;
Procedure samolet;
begin
setcolor(red);
setfillstyle(1,red);
{telo samoleta}
bar(x_sam,y_sam,x_sam+60,y_sam+20);
{right krilo}
line(x_sam+50,y_sam+20,x_sam+10,y_sam+50);
line(x_sam+10,y_sam+50,x_sam+10,y_sam+20);
floodfill(x_sam+30,y_sam+30,red);
{left krilo}
line(x_sam+50,y_sam,x_sam+10,y_sam-30);
line(x_sam+10,y_sam-30,x_sam+10,y_sam);
floodfill(x_sam+30,y_sam-10,red);
delay(6000);
setcolor(cyan);
setfillstyle(1,cyan);
{telo samoleta}
bar(x_sam,y_sam,x_sam+60,y_sam+20);
{right krilo}
line(x_sam+50,y_sam+20,x_sam+10,y_sam+50);
line(x_sam+10,y_sam+50,x_sam+10,y_sam+20);
floodfill(x_sam+30,y_sam+30,cyan);
{left krilo}
line(x_sam+50,y_sam,x_sam+10,y_sam-30);
line(x_sam+10,y_sam-30,x_sam+10,y_sam);
floodfill(x_sam+30,y_sam-10,cyan);
end;
Procedure pushka; {zenitka}
begin
setcolor(white); {obvod}
ellipse(300,410,0,360,30,10);
setfillstyle(8,brown);
floodfill(300,410,white);
end;
Procedure yadro;
begin
setcolor(white);
setfillstyle(1,white);
circle(x,y,20);
floodfill(x,y,white);
delay(6000);
setcolor(cyan);
setfillstyle(1,cyan);
circle(x,y,20);
floodfill(x,y,cyan);
delay(100);
y:=y-10;
end;

BEGIN
device:=0;
initgraph(device,mode,'c:\tp71\bgi');
directvideo:=false;
clrscr;
landscape;
pushka;
x:=300;
y:=380;
repeat
x_sam:=0;
y_sam:=100;
repeat
x_sam:=x_sam+5;
samolet;
while keypressed do kl:=readkey;
if kl=#072 then repeat
yadro;
until y>=0;
delay(300);
until x_sam>=650;
until y_sam=0;

readln;
closegraph;
End.

как сделать так чтоб когда снаряд долетает до конца экрана самолет продолжал двигаться и можно было бы делать еще выстрелы? (текст где возможно ошибка пометил красным)

Автор: TarasBer 6.12.2010 19:48

Потому что игрек становится меньше нуля и цикл

repeat
yadro;
until y>=0;


Становится бесконечным.

Подправленный вариант:


uses crt,graph;
const g=9.81;
var device,mode:integer;
x_sam,y_sam:integer; {samolet}
s,h,t,v,a:Real;
x,y,z:integer; {yadro,vzriv}
x_tree,y_tree,i:integer; {derevo}
kl:Char;{upravlenie klsviaturoi}
Procedure tree; forward;
Procedure Landscape;
begin
{nebo}
setfillstyle(1,cyan);
bar(0,0,650,400);
{zemlya}
setfillstyle(1,green);
bar(0,400,650,500);
{sun}
setcolor(yellow);
setfillstyle(1,yellow);
circle(580,40,30);
floodfill(580,40,yellow);
{dereva}
x_tree:=100; y_tree:=400;
tree;
x_tree:=550; y_tree:=380;
tree;
end;
Procedure tree;
begin
setcolor(white); {krona}
ellipse(x_tree,y_tree,0,360,15,30);
setfillstyle(1,lightgreen);
floodfill(x_tree,y_tree,white);
setfillstyle(1,brown); {stvol}
bar(x_tree-3,y_tree+30,x_tree+3,y_tree+60);
end;
Procedure samolet;
begin
setcolor(red);
setfillstyle(1,red);
{telo samoleta}
bar(x_sam,y_sam,x_sam+60,y_sam+20);
{right krilo}
line(x_sam+50,y_sam+20,x_sam+10,y_sam+50);
line(x_sam+10,y_sam+50,x_sam+10,y_sam+20);
floodfill(x_sam+30,y_sam+30,red);
{left krilo}
line(x_sam+50,y_sam,x_sam+10,y_sam-30);
line(x_sam+10,y_sam-30,x_sam+10,y_sam);
floodfill(x_sam+30,y_sam-10,red);
delay(6000);
setcolor(cyan);
setfillstyle(1,cyan);
{telo samoleta}
bar(x_sam,y_sam,x_sam+60,y_sam+20);
{right krilo}
line(x_sam+50,y_sam+20,x_sam+10,y_sam+50);
line(x_sam+10,y_sam+50,x_sam+10,y_sam+20);
floodfill(x_sam+30,y_sam+30,cyan);
{left krilo}
line(x_sam+50,y_sam,x_sam+10,y_sam-30);
line(x_sam+10,y_sam-30,x_sam+10,y_sam);
floodfill(x_sam+30,y_sam-10,cyan);
end;
Procedure pushka; {zenitka}
begin
setcolor(white); {obvod}
ellipse(300,410,0,360,30,10);
setfillstyle(8,brown);
floodfill(300,410,white);
end;


Procedure yadro;
begin
setcolor(cyan);
setfillstyle(1,cyan);
circle(x,y,20);
floodfill(x,y,cyan);
y:=y-10;
if (abs(x-x_sam) < 50) and (abs(y-y_sam) < 50) then begin
y_sam := y_sam - 110;
y := -100;
end;
setcolor(white);
setfillstyle(1,white);
circle(x,y,20);
floodfill(x,y,white);

{collision}

end;

BEGIN
device:=0;
initgraph(device,mode,'c:\tp71\bgi');
directvideo:=false;
landscape;
pushka;
y := -100;


repeat
x_sam:=0;
y_sam:=100;
repeat
x_sam:=x_sam+5;
samolet;
if keypressed then kl:=readkey
else kl := #0;
if (kl=#072) and (y < 0) then begin
x:=300;
y:=380;
end;
yadro;
delay(300);
if y_sam <= 0 then Break;
until x_sam>=650;
until y_sam<=0;


closegraph;
writeln('You win!');
while KeyPressed do ReadKey;
readln;
End.


Автор: Legat1177 7.12.2010 15:53

Цитата(TarasBer @ 6.12.2010 15:48) *

Потому что игрек становится меньше нуля и цикл

repeat
yadro;
until y>=0;
Становится бесконечным.

Подправленный вариант:
...


Спасибо за подсказку! теперь все отлично работает!) осталось только взрыв при контакте добавить, но это я сам.