Potrebné vedomosti:
Načítavanie znakov z klávesnice
Na načítanie znakov máme v pascale 2 príkazy
readln, read
- umožňuje načítať neriadiace znaky
- neumožní načítať napr. backspace, escape, F1-F12, Home, kurzorové šipky
- vyžaduje na konci vstupu Enter
- klepnutý znak sa zobrazí na obrazovke
readkey
- umožní načítať ľubovoľný znak
- nevyžaduje Enter
- načítavaný znak nie je zobrazený na obrazovke
Pre animáciu je vhodný readkey, lebo "nepočarbe" obrazovku a nežiada Enter.
Ošetrenie klávesnice
Každý vstup implicitne zastaví beh programu (čiže aj naša animácia by sa zastavila) aby sme tomu zabránili musíme príkaz vstupu volať len vtedy, keď je niečo na vstupe už načítané. V tomto prípade program na príkaze vstupu nezastane, ale si zoberie vstupne dáta a beží ďalej. Ešte zostáva "prezradiť" príkaz, ktorý zistí či sme niečo na klávesnici klepali. Je to príkaz - funkcia readkey: Boolean. Táto logická funkcia vráti TRUE, ak sú nejaké vstupné dáta a FALSE v opačnom prípade.
Načítavanie kurzorových kláves
Kurzorové šípky patria ku dvojznakom, teda ich stlačenie je ekvivalentné zadaniu dvoch znakov. Prvý znak je vždy nula a všetky dvoznaky sa líšia len v druhom znaku.
hore - #0#72
vľavo - #0#75
vpravo - #0#77
dole - #0#80

Ako zistím, ktorý kláves bol stlačený:
		if keypressed then    {ak bolo niečo stlačemé} 
		Begin
		  z:=readkey;         {načítam ten znak}
		  if z=#0 then        {ak je to nulový znak}
		  Begin
		    z:=readkey;       {po nulovom znaku predpokladám druhý znak}
			case z of
			#72: writeln('stlacil si hore');
			#75: writeln('stlacil si vlavo');
			#77: writeln('stlacil si vpravo');
			#80: writeln('stlacil si dole');
			end;
		  End;
		End;
		

Úloha1 - pohyb 1 znaku na obrazovke riadený užívateľom pomocou kurz. šipiek. Každé stlačenie šipky posunie znak v žiadanom smere.
Var x,y:integer;
    z:char;
Begin
  x:=40; y:=10; {pociatocne suradnice}
  gotoxy(x,y);write('*');
  repeat
    if keypressed then    {ak bolo niečo stlačemé}
    Begin
      z:=readkey;         {načítam ten znak}
      if z=#0 then        {ak je to nulový znak}
      Begin
        z:=readkey;       {po nulovom znaku predpokladám druhý znak}
        gotoxy(x,y);write(' ');
        case z of
          #72: if y>1 then dec(y);
          #75: if x>1 then dec(x);
          #77: if x<80 then inc(x);
          #80: if y<24 then inc(y);
        end;
        gotoxy(x,y);write('*');
    End;
  until z=#27;
End.
Kto chce vidieť ukážku, tu sa dá stiahnuť

Úloha2 - pohyb 1 znaku na obrazovke riadený užívateľom pomocou kurz. šipiek. Po stlačení šipky sa znak vydá daným smerom až po zadanie nového smeru.
uses crt;
Var dx,dy,x,y:integer;
    z:char;
Begin
  x:=40; y:=10;
  dx:=0; dy:=0;{pociatocne suradnice a zmeny}
  gotoxy(x,y);write('*');
  repeat
    if keypressed then    {ak bolo niečo stlačemé}
    Begin
      z:=readkey;         {načítam ten znak}
      if z=#0 then        {ak je to nulový znak}
      Begin
        z:=readkey;       {po nulovom znaku predpokladám druhý znak}
        case z of
          #72: begin dy:=-1;dx:= 0; end; {menit sa bude y o -1}
          #75: begin dy:= 0;dx:=-1; end;
          #77: begin dy:= 0;dx:=+1; end;
          #80: begin dy:=+1;dx:= 0; end;
        end;
      End;
	end;  
    gotoxy(x,y);write(' '); {tu znak zotriem} 
    x:=x+dx; y:=y+dy;       {vypocitam nove suradnice}   
    if (x=0) or (x=81) or (y=0) or (y=25) then z:=#27 {ak vzbehne z obrazu - koniec}
    else
    begin
      gotoxy(x,y);write('*'); {na nove miesto nakreslim}
      delay(100);             {aby aj ti pomalsi mali sancu}
    end
  until z=#27;
End.
Kto chce vidieť ukážku, tu sa dá stiahnuť

Úloha3 - pohyb 1 znaku na obrazovke je nemažúci - obrazovka sa nemaže.

Na obrazovku umiestnime pole A o 25-tich riadkoch, 80-tich stlpcoch pomocou direktívy absolute. Každá zmena obrazovky sa automaticky zapisuje do poľa A a každá zmena poľa A sa premietne na obrazovku. Pred položením znaku odložíme znak do premennej zz.
Taktika položenia pola na obrazovku je výhodná, lebo pri pohybe objektu po obrazovke ľahko detekujeme prekážky pred sebou.
Na začiatku je obrazovka náhodne počarbaná.
uses crt;
Var A:array[1..25,1..80,1..2] of char absolute $b800:0;
    dx,dy,i,x,y:integer;
    z,zz:char;
    Begin
      textcolor(0);
      clrscr;
      for i:=1 to 10 do
      begin
        x:=random(50+1); y:=random(15)+1;
        window(x,y,x+1+random(80-x),y+1+random(25-y));
        textbackground(random(14)+1);
        clrscr;
      end;
      window(1,1,80,25);
      for i:=1 to 80 do
      begin
       a[random(16)+5,random(70)+5,1]:=char(random(26)+65);
      end;
      x:=40; y:=10;
      dx:=0; dy:=0;{pociatocne suradnice a zmeny}
      zz:=a[y,x,1];
      a[y,x,1]:='*';  {gotoxy(x,y);write('*'); }
      repeat
        if keypressed then    {ak bolo niečo stlačemé}
        Begin
          z:=readkey;         {načítam ten znak}
          if z=#0 then        {ak je to nulový znak}
          Begin
            z:=readkey;       {po nulovom znaku predpokladám druhý znak}
            case z of
            #72: begin dy:=-1;dx:= 0; end; {menit sa bude y o -1}
            #75: begin dy:= 0;dx:=-1; end;
            #77: begin dy:= 0;dx:=+1; end;
            #80: begin dy:=+1;dx:= 0; end;
            end;
          End;
        End;
        a[y,x,1]:=zz;   {gotoxy(x,y);write(' '); tu znak zotriem}
        x:=x+dx; y:=y+dy;       {vypocitam nove suradnice}
        if (x=0) or (x=81) or (y=0) or (y=25) then z:=#27 {ak vzbehne z obrazu
        else
        begin
          zz:=a[y,x,1];
          a[y,x,1]:='*';   {gotoxy(x,y);write('*'); na nove miesto nakreslim}
          delay(100);             {aby aj ti pomalsi mali sancu}
        end;
      until z=#27;
End.
Kto chce vidieť ukážku, tu sa dá stiahnuť
Jak rozbehať po obrazovke "hada"
Pohyb bude robený kresbou novej hlavy pred červa a zotretie posledného článku červa.
Budeme k tomu potrebovať:
pole HAD[1..maxDlzka,1..2] kde budú zapísané súradnice článkov hada vlastne skôr červa.
pole LUKA[1..MaxX,1..MaxY] kde bude zapísaný aktuálny stav hracieho pola bude položené na obrazovke
premenná DLZKA, kde bude zapísaná aktuálna dĺžka červa

A teraz ako bude vyzerať program
1. Inicializácia
- vykreslí zelenú lúku (odporucam používať 40 stĺpcový mód obrazovky Co40 - TextMode(Co40))
- postaví plot okolo lúky (napr. znaky #186,#205,#187,#188,#200,#201) aby nam červík neušiel z obrazovky.
- vytvorí hlavu červa v poli HAD
- zakreslí hlavu červa do LUKA (napr. znak #16)
- vytvorí ďalšie články hada v poli HAD i LUKA (napr. znak 'O' #177)
- zakreslí p1 žltých kvetín (napr znak #5)
- zakreslí p2 červených kvetín (napr. znak #6)
2. Pohyb červa
- zistenie nových súradníc hlavy
- zistenie aké je nové políčko (prázdne, kvet, plot, červíkov článok,...)
- posun článkov v poli HAD (premysli, či sa políčka posunú doľava alebo doprava)
- vytvorenie novej hlavy v poli HAD, kresba hlavy na LUKA
- zotretie políčka, z ktorého odišiel posledný článok (ak sme nezjedli kvet)
uses crt;
Var A:array[1..25,1..80,1..2] of char absolute $b800:0;
    had: array[1..100, 1..2] of byte;
    uroven,pz,x,y,dlzka,i,p1,p2: byte;
    z:char;
    cas:integer;
const prazdne=' ';
      kvet1= #5;
	  kvet2=#6;
	  stena1=#185;
	  stena2=#205;
	  telo=#177;
	  hlava=#220;

Function  pohyb(novex, novey: byte): Boolean;
var i: byte;
Begin
  dec(cas);
  case A[novey, novex, 1] of
  prazdne: Begin
             for i:=dlzka downto 1 do had[i+1]:=had[i]; {kazda bunka cervika ide dopredu}
             a[had[1,2], had[1,1], 1] :=telo;
             had[1,1]:=novex; had[1,2]:=novey; {este zapisem nove suradnice hlavy}
             A[novey, novex, 1]:=hlava; {a nakreslim hlavu}
             a[had[dlzka+1,2], had[dlzka+1,1], 1] :=prazdne; {zotriem odidenu posl bunku}
             pohyb:=TRUE;
           End;
  kvet1,kvet2:Begin
             inc(pz);
             for i:=dlzka downto 1 do had[i+1]:=had[i]; {kazda bunka cervika ide dopredu}
             a[had[1,2], had[1,1], 1] :=telo;
             had[1,1]:=novex; had[1,2]:=novey; {este zapisem nove suradnice hlavy}
             A[novey, novex, 1]:=hlava; {a nakreslim hlavu}
             inc(dlzka); {zvacsim dlzku cerva}
             pohyb:=TRUE;
              End;
  stena1,stena2, telo:Begin
                      a[had[1,2], had[1,1], 1] :=telo;
                      a[novey, novex, 1]:=hlava;
                      pohyb:=FALSE;
                      End;
  end;
             gotoxy(10,24); write('Pocet kvetov:',p1+p2, '   este zostava zjest:',p1+p2-pz:3,'   este mas cas:', cas );
End;

Begin
  pz:=0;uroven:=1;
  p1:=10; p2:=10;cas:= 500;
  {***********namalujem ihrisko***********}
  textmode(co80);
  textcolor(14);
  textbackground(green);
  clrscr;
  gotoxy(10,24); write('Pocet kvetov:',p1+p2, '   este zostava zjest:',p1+p2-pz:3,'   este mas cas:', cas );
  dlzka:=10;
  for i:=1 to dlzka do
  begin
    had[i,1]:=31-i; had[i,2]:=10;
    a[10,31-i,1]:=telo;
  end;
  a[10,30,1]:=hlava;
  {************zasadim kvietky***************}
  i:=1;
  repeat
    x:=random(78)+1;
    y:=random(20)+1;
    if a[y,x,1]=' ' then
    begin
      gotoxy(x,y); write(kvet1);
      inc(i);
    end;
  until i=11;
  textcolor(red);i:=1;
  repeat
    x:=random(78)+1;
    y:=random(20)+1;
    if a[y,x,1]=' ' then
    begin
      gotoxy(x,y); write(kvet1);
      inc(i);
    end;
  until i=11;

  repeat
  if keypressed then  z:=readkey;
  if z=#0 then  z:=readkey;
  case z of
            #72: if not pohyb(had[1,1],had[1,2]-1) then z:=#27;
            #75: if not pohyb(had[1,1]-1,had[1,2]) then z:=#27;
            #77: if not pohyb(had[1,1]+1,had[1,2]) then z:=#27;
            #80: if not pohyb(had[1,1],had[1,2]+1) then z:=#27;
  end;
  delay(100);
  until (z=#27);
  gotoxy(30,15);
  if p1+p2>0 then write(' P R E H R A L   S I')
             ELSE WRITELN('G R A T U L U J E M');
  READLN;
End.
Kto chce vidieť ukážku, tu sa dá stiahnuť