Serpe

Serpe è un clone del celebre snake, che gira sotto DOS. E’ tuttora compilabile ed eseguibile tramite l’utility Turbo Pascal (With DOSBox) e con il codice sorgente (zippato) a questo link.

Turbo Pascal (Pascal) è stato il mio primo linguaggio di programmazione. Programmai questo gioco a 16 anni, dal 12/02/2000 al 11/03/2000; per realizzarlo sono sufficienti le nozioni di procedure, cicli e vettori.

Il codice sorgente sottostante ha codifica convertita da MS Codepage a UTF8, per visualizzare correttamente i caratteri, quindi non è compilable con un semplice copia/incolla

Program serpe;
uses crt;
var x,y: array[1..4000] of integer;
    xl,vel,xx,yy,f:integer;
    j,i,i1,h,g,long,vite,punti:integer;
    control,xf,yf,del: integer;
    xf1,yf1: array[1..150] of integer;
    t,temp,risp,a:char;
    perc:integer;
    col1,col2,d,opp,ntas,sc,timer: integer;
    caso,c,len:integer;

procedure menus;    {visualizza il menu}
begin
   clrscr;
   textcolor(7);
   gotoxy(20,2);
   write('╔');
   gotoxy(60,2);
   write('╗');
   gotoxy(20,12);
   write('╚');
   gotoxy(60,12);
   write('╝');
   gotoxy(21,2);
   for j:=1 to 3 do begin
   if j=1 then gotoxy(21,2);
   if j=2 then gotoxy(21,4);
   if j=3 then gotoxy(21,12);
   for i:=1 to 39 do
      begin
         write('═');
      end;
   end;
   for j:=1 to 2 do begin
   if j=1 then xx:=20;
   if j=2 then xx:=60;
   for i:=3 to 11 do begin
      gotoxy(xx,i);
      writeln('║');
      end;
   end;
   gotoxy(20,4);
   write('╠');
   gotoxy(60,4);
   write('╣');
   gotoxy(30,3);
   textcolor(4);
   write('      M.E.N.U');
   textcolor(7);
   for i:=1 to 4 do
   begin
      gotoxy(24,i+5);
      case i of
         1: write('             Gioco');
         2: write('             Regole');
         3: write('             Storia');
         4: write('             Uscire  ');
      end;
   end;
   sc:=1;
   yy:=6;
   repeat
      gotoxy(21,yy); write('->'); {visualizza le due freccette}
      gotoxy(58,yy); write('<-');
      gotoxy(21,yy-1); write('  '); gotoxy(21,yy+1); write('  ');{ cancella le freccette precedenti}
      gotoxy(58,yy-1); write('  '); gotoxy(58,yy+1); write('  ');
      gotoxy(1,50);
      t:=readkey;
      case t of {analizza la 't' se si preme 'su' yy=yy-1, se si preme 'giu' yy=yy+1}
      #80: if yy<10 then begin yy:=yy+1; sc:=sc+1; end;
      #72: if yy>5 then  begin yy:=yy-1; sc:=sc-1; end;
      end;
      if yy=10 then begin yy:=6; sc:=1; {se yy=10 le freccette tornano su}
         gotoxy(21,9); write('  '); gotoxy(58,9); write('  ');   end;
      if yy=5 then begin yy:=9; sc:=4;  {se yy=5 le freccette tornano giù}
         gotoxy(21,6); write('  '); gotoxy(58,6); write('  '); end;
   until t=#13;    {finchè non si preme invio}
End;

procedure present; {visualizza la presentazione}
Begin
   randomize;
   repeat
   col1:=random(15);
   col2:=random(15);
   until (col1>0)and(col2>0);
   textcolor(col1);
   d:=20;
   gotoxy(23,10); write('   ▒▒');
   delay(d);
   gotoxy(23,11); write('  ▓  ');
   delay(d);
   gotoxy(23,12); write(' ▓   ');
   delay(d);
   gotoxy(23,13); write(' ▓   ');
   delay(d);
   gotoxy(23,14); write(' ▓   ');
   delay(d);
   gotoxy(23,15); write(' ░▓  ');
   delay(d);
   gotoxy(23,16); write('   ▓ ');
   delay(d);
   gotoxy(23,17); write('    ▓                         ▓▓░');
   delay(d);
   gotoxy(23,18); write('     ▓                 ▓▓▓   ▓  ▓');
   delay(d);
   gotoxy(23,19); write('      ▓   ░▓▓▓  ▓     ▓   ▓ ▓   ▓');
   delay(d);
   gotoxy(23,20); write('       ▓ ░▓   ▓ ▓  ▓▓ ▓    ▓▓  ▓');
   delay(d);
   gotoxy(23,21); write('        ▓▓░  ▓  ▓ ▓   ▓    ▓▓▓▓');
   delay(d);
   gotoxy(23,22); write('        ▓▓▓▓▓   ▓▓    ▓    ▓░▓░');
   delay(d);
   gotoxy(23,23); write('         ▓░     ░▓    ▓   ▓  ▓░');
   delay(d);
   gotoxy(23,24); write('         ▓▓     ░▓    ░▓ ▓    ▓▓');
   delay(d);
   gotoxy(23,25); write('         ▓ ▓     ▓     ▓▓       ▓▓▓');
   delay(d);
   gotoxy(23,26); write('         ▓  ▓          ▓');
   delay(d);
   gotoxy(23,27); write('         ▓   ▓▓▓       ▓');
   delay(d);
   gotoxy(23,28); write('        ▓              ▓');
   delay(d);
   gotoxy(23,29); write('       ▓▓              ▓');
   delay(d);
   gotoxy(23,30); write('       ▓               ▓');
   delay(d);
   gotoxy(23,31); write('      ▓');
   delay(d);
   gotoxy(23,32); write('     ▓');
   delay(d);
   gotoxy(23,33); write('   ▓▓');
   delay(d);
   gotoxy(23,34); write('  ▓');

   textcolor(col2);
   gotoxy(50,29); write('Pascal - versione 3.5 (beta) -');
   gotoxy(55,30); write('          freeware');

   textcolor(7);
   gotoxy(55,1); write('             jack 2000');

   gotoxy(1,50); write('< press enter >');
end;

procedure loading;    {visualizza la barra di caricamento}
begin
textmode(c80+256);
clrscr;
gotoxy(20,19); write('                LOADING ... ');
gotoxy(23,20); write('╔');
gotoxy(23,21); write('║');
gotoxy(23,22); write('╚');
gotoxy(24,21); write('');
gotoxy(57,20); write('╗');
gotoxy(57,21); write('║');
gotoxy(57,22); write('╝');
for J:=1 to 2 do
   begin
      if J=1 then gotoxy(24,20);
      if J=2 then gotoxy(24,22);
      for I:=1 to 33 do
         begin
            write('═');
         end;
   end;
perc:=0;
xl:=23;
gotoxy(24,21);
textcolor(12);
for j:=1 to 33 do begin
write('░'); end;
repeat
   perc:=perc+3;
   xl:=xl+1;
   gotoxy(xl,21);
   textcolor(12);
   write('█');
   gotoxy(1,21);
   gotoxy(53,19);
   if perc <= 100 then textcolor(15); write(perc,'%'); gotoxy(51,19); delay(40);
until xl=56;
end;


procedure storia; begin {visualizza la storia}
clrscr;
writeln;
writeln;
writeln('Questo gioco nasce dalla fervida intelligenza di jack riparelli ');
writeln('che dopo 5 minuti di pesante studio sugli array (vettori) ha realizzato il');
writeln('progetto (scrivendo le basi del codice sorgente) di quello che sarà destinato');
writeln('a diventare il più bellissimo gioco realizzato in TP7.0...');
writeln('La realizzazione del presente gioco è avvenuta in più fasi :');
writeln;
writeln('12/02/00 : MI VIENE l''idea di ''serpe''...partendo dal famoso ''SNAKE''');
writeln;
writeln('12/02/00 sera (e giorni seguenti): mi schcervello su come spezzare il serpente ');
writeln('                                   dove VOGLIO io');
writeln;
writeln('16(e seguenti)/02/00 : mi ricordo che a scuola ABBIAMO FATTO gli array e mi ');
writeln('                       dico C**** ma che C****TA come ho fatto a non pensarci');
writeln('                       prima; la sera ricevo la classica telefonata  da Sacco ');
writeln('                       e gli do la buona notizia (per farlo ingelosire)...');
writeln;
writeln('21/02/00 : metto il ''cibo'' per il serpe e RIESCO A FARLO ALLUNGARE ');
writeln;
writeln('22(e seguenti)/02/00 : sistemo il lavoro già realizzato e lo abbelisco (cornice');
writeln('                        colori ecc...)');
writeln;
writeln('23/02/00 : aggiungo la (fantastica) presentazione ');
writeln;
writeln('23++/02/00: aggiungo abbellimenti e annullo qualche BUG (quali il serpente che ');
writeln('            torna indietro ecc...)');
writeln;
writeln('06/03/00 : sto scrivendo questo c**** di menu solo pechè mi è venuta l''idea ');
writeln('           di fare un menu in cui si possano scegliere le funzioni con i tasti');
writeln('           direzionali...ed in più è un ulteriore abbellimento...');
writeln;
writeln('11/03/00 : versione quasi perfetta; i Bug rimasti sono quasi irrilevanti ');
writeln;
writeln('I BUG ANCORA PRESENTI: ');
writeln('1. quando si perde una vita è possibile che il serpente si ''blocchi''');
writeln;
writeln('2. la prima mossa non è ''testata'' nel senso che se premete un tasto che non');
writeln('    è di quelli direzionali, compaiono delle imperfezioni...e perdete un vita!!');
writeln;
writeln;
textcolor(15);
writeln('            DEDICATO A TUTTI GLI SMANETTATORI ALLE PRIME ARMI ');
writeln;
textcolor(7);
writeln('RISORSE IMPIEGATE:');
writeln('                 un bicchire di caffè-latte freddo con zucchero e una ');
writeln('                 crostatina mulino bianco per ogni seduta di programmazione ');
writeln('                 (n''a meraviglia  per il palato!!)');
writeln;
write('<< invio >>');
repeat
for i:=1 to 5 do begin
delay(vel+50);
gotoxy(28,1);
if i=1 then write('----> HISTORY <----'); {a seconda del valore di 'i'}
if i=2 then write('--->  HISTORY  <---'); {sceglie cosa visualizzare}
if i=3 then write('-->   HISTORY   <--'); {dando l'impressione che le}
if i=4 then write('->    HISTORY    <-'); {frecciette si muovano}
if i=5 then write('>     HISTORY     <');
gotoxy(1,50);
end;
until keypressed; {finchè non si preme un tasto qualsiasi}
readln;
end;

procedure regole; begin  {visualizza le regole}
clrscr;
writeln;
writeln;
writeln('IL gioco è molto semplice: devi prendere i quadratini TURCHESE,');
writeln('ogni quadratino TURCHESE preso corrisponde ad un punto in più.');
writeln('i quadratini ROSSI SCURO fanno perdere una vita !! quelli ROSSO');
writeln('CHIARO NO, ma meglio non mangiarli lo stesso...');
writeln('Il serpente muore quando 1. si attorciglia su se stesso');
writeln('                         2. si va a sbattere sulla cornice');
writeln;
writeln('Il gioco non ha fine...bisogna fare solo punti (forse più avanti la metterò');
writeln('una fine...FORSE) IL mio massimo di punti è stato 67... provate a battermi');
writeln;
writeln;
writeln;
writeln('se il gioco vi piace (o non) mandate commenti a :');
writeln('                                                   jacquesr@tiscalinet.it');
writeln;
writeln('** mandate commenti anche per qualsiasi altra ragione: fa sempre piacere');
writeln('   ricevere posta (mandate suggerimenti...) **');
gotoxy(1,49); write('<< invio >>');
repeat
for i:=1 to 5 do begin
delay(vel+50);
gotoxy(28,1);
if i=1 then write('----> RULES <----'); {a seconda del valore di 'i'}
if i=2 then write('--->  RULES  <---'); {sceglie cosa visualizzare}
if i=3 then write('-->   RULES   <--'); {dando l'impressione che le}
if i=4 then write('->    RULES    <-'); {frecciette si muovano}
if i=5 then write('>     RULES     <');
gotoxy(1,50);
end;
until keypressed;
readln;
end;


procedure food;
label 1; {imposto il 'label' per poter poi unsare la funzione 'goto'}
begin
long:=long+2;  {il serpente si allungo di 2 se si mangia il quadratino blu}
textcolor(3);
1:  {quì inizia il label per il goto}
repeat {ripete la scelta del posizionamento del quadratino blu}
randomize;
xf:=random(79);
yf:=random(45);
until (yf>1)and(xf>1);{finchè le due coordinate 'yf' e 'xf' sono maggiori di 1}
                      {questo evita che il 'food' vada a finire sulla cornice}
 for g:=1 to long do {questo ciclo controlla che il 'food' creato non sia andato}
         begin       {a finire sul serpente}
            if (xf=x[i-g])and(yf=y[i-g]) then
               goto 1; {se il 'food' è andato a finire sul serpente torna a label 1}
end;                   { e crea così un nuovo 'food'}
for g:=1 to f-1 do begin {se il 'food' è andato a finire su un quadratino rosso già presente sullo schermo}
if (xf=xf1[g])and(yf=yf1[g]) then goto 1;{ crea un nuovo 'food' andando a label 1}
end;
gotoxy(xf,yf); write('■'); {dopo tutti i contrlli scrive il quadratino blù}
end;

procedure food_no;
label 1;
begin
f:=f+1;
textcolor(12);
1:
repeat {vedere procedura food per capire a cosa servono i cicli sottostanti}
xf1[f]:=random(79);
yf1[f]:=random(45);
until (xf1[f]>1)and(yf1[f]>1);
for g:=1 to long do
         begin
            if (xf1[f]=x[i-g])and(yf1[f]=y[i-g]) then
            begin
               goto 1;
            end;
end;
for g:=1 to f-1 do begin
if (xf1[g]=xf)and(yf1[g]=yf) then food_no end;
gotoxy(xf1[f],yf1[f]); write('■');  {visualizza il quadratino rosso}
end;

procedure cornice; {visualizza la cornice}
begin
textcolor(5);
for i:=1 to 80 do begin
gotoxy(i,1); write('█');
gotoxy(i,46); write('█');
end;

for i:=2 to 45 do begin
gotoxy(1,i); writeln('█');
gotoxy(80,i); write('█');
end;
textcolor(2);
gotoxy(1,48); write('  punti= ');
gotoxy(1,49); write('  vite = ');
end;

procedure leggi_tasto;  {legge il tasto premuto e analizza la variabile 't'}
   begin
   temp:=t;
{in tutti i casi seguenti la testa dello snake si muove a seconda di cosa}
{abbiamo premuto, mettendo nuove coordiate agli array di valere 'i'}
{partendo dagli array precedenti 'i-1' (SE AVETE CAPITO BON)}
   if t=#72 then begin opp:=80; y[i]:=y[i-1]-1; x[i]:=x[i-1] end
   else if t=#80 then begin opp:=72; y[i]:=y[i-1]+1; x[i]:=x[i-1]  end
   else if t=#75 then begin opp:=77; x[i]:=x[i-1]-1; y[i]:=y[i-1]  end
   else if t=#77 then begin opp:=75; x[i]:=x[i-1]+1; y[i]:=y[i-1]  end;
   end;

procedure no_tasto; begin
{vale lo stesso discorso di prima, ma la variabile 't' è sostituita da 'temp'}
{come si può dedurre (PER CHI E' INTELLIGENTE) dal nome, 'temp' ha il calore}
{di movimento di 't' precedente quindi il serpente, se non si preme alcun}
{tasto, andrà sempre verso la stessa direzione}
   if temp=#72 then begin opp:=80; y[i]:=y[i-1]-1; x[i]:=x[i-1] end
   else if temp=#80 then begin opp:=72;  y[i]:=y[i-1]+1; x[i]:=x[i-1]  end
   else if temp=#75 then begin opp:=77;  x[i]:=x[i-1]-1; y[i]:=y[i-1]  end
   else if temp=#77 then begin opp:=75;  x[i]:=x[i-1]+1; y[i]:=y[i-1]  end;
   end;

procedure mossa_no_tasto; begin
no_tasto
end;

procedure prima_mossa;begin
clrscr;
long:=0;
cornice;
food;
food_no;

repeat           {ripete la scelta casuale della posizione della testa}
x[i]:=random(65);{del serpe}
y[i]:=random(35);
until (x[i]>1)and(y[i]>1); {finchè le coordinate sono maggiori di 1}
textcolor(1);
gotoxy(x[i],y[i]); write('▓'); gotoxy(1,50); {visualizza la testa}
t:=readkey;
leggi_tasto; {analizza il tasto premuto}
end;

procedure mossa; begin
x[i]:=x[i-1]; y[i]:=y[i-1]; {le nuove coordinate con indice 'i' che sono
                             venute a crearsi hanno il valore di 'i-1' prima
                             di essere analizzate -MOLTO IMPORTANTE-}
if (x[i]>1)and(x[i]<80)and(y[i]>1)and(y[i]<46) then begin {se non si ha toccato il bordo, allora...}
repeat
t:=readkey;
if t=#72 then ntas:=72 else
if t=#75 then ntas:=75 else
if t=#80 then ntas:=80 else
if t=#77 then ntas:=77;
if ntas=opp then t:=temp; {se il tasto premuto è 'opp' cioè l'opposto della
                        direzione del sepente...il serpente non cambia movimento
                        perchè 't' assume il valore precedente 'temp'}
until (t=#72)or(t=#75)or(t=#77)or(t=#80)or(t=#27);
leggi_tasto; end
else prima_mossa;
end;

procedure visualizza;
begin
textcolor(1);
gotoxy(x[i],y[i]);  write('▓');
textcolor(9);
for h:=1 to long do begin          {per tutta la lunghezza del serpente...}
gotoxy(x[i-h],y[i-h]); write('▒'); {scrive '▒', con l'ausilio degli array...}
if (x[i]=x[i-h])and(y[i]=y[i-h]) then vite:=vite-1;{mantiene memorizzate le vecchie coord.}
end;
gotoxy(x[i-h-1],y[i-h-1]); write(' ');{quando arriva alla fine non scrive niente e il serpente si spezza}
{il resto lo capite anche da soli (è intuitivo)}
if (x[i]=xf)and(y[i]=yf) then begin punti:=punti+1; gotoxy(10,48); write(punti:4); food; end;
if i mod 100 =0 then food_no;
gotoxy(10,49); textcolor(14); write(vite:3);
gotoxy(1,50); timer:=3990-i; textcolor(10);
if timer mod 10=0 then begin
write(' bonuz =  '); textcolor(12);write('-',timer:4); end;
gotoxy(1,50);
delay(vel);
end;

procedure programma;
begin
i:=i+1;
j:=j+1;
if keypressed then control:=1;
if j=1 then prima_mossa else
if control=1 then mossa
else  mossa_no_tasto;
visualizza;
control:=0;
end;

procedure morso; begin
gotoxy(60,49);
write(' ...( invio )...');
if t=#27 then halt;
end;

procedure test; begin
   textmode(c80+256);
   gotoxy(2,6); write('╔');
   gotoxy(2,7); write('║');
   gotoxy(2,8); write('╚');
   gotoxy(78,6); write('╗');
   gotoxy(78,7); write('║');
   gotoxy(78,8); write('╝');
   for j:=1 to 2 do begin
         if j=1 then gotoxy(3,6);
         if j=2 then gotoxy(3,8);
         for i:=1 to 75 do begin
               write('═');
            end;
            end;
   gotoxy(1,20); write('Questa schermata serve per regolare la velocità del');
   gotoxy(1,21); write('gioco dato che il Pascal (il linguaggio di');
   gotoxy(1,22); write('programmazione con cui è stato concepito questo gioco)');
   gotoxy(1,23); write('ha una regolazione ambigua del tempo di attesa...');
   gotoxy(1,25); write('** anche se non avete capito poco importa...eh eh **');
   gotoxy(1,28); write('SPIEGAZIONE: ');
   gotoxy(1,30); write('1. premere INVIO');
   gotoxy(1,32); write('2. digitare un numero POSITIVO per aumentare la velocità');
   gotoxy(1,33); write('                      NEGATIVO per diminuirla');
   gotoxy(1,35); write('3. (se possedeta l''apparato...visivo) GUARDATE la');
   gotoxy(1,36); write('    stangetta che si muove... ohhhh che bella!!');
   gotoxy(1,38); write('4. CONDIZIONE NECESSARIA E SUFFICENTE per uscire da cotesta');
   gotoxy(1,39); write('   UTILITY (la mia prima utility...sigh!! che emozione) è');
   gotoxy(1,40); write('   QUANDO la stanghetta ha raggiunto una velocità che vi ');
   gotoxy(1,41); write('   sembri...giustamente lenta (capito?)');
   gotoxy(1,43); write('5. per uscire premere INVIO, poi lo 0, e poi ancora INVIO...');
   gotoxy(1,44); write('   non è tanto difficile ce la potete fare...bho!');
   textcolor(4);
   gotoxy(1,46); write('** OSSERVAZIONI **');
   gotoxy(1,48); write('Una volta insrito un valore se ne inserite un altro, questo si somma al');
   gotoxy(1,49); write('precedente; //esempi di POSSIBILI valori per  diversi processori:');
   gotoxy(1,50); write('P 133-250 valore:30 o + / celeron-PIII valore: -1700 ');
   yy:=7;
   xx:=3;
   del:=30;
   repeat
   repeat
   if xx=3 then temp:=#77;
   if xx=72 then temp:=#75;
   if temp=#75 then begin opp:=77;  xx:=xx-1; yy:=yy end
   else if temp=#77 then begin opp:=75;  xx:=xx+1; yy:=yy  end;
   textcolor(9);
   gotoxy(xx,yy);     write(' ████ ');
   gotoxy(1,50);
   if keypressed then
   t:=readkey;
   delay(del);
   until keypressed;
   gotoxy(1,15);
   write('inserire decremento o incremento (0 per uscire) ');
   read(len);
   len:=-len;
   del:=del+(len);
   for j:=1 to 2 do begin
   if j=1 then gotoxy(1,15);
   if j=2 then gotoxy(1,16);
   for i:=1 to 60 do begin
   write(' '); end; end;
   until len=0;
   vel:=del;
   readln;
end;

procedure richiesta; begin
clrscr;
textcolor(9);
writeln('             SI DESIDERA FARE IL TEST DELLA VELOCITA'' (consigliato) ?');
textcolor(7);
textcolor(4);
gotoxy(35,6); write('si');
gotoxy(35,7); write('no');
textcolor(7);
sc:=1;
   yy:=6;
   repeat
      gotoxy(28,yy); write('->');
      gotoxy(43,yy); write('<-');
      gotoxy(28,yy-1); write('  '); gotoxy(28,yy+1); write('  ');
      gotoxy(43,yy-1); write('  '); gotoxy(43,yy+1); write('  ');
      gotoxy(1,50);
      t:=readkey;
      case t of
      #80: if yy<7 then begin yy:=yy+1; sc:=sc+1; end;
      #72: if yy>6 then  begin yy:=yy-1; sc:=sc-1; end;
      end;
   until t=#13;
end;

procedure gioco; begin
loading;
punti:=0;
j:=0;
i:=0;
vite:=3;
f:=0;
repeat
   repeat
      programma;
      if t=#27 then halt;
      for g:=1 to long do            {questo ciclo analizza se il serpente si morde la cosa}
         begin
            if (x[i]=x[i-g])and(y[i]=y[i-g]) then
            begin
               if vite=0 then
               repeat
                  clrscr;
                  textcolor(7);
                  menus;
                  case sc of
                     2: regole;
                     3: storia;
                     4: halt;
                     1: gioco;
                 end;
               until sc=4;
               morso;
               j:=0;
               f:=0;
               programma;
            end;
      end;

   for g:=1 to f-1 do begin
   if (x[i]=xf1[g])and(y[i]=yf1[g]) then begin
      vite:=vite-1; gotoxy(10,48); write(punti:4);
      j:=0; f:=0; if vite=0 then begin
      gotoxy(10,49); textcolor(14); write('  0');
      gotoxy(60,49); write('< invio >');
      readln;
      menus;
      case sc of
      2: regole;
      3: storia;
      4: halt;
      1: gioco; end; end
      else
      programma; end;
   end;
   for g:=1 to f-1 do begin
   gotoxy(xf1[g],yf1[g]); textcolor(4); write('■'); end;
   until (vite<1)or(x[i]=1)or(x[i]=80)or(y[i]=1)or(y[i]=46) or(i=3990);
   if i=3990 then vite:=vite+2;

   if vite<=1 then begin
      repeat
         cornice;
         gotoxy(60,49);
         write('< invio >');
         readln;
         clrscr;
         textcolor(7);
         menus;
         case sc of
         2: regole;
         3: storia;
         4: halt;
         1:  gioco;
         end;
      until sc=4;
      end
       else
              clrscr;
              cornice;
              food;
              food_no;
              long:=3;
              j:=0;
              f:=0;
              vite:=vite-1;
              programma;
until risp='n';
end;

begin
clrscr;
textmode(c80+256);
present;
readln;
richiesta;
if sc=1 then test else vel:=50;
repeat
clrscr;
menus;
case sc of
2: regole;
3: storia;
4: halt;
1:  gioco;
end;
until sc=4;
readln;
end.