{można przesuwać kwadrat
 można zmieniać jego wymiary
 losowo generowane są przeszkody
 sprawdzanie wejścia na przeszkodę
 sprawdzanie końca gry}
program gra;
uses crt,graph;

{prostokatna pilka o dlugosci sciany i kolorze}
procedure pilka(x,y,dx,dy,kolor:integer);
begin
  setcolor(kolor);
  line(x,y,x+dx,y);
  line(x+dx,y,x+dx,y+dy);
  line(x+dx,y+dy,x,y+dy);
  line(x,y+dy,x,y);
end;

{losowane rysowanie przeszkód}
procedure losowanie(ax,ay,ile:integer);
var
  i,x,y,dx,dy:integer;
begin
  for i:=1 to ile do
  begin
    x:=random(640);
    y:=random(480);
    dx:=random(ax);
    dy:=random(ay);
    {żeby nic nie narysowało w rogach}
    if not(((x<ax+20) and (y<ay+20)) or ((x>620-ax) and (y>460-ay)))
	then pilka(x,y,dx,dy,14);
  end;
end;

{sygnał dzwiękowy}
procedure beep;
var i:integer;
begin
  Sound(150);
  Delay(1000);
  NoSound;
end;

var d,m:integer;
  i,ile,                      	{ilość prpstokątów}
  xp,yp,dxp,dyp,kp:integer; 	{dane pilki}

  dotyka,			{sprawdzanie czy kwadrat dotyka przeszkód}
  koniec:boolean;      {kiedy koniec gierki}
  znak:char;           {jaki znak na klawiaturze}

{początek programu}
begin
  d:=detect;
  initgraph(d,m,'');
  {randomize;}

  {wspolrzedne pilki}
  xp:=0;
  yp:=0;
  dxp:=50;
  dyp:=50;
  kp:=13;
  ile:=100;

  losowanie(dxp,dyp,ile);

  koniec:=false;

  repeat
    {rysowanie}
    pilka(xp,yp,dxp,dyp,kp);
    {wstrzymanie}
    delay(10);
    {wymazanie}
    pilka(xp,yp,dxp,dyp,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':if yp>1 then yp:=yp-1;{kod kursora gora}
       		'P':if yp<479-dyp then yp:=yp+1;{kod kursora dol}
       		'M':if xp<639-dxp then xp:=xp+1;{kod kursora w prawo}
       		'K':if xp>1 then xp:=xp-1;{kod kursora w lewo}
       		#27:koniec:=true;{kod klawisza ESC}
       		'd','w':if dyp>5 then
				 begin
				   dxp:=dxp+1;
				   dyp:=dyp-1
				 end;		{szer+ wys-}
	       'a','s':if dxp>5 then
				begin
			 	  dxp:=dxp-1;
				  dyp:=dyp+1
				end;		{szer- wys+}
      	end;	{case}
      {oczyszczamy bufor klawiatury zeby nie piszczalo}
   	while keypressed do znak:=readkey;
    end;	{badanie klawiatury}

    {gdy dotknie przeszkody to koniec}
    dotyka:=false;
    {sprzadzamy wszystkie piksele kwadratu czy nie wlazło na piksela o kolorze 14}
    for i:=xp to xp+dxp do
    begin
	if getpixel(i,yp)=14 then dotyka:=true;
    	if getpixel(i,yp+dyp)=14 then dotyka:=true;
    end;
    for i:=yp to yp+dyp do
    begin
  	if getpixel(xp,i)=14 then dotyka:=true;
    	if getpixel(xp+dxp,i)=14 then dotyka:=true;
    end;
    if dotyka then {a tu koniec gdy dotyka}
	begin beep; koniec:=true end;

    {gdy dojdzie do prawego dolnego roku to koniec}
    if (xp+dxp=639) and (yp+dyp=479) then
    begin beep;	koniec:=true end;

  until koniec;

  closegraph;
end.{koniec pogramu}