{strzelamy do kwadratowej piłki z trójkątnej armaty}
program gierka1;
uses crt,graph;
{trójkątna armata}
procedure armata(x,y,bok,kolor:integer);
begin
  setcolor(kolor);
  moveto(x,y);
  lineRel(0,bok);
  linerel(-bok,-bok div 2);
  linerel(bok, -bok div 2);
end;
{kwadratowa piłka}
procedure pilka(x,y,dlugosc,kolor:integer);
begin
  setcolor(kolor);
  line(x,y,x+dlugosc,y);
  line(x+dlugosc,y,x+dlugosc,y+dlugosc);
  line(x+dlugosc,y+dlugosc,x,y+dlugosc);
  line(x,y+dlugosc,x,y);
end;
var d,m:integer;
  xs,ys,ds,ks,      {dane poruszającego się pocisku}
  kxs,              {szybkość pocisku}
  xr,yr,dr,kr,      {dane rakietki}
  xp,yp,dp,kp,      {dane piłki}
  kxp,kyp:integer;  {szybkość ruchu piłki}
  strzal:boolean;   {można strzelać}
  koniec:boolean;   {kiedy koniec gierki}
  znak:char;        {jaki znak na klawiaturze}
begin
  d:=detect;
  initgraph(d,m,'');
  {wspolrzedne rakietki}
  xr:=630;
  yr:=200;
  dr:=50;
  kr:=14;
  {wspolrzedne pilki}
  xp:=0;
  yp:=0;
  dp:=30;
  kp:=12;
  kxp:=1;
  kyp:=1;
  koniec:=false;	{koniec gry}
  strzal:=false;	{można strzelać gdy pocisk za ekranem}
  {współrzędne pocisku}
  kxs:=-10;
  xs:=-10;
  ks:=10;
  ds:=3;
  repeat
    {rysowanie}
    armata(xr,yr,dr,kr);
    pilka(xp,yp,dp,kp);
    {pocisk rysujemy i wymazujemy tylko wtedy gdy była spacja}
    if strzal then pilka(xs,ys,ds,ks);
    {wstrzymanie}
    delay(10);
    {wymazanie}
    armata(xr,yr,dr,0);
    pilka(xp,yp,dp,0);
    if strzal then pilka(xs,ys,ds,0);
    {sprawdzanie klawiatury-gdy nacisnieto jakis klawisz}
    if keypressed then
    begin
      {odczytanie klawisza-kod klawisza w zmiennen znak}
	znak:=readkey;
      {gdy to byl kod kursora to czytamy kolejny znak bo pierwszy ma kod 0}
  	if znak=#0 then znak:=readkey;
  	case znak of
         'H':yr:=yr-5;{kod kursora gora}
         'P':yr:=yr+5;{kod kursora dol}
        	{jeśli spacja to strzelamy, gdy nie ma pocisku na ekranie}
         ' ':if not(strzal) then
	   	begin
	 		strzal:=true;       {jest pocisk na ekranie}
			xs:=xr;             {współrzędne początkowe pocisku}
			ys:=yr+dr div 2;
	   	end;
         #27:koniec:=true;{kod klawisza ESC}
      	end; {koniec case}

      {oczyszczamy bufor klawiatury zeby nie piszczalo}
	while keypressed do znak:=readkey;
    end; {gdy naciśnięto klawisz}
    {ruch pilki}
    xp:=xp+kxp;
    yp:=yp+kyp;
    {odbicia od brzegow ekranu}
    if xp<=0 then kxp:=-kxp;
    if (yp<=0) or (yp>=479) then kyp:=-kyp;

    {koniec gry gdy piłka przeleci za rakietka}
    if xp>=639 then koniec:=true;
    {odbicie od rakietki}
    if (xp+dp>=xr) and ((yp+dp>yr) and (yp+dp<yr+dr)) then kxp:=-kxp;
    {jeśli jest pocisk na ekranie to go przesuwamy}
    if strzal then
    begin
      xs:=xs+kxs;
      {przesuwamy aż wylezie za ekran z lewej strony do tego momentu nie można strzelać}
      if xs<0 then strzal:=false;	{teraz dopiero będzie można oddać nowy strzał}
      {i jeszcze trzeba sprawdzać czy nie uderzył w piłkę}
         {w pionie i w poziomie mieści się w obrębie piłki}
      if (ys>yp) and (ys<yp+dp) and
         (xs>xp) and (xs<xp+dp)
	then				{gdy trafimy w piłkę to zmieniamy jej kolor na kolejny}
          if kp<15 then kp:=kp+1 else kp:=1;
    end;	{strzał}
  until koniec;
  closegraph;
end.