где то так : program bax;
const vm = 32; // высота рис
wm = 32; // ширина рис
sp = 10; // скорость пули
sm = 7; // скорость мишени
var
im: image; // мишень
x, // пушкa
xp,yp, // пуля
xm:integer; // мишень x координата
pl:boolean; // флаг полета пули
procedure pistolet(c: integer;); // рисует (1) или стирает (0) пушку
begin
if c=1 then setColor(255, 0, 0) else setColor(255, 255, 255);
drawLine(x,getHeight,x+10,getHeight-10);
drawLine(x+20,getHeight,x+10,getHeight-10);
end;
procedure klava; // опрос клавиатуры
var
c:integer;
begin
c:=getKeyPressed;
if keyToAction©=GA_LEFT then begin
pistolet(0);
x:=x-5; if x<0 then x:=getWidth-20;
pistolet(1);
end;
if keyToAction©=GA_RIGHT then begin
pistolet(0);
x:=x+5; if x>getWidth-20 then x:=0;
pistolet(1);
end;
if (keyToAction©=GA_FIRE) and not(pl) then begin // not(pl) это тоже что pl=false. если пуля уже летит то нажатие игнорируем
pl:=true; // пуля полетела
xp:=x+10; yp:=getHeight-15; // начальные координаты пули
end;
end;
procedure mishen; // рисуем и сдвигаем мишень
begin
setColor(255, 255, 255);fillRect(xm,0, wm, vm); // стираем
xm:=xm+sm; if xm>getWidth then xm:=0-wm;
drawImage(im, xm, 0);
end;
procedure pulja1(c:integer);// рисует (1) или стирает (0) пулю
begin
if c=1 then setColor(255, 0, 0) else setColor(255, 255, 255);
drawLine(xp,yp,xp,yp+5);
end;
procedure pulja;
begin
if pl then begin // если пуля летит ( pl=true ) то изменяем координаты пули
pulja1(0); // стираем
yp:=yp-sp; // изменяем
if (yp<vm) and ((xp>=xm) and (xp<=xm+wm)) then halt; // если долетела до мишени (yp<15) и попала ((xp>=xm) and (xp<=xm+15)) то все
pulja1(1); // рисуем по новым координатам
if yp<0 then begin pl:=false;pulja1(0);end; // вылет за край экрана - сбрасываем флаг полета и стираем
end;
end;
begin // начало
im:=loadImage('/1.png');
setColor(255, 255, 255);fillRect(0,0, getWidth, getHeight);
pistolet(1);
repeat
mishen;
pulja;
klava;
repaint;delay(10);
until false;
end.