IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> стрельба по самолету из зенитки
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Артем

Репутация: -  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(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.

как сделать так чтоб когда снаряд долетает до конца экрана самолет продолжал двигаться и можно было бы делать еще выстрелы? (текст где возможно ошибка пометил красным)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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

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.



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Артем

Репутация: -  0  +


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

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

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

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


Спасибо за подсказку! теперь все отлично работает!) осталось только взрыв при контакте добавить, но это я сам.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.10.2020 21:44
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name