Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Battaglia Navale - navalWar1.3.PAS

navalWar1.3.PAS

Caricato da: AndRyu
Scarica il programma completo

  1. program navalwar; { AndRyu }
  2. uses crt;
  3. const max=8;
  4. type dimens=1..max;
  5.      cel=array[dimens,dimens] of char;
  6.      cell=^cel;                 {       le varie tavole:         }
  7. var  avvcolp,avvocc,mytab:cell; { colpite, occupate e la propria }
  8.      lv,ap:byte; { livello difficolt… e var di appoggio }
  9.      pr:char; { var globale per la lettura dei tasti }
  10.      vero:boolean; { usata per il posizionamento navi }
  11. procedure esc;  { chiusura puntatori e arresto del programma, se premi esc }
  12. begin
  13.    if pr=#27 then
  14.       begin
  15.       dispose(avvocc);
  16.       dispose(avvcolp);
  17.       if lv<>0 then
  18.          dispose(mytab);
  19.       textcolor(15);
  20.       textbackground(0);
  21.       halt
  22.       end
  23.    else
  24.       if pr=#0 then
  25.          pr:=readkey
  26. end;
  27. procedure iniz(var x:cell); { inizializzazione puntatori }
  28. var i,j:dimens;
  29. begin
  30.    new(x);
  31.    for i:=1 to max do
  32.       for j:=1 to max do
  33.          x^[i,j]:=#126
  34. end;
  35. procedure error;
  36. begin
  37.    sound(264);
  38.    delay(200);
  39.    nosound;
  40. end;
  41. procedure diff;
  42. begin
  43.    textcolor(15);
  44.    textbackground(0);
  45.    clrscr;
  46.    write('Che livello di difficolta'' vuoi? (1=facile,2=medio,3=difficile) ');
  47.    repeat
  48.       pr:=readkey;
  49.       esc
  50.    until (pr>'0') and (pr<'4');
  51.    lv:=12-(ord(pr)-ord('0'))*3
  52. end;
  53. procedure color(c:char);  { controllo del colore }
  54. begin
  55.    case c of
  56.       '*','#':textcolor(red);
  57.       'o':textcolor(3);
  58.       '~':textcolor(lightblue);
  59.    end;
  60. end;
  61. procedure tab(av,my:cell);
  62. var i,j:integer;
  63. procedure orizz; { trattini orizzontali}
  64. var i:integer;
  65. begin
  66.    for i:=1 to 2*max+1 do
  67.       write(' Ä');
  68.    for i:=1 to max do
  69.       write(' ');
  70.    for i:=1 to 2*max+1 do
  71.       write(' Ä');
  72.    writeln
  73. end;
  74. begin  {Procedura Tabella}
  75.    clrscr;
  76.    textcolor(green);
  77.    writeln('BATTAGLIA NAVALE':48); { questi allineamenti sono fatti  }
  78.    textcolor(6);                   { apposta per il mio monitor, Š   }
  79.    write('Flotta Avversaria':27);  { probabile che dovrete cambiarli }
  80.    textcolor(5);                   { provate a fare dei tentativi ;) }
  81.    write('Propria Flotta':40);
  82.    textcolor(yellow);
  83.    writeln;
  84.    write(' ');
  85.    for i:=1 to max do
  86.       write(' | ',i);
  87.    write(' |');
  88.    for i:=1 to max do
  89.       write(' ');
  90.    for i:=1 to max do
  91.       write(' | ',i);
  92.    write(' |');
  93.    writeln;
  94.    textcolor(white);
  95.    orizz;
  96.    for i:=1 to max do
  97.       begin
  98.       textcolor(blue);
  99.       write(i);
  100.       textcolor(white);
  101.       write(' | ');
  102.       for j:=1 to max do
  103.          begin
  104.          color(av^[j,i]);
  105.          write(av^[j,i]);
  106.          textcolor(white);
  107.          write(' | ');
  108.          end;
  109.       for j:=1 to 6 do
  110.          write(' ');
  111.       textcolor(blue);
  112.       write(i);
  113.       textcolor(white);
  114.       write(' | ');
  115.       for j:=1 to max do
  116.          begin
  117.          color(my^[j,i]);
  118.          write(my^[j,i]);
  119.          textcolor(white);
  120.          write(' | ');
  121.          end;
  122.       writeln
  123.       end;
  124.    orizz;
  125.    gotoxy(2,25);
  126.    write('ESCi');
  127.    gotoxy(1,14)
  128. end;
  129. procedure baro; { se si mostra la soluzione }
  130. begin
  131.    clrscr;
  132.    write('Sei un baro? (s/n) ');
  133.    repeat
  134.       pr:=readkey;
  135.       esc
  136.    until (pr='s') or (pr='n') or (pr='S') or (pr='N');
  137.    if (pr='s') or (pr='S') then
  138.       begin
  139.       tab(avvocc,mytab);
  140.       pr:=readkey;
  141.       end;
  142.    esc
  143. end;
  144. procedure pos(var c:cell;var app,ri,co,l:byte;ori:char);
  145. begin  { stabilisce le posizioni }
  146.    if (app=0) and (((max-ri+1<l) and (ord(ori)=1)) or ((max-co+1<l) and (ord(ori)<>1))) then
  147.       vero:=false;
  148.    if (c^[ri,co]<>'#') and vero then
  149.       begin
  150.       if ord(ori)=1 then
  151.          ri:=ri+1
  152.       else
  153.          co:=co+1;
  154.       app:=app+1;
  155.       if app<l then
  156.          pos(c,app,ri,co,l,ori);
  157.       if ord(ori)=1 then
  158.          ri:=ri-1
  159.       else
  160.          co:=co-1;
  161.       if vero then
  162.          c^[ri,co]:='#'
  163.       end
  164.    else
  165.       begin
  166.       vero:=false;
  167.       app:=0
  168.       end
  169. end;
  170. procedure move(tab:cell; x,y:byte;var i,j:byte);
  171. var c:byte;
  172. begin
  173.    repeat
  174.       c:=c+1;
  175.       if c mod 2=0 then
  176.          c:=0
  177.       else
  178.          c:=9;
  179.       color(tab^[i,j]);
  180.       textbackground(c);
  181.       gotoxy(x+i*4,y+j);
  182.       write(tab^[i,j]);
  183.       gotoxy(x+i*4,y+j);
  184.       delay(200)
  185.    until keypressed;
  186.    pr:=readkey;
  187.    esc;
  188.    textbackground(0);
  189.    write(tab^[i,j]);
  190.    case pr of
  191.       #72: j:=j-1;
  192.       #75: i:=i-1;
  193.       #77: i:=i+1;
  194.       #80: j:=j+1;
  195.       end;
  196.    case i of
  197.       9: i:=1;
  198.       0: i:=8
  199.    else
  200.       case j of
  201.          9: j:=1;
  202.          0: j:=8
  203.          end
  204.       end;
  205.    textcolor(15)
  206. end;
  207. procedure mynav; { Posiziona le proprie navi }
  208. const x=43; y=4;
  209. var i,j,c,t,l:byte;
  210.     ori:char;
  211. begin
  212.    repeat
  213.       iniz(mytab);
  214.       i:=1;
  215.       j:=1;
  216.       for l:=2 to 5 do
  217.          begin
  218.          t:=0;
  219.          c:=0;
  220.          repeat
  221.             tab(avvcolp,mytab);
  222.             writeln;
  223.             writeln('Scegli dove posizionare la nave e premi Invio');
  224.             gotoxy(73,25);
  225.             write('Resetta');
  226.             repeat
  227.                gotoxy(54,15);
  228.                write('Nave da ',l,'  (',i,',',j,')');
  229.                move(mytab,x,y,i,j)
  230.             until (pr=#13) or (pr='r') or (pr='R');
  231.             gotoxy(1,15);
  232.             writeln('Premi il tasto destro per disporre in orizzontale');
  233.             writeln('quello giu'' in verticale. Premi invio per confermare');
  234.             ori:=#1;
  235.             if (pr<>'r') and (pr<>'R') then
  236.                repeat
  237.                   gotoxy(55,16);
  238.                   if ori=#0 then
  239.                      write('Verticale  ')
  240.                   else
  241.                      write('Orizzontale');
  242.                   pr:=readkey;
  243.                   esc;
  244.                   case pr of
  245.                       #77: ori:=chr(1);
  246.                       #80: ori:=#0;
  247.                       end
  248.                until (pr=#13) or (pr='r') or (pr='R');
  249.             vero:=true;
  250.             ap:=0;
  251.             pos(mytab,ap,i,j,l,ori);
  252.             if (not vero) and (pr<>'r') and (pr<>'R') then
  253.                error;
  254.             t:=t+ap
  255.          until (t=2) or (t=6) or(t=8) or (t=5) or (pr='r') or (pr='R');
  256.       if (pr='r') or (pr='R') then
  257.          l:=5
  258.       end
  259.    until (pr<>'r') and (pr<>'R') { permette di resettare le navi }
  260. end;
  261. procedure navi(var c:cell); { assegna le posizioni dell'avversario }
  262. var i,j,t,k,ap:byte;
  263. begin
  264.    randomize;
  265.    for k:=2 to 5 do
  266.       begin
  267.       t:=0;
  268.       repeat
  269.          ap:=0;
  270.          vero:=true;
  271.          i:=random(max)+1;
  272.          j:=random(max)+1;
  273.          pr:=chr(random(2));
  274.          pos(c,ap,i,j,k,pr);
  275.          t:=t+ap
  276.        until (t=2) or (t=6) or (t=5) or (t=8);
  277.        end
  278. end;
  279. procedure gioco; { quale settore bombardare e dove vieni bombardato }
  280. const x=1; y=4;
  281. var i,j,c,t:byte;
  282. procedure colrig(var n:integer; sogg:string); { Richiesta Colonna/Riga }
  283. begin
  284.    write(sogg);
  285.    repeat
  286.       pr:=readkey;
  287.       esc
  288.    until (pr>'0') and (pr<'9');
  289.    n:=ord(pr)-ord('0');
  290.    writeln(n)
  291. end;
  292. function perso:boolean; { controllo Perdita }
  293. var i,j:byte;
  294. begin
  295.    perso:=true;
  296.    for i:=1 to max do
  297.       for j:=1 to max do
  298.          if mytab^[i,j]='#' then
  299.             begin
  300.             i:=max;
  301.             j:=max;
  302.             perso:=false
  303.             end
  304. end;
  305. function vinto:boolean; { controllo Vittoria }
  306. var i,j,c:byte;
  307. begin
  308.    c:=0;
  309.    vinto:=false;
  310.    for i:=1 to max do
  311.       for j:=1 to max do
  312.          if (avvocc^[i,j]='#') and (avvcolp^[i,j]='*') then
  313.             begin
  314.             c:=c+1;
  315.             if c=21 then
  316.                begin
  317.                vinto:=true;
  318.                i:=max;
  319.                j:=i
  320.                end
  321.             end
  322. end;
  323. procedure colpito(a,b:integer); {Sottoprocedura di controllo Colpito}
  324. begin
  325.    if avvocc^[a,b]='#' then
  326.       begin
  327.       avvcolp^[a,b]:='*';
  328.       write('Hai colpito una nave!');
  329.       end
  330.    else
  331.       begin
  332.       avvcolp^[a,b]:='o';
  333.       write('Hai fatto un buco nell''acqua!');
  334.       end
  335. end;
  336. procedure pcatk(c:byte); { attacco del pc }
  337. var i,j:byte;
  338. begin
  339.    repeat
  340.       i:=random(max)+1;
  341.       j:=random(max)+1;
  342.       if (mytab^[i,j]<>'*') and (mytab^[i,j]<>'o') then
  343.          if mytab^[i,j]='#' then
  344.             begin
  345.             mytab^[i,j]:='*';
  346.             writeln('Il tuo avversario spara in (',i,',',j,')');
  347.             write('Sei stato colpito!');
  348.             pr:='o'
  349.             end
  350.          else
  351.             if c mod lv<>0 then
  352.                begin
  353.                mytab^[i,j]:='o';
  354.                writeln('Il tuo avversario spara in (',i,',',j,')');
  355.                write('Ha fatto un buco nell''acqua!');
  356.                pr:='o'
  357.                end
  358.    until pr='o';
  359.    pr:=readkey;
  360.    esc
  361. end;
  362. begin   { procedura gioco }
  363.    t:=0;
  364.    i:=1;
  365.    j:=1;
  366.    repeat
  367.       repeat
  368.          tab(avvcolp,mytab);
  369.          writeln;
  370.          writeln('Su quali coordinate vuoi sparare? Colpi effettuati=',t);
  371.          repeat
  372.             gotoxy(55,15);
  373.             write('(',i,',',j,')');
  374.             move(avvcolp,x,y,i,j)
  375.          until pr=#13;
  376.          gotoxy(1,17);
  377.          if (avvcolp^[i,j]='o') or (avvcolp^[i,j]='*') then
  378.             begin
  379.             writeln('Hai gi… colpito questa cella!');
  380.             error;
  381.             pr:=readkey;
  382.             pr:=#0
  383.             end
  384.          else
  385.             begin
  386.             colpito(i,j);
  387.             pr:=#1;
  388.             t:=t+1
  389.             end;
  390.       until pr=#1;
  391.       pr:=readkey;
  392.       esc;
  393.       writeln;
  394.       writeln;
  395.       if vinto then
  396.          pr:='v'
  397.       else
  398.          pcatk(t)
  399.    until (pr='v') or perso;
  400.    writeln;
  401.    if pr='v' then
  402.       writeln('Hai vinto!! Hai effettuato ',t,' spari.')
  403.    else
  404.       writeln('Hai perso!! Hai effettuato ben ',t,' spari.');
  405.    writeln;
  406.    write('Premi un tasto per vedere la soluzione.');
  407.    pr:=readkey;
  408.    esc;
  409.    tab(avvocc,mytab);
  410.    pr:=readkey;
  411.    pr:=#27;
  412.    esc
  413. end;
  414. begin    { ---->>> Main <<<---- }
  415.    iniz(avvocc);
  416.    iniz(avvcolp);
  417.    diff;
  418.    navi(avvocc);
  419.    mynav;
  420.    baro;
  421.    gioco
  422. end.