hauzer

iksoks.pas

Nov 19th, 2011
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 9.09 KB | None | 0 0
  1. program iksoks;
  2.  
  3. uses crt;
  4.  
  5. { Tipovi promenljivih }
  6. type
  7.     xopolje = (xop, xopiks, xopoks);
  8.     xotabla = record
  9.                 polja : array of array of xopolje;
  10.                 w, h : integer;
  11.               end;
  12.     xoigrac = (xoicovek, xoiracunar);
  13.  
  14. { Konstante }
  15. const
  16.     escape_char : char = #27;
  17.  
  18. { Vraca novu tablu sa praznim poljima }
  19. function nova_tabla(w, h : integer) : xotabla;
  20. var
  21.     i, j : integer;
  22. begin
  23.     if (w < 1) or (h < 1) then
  24.     begin
  25.         setlength(nova_tabla.polja, 0);
  26.         exit;
  27.     end;
  28.  
  29.     setlength(nova_tabla.polja, h);
  30.     for i := 0 to w - 1 do
  31.         setlength(nova_tabla.polja[i], w);
  32.  
  33.     for i := 0 to w - 1 do
  34.         for j := 0 to h - 1 do
  35.             nova_tabla.polja[i][j] := xop;
  36.  
  37.     nova_tabla.w := w;
  38.     nova_tabla.h := h;
  39. end;
  40.  
  41. { Proverava da li ima pobednickih kombinacija na tabli }
  42. function proveri_tablu(tabla : xotabla) : xopolje;
  43. var
  44.     i, j : integer;
  45.     polje : xopolje;
  46. begin
  47.     { Proveri vertikalno }
  48.     for i := 0 to tabla.h - 1 do
  49.     begin
  50.         polje := tabla.polja[i][0];
  51.         proveri_tablu := polje;
  52.         for j := 1 to tabla.w - 1 do
  53.         begin
  54.             if tabla.polja[i][j] <> polje then
  55.             begin
  56.                 proveri_tablu := xop;
  57.                 break;
  58.             end;
  59.         end;
  60.         if proveri_tablu <> xop then exit;
  61.     end;
  62.  
  63.     { Proveri horizontalno }
  64.     for i := 0 to tabla.w - 1 do
  65.     begin
  66.         polje := tabla.polja[0][i];
  67.         proveri_tablu := polje;
  68.         for j := 1 to tabla.h - 1 do
  69.         begin
  70.             if tabla.polja[j][i] <> polje then
  71.             begin
  72.                 proveri_tablu := xop;
  73.                 break;
  74.             end;
  75.         end;
  76.         if proveri_tablu <> xop then exit;
  77.     end;
  78.  
  79.     { Proveri dijagonalno s leva na desno, odozgo na dole }
  80.     for i := 0 to tabla.h - 1 do
  81.     begin
  82.         polje := tabla.polja[i][0];
  83.         proveri_tablu := polje;
  84.         for j := 1 to tabla.w - 1 do
  85.         begin
  86.             if (i+j >= tabla.h)
  87.             or (tabla.polja[i+j][j] <> polje) then
  88.             begin
  89.                 proveri_tablu := xop;
  90.                 break;
  91.             end;
  92.         end;
  93.         if proveri_tablu <> xop then exit;
  94.     end;
  95.  
  96.     { Proveri dijagonalno s desna na levo, odozgo na dole }
  97.     for i := 0 to tabla.h - 1 do
  98.     begin
  99.         polje := tabla.polja[i][tabla.w-1];
  100.         proveri_tablu := polje;
  101.         for j := 1 to tabla.w - 1 do
  102.         begin
  103.             if (i+j >= tabla.h)
  104.             or (tabla.polja[i+j][(tabla.w-1)-j] <> polje) then
  105.             begin
  106.                 proveri_tablu := xop;
  107.                 break;
  108.             end;
  109.         end;
  110.         if proveri_tablu <> xop then exit;
  111.     end;
  112.  
  113.     { Proveri dijagonalno odozgo na dole, s leva na desno }
  114.     for i := 0 to tabla.w - 1 do
  115.     begin
  116.         polje := tabla.polja[0][i];
  117.         proveri_tablu := polje;
  118.         for j := 1 to tabla.h - 1 do
  119.         begin
  120.             if (i+j >= tabla.w)
  121.             or (tabla.polja[j][i+j] <> polje) then
  122.             begin
  123.                 proveri_tablu := xop;
  124.                 break;
  125.             end;
  126.         end;
  127.         if proveri_tablu <> xop then exit;
  128.     end;
  129.  
  130.     { Proveri dijagonalno odozgo na dole, s desna na levo }
  131.     for i := 0 to tabla.w - 1 do
  132.     begin
  133.         polje := tabla.polja[0][(tabla.w-1)-i];
  134.         proveri_tablu := polje;
  135.         for j := 1 to tabla.h - 1 do
  136.         begin
  137.             if (i+j >= tabla.w)
  138.             or (tabla.polja[j][(tabla.w-1)-(i+j)] <> polje) then
  139.             begin
  140.                 proveri_tablu := xop;
  141.                 break;
  142.             end;
  143.         end;
  144.         if proveri_tablu <> xop then exit;
  145.     end;
  146. end;
  147.  
  148. { Prikazuje tablu }
  149. procedure prikazi_tablu(tabla : xotabla);
  150. var
  151.     i, j : integer;
  152.     polje : xopolje;
  153. begin
  154.     { Gornji brojevi }
  155.     write('   ');
  156.     for j := 1 to tabla.w do
  157.         write('  ', j ,' ');
  158.     writeln;
  159.  
  160.     { Gornja linija }
  161.     write('   ');
  162.     for j := 1 to tabla.w do
  163.         write('----');
  164.     writeln('-');
  165.  
  166.     { Polja }
  167.     for i := 0 to tabla.h - 1 do
  168.     begin
  169.         { Desni brojevi }
  170.         write(' ', i + 1, ' |');
  171.  
  172.         for j := 0 to tabla.w - 1 do
  173.         begin
  174.             polje := tabla.polja[i][j];
  175.             write(' ');
  176.             if polje = xopiks then
  177.                 write('X')
  178.             else if polje = xopoks then
  179.                 write('O')
  180.             else write(' ');
  181.             write(' |');
  182.         end;
  183.  
  184.         { Srednje i donja linija }
  185.         writeln();
  186.         write('   ');
  187.         for j := 1 to tabla.w do
  188.             write('----');
  189.         writeln('-');
  190.     end;
  191. end;
  192.  
  193. { Zapocinje novu igru }
  194. procedure nova_igra(w, h : integer; xoix, xoio : xoigrac);
  195. var
  196.     tabla : xotabla;
  197.     pob, igr : xopolje;
  198.     x, y, pot : integer;
  199.     treba_izaci : boolean;
  200. begin
  201.     tabla := nova_tabla(w, h);
  202.     if length(tabla.polja) = 0 then exit;
  203.  
  204.     igr := xopiks; pob := xop;
  205.     pot := 0;
  206.     treba_izaci := false;
  207.     repeat
  208.     begin
  209.         while true do
  210.         begin
  211.             { Prikazi tablu i dekoracije }
  212.             clrscr();
  213.             prikazi_tablu(tabla);
  214.  
  215.             writeln;
  216.             write('[');
  217.             if igr = xopiks then write('X')
  218.             else write('O');
  219.             write(']> ');
  220.  
  221.             { Uzmi koordinate }
  222.             x := integer(readkey());
  223.             if x = integer(escape_char) then
  224.             begin
  225.                 treba_izaci := true;
  226.                 break;
  227.             end;
  228.             write(char(x), ' ');
  229.  
  230.             y := integer(readkey());
  231.             if y = integer(escape_char) then continue;
  232.             writeln(char(y));
  233.  
  234.             { Sredi i proveri koordinate }
  235.             x := x - integer('0');
  236.             y := y - integer('0');
  237.             if ((x > tabla.w) or (x <= 0)) or ((y > tabla.h) or (y <= 0)) then continue;
  238.             dec(x); dec(y);
  239.  
  240.             { Ako je polje zauzeto opet uzmi koordinate,
  241.               u suprotnom upisi trenutnog igraca u polje }
  242.             if tabla.polja[y][x] <> xop then continue;
  243.             tabla.polja[y][x] := igr;
  244.             break;
  245.         end;
  246.  
  247.         { Promeni igraca }
  248.         if igr = xopiks then igr := xopoks
  249.         else igr := xopiks;
  250.  
  251.         { Proveri tablu }
  252.         pob := proveri_tablu(tabla);
  253.  
  254.         { Povecaj broj odigranih poteza }
  255.         inc(pot);
  256.     end;
  257.     until (treba_izaci) or (pob <> xop) or (pot >= tabla.w * tabla.h);
  258.  
  259.     clrscr();
  260.     prikazi_tablu(tabla);
  261.     writeln();
  262.     if pob = xop then
  263.         writeln('Rezultat je neresen.')
  264.     else
  265.     begin
  266.         write('Pobednik je ');
  267.         if pob = xopiks then write('prvi')
  268.         else write('drugi');
  269.         writeln(' igrac.');
  270.     end;
  271.  
  272.     readkey();
  273. end;
  274.  
  275. { Prikazi meni i vrati odabranu stavku }
  276. function meni(naslov : string; izbori : array of string) : integer;
  277. const
  278.     duzina_dekoracije : integer = 5;
  279. var
  280.     maxl, nsl, i, j, l, brizbora : integer;
  281.     st : string;
  282. begin
  283.     { Nadji duzinu najduze linije koja ce biti prikazana }
  284.     nsl := length(naslov);
  285.     maxl := nsl;
  286.     for st in izbori do
  287.     begin
  288.         l := length(st);
  289.         if l > maxl then
  290.             maxl := l;
  291.     end;
  292.     brizbora := length(izbori); str(brizbora, st);
  293.     maxl := maxl + length(st) + duzina_dekoracije;
  294.  
  295.     { Ispisi gornju granicu menija }
  296.     write(' ');
  297.     for i := 0 to maxl - 2 do write('-');
  298.     writeln(' ');
  299.  
  300.     { Ispisi naslov }
  301.     write('|');
  302.     l := maxl - nsl;
  303.     j := l div 2;
  304.     for i := 1 to l - 2 do
  305.     begin
  306.         if i = j then
  307.             write(' ', naslov, ' ')
  308.         else write('=');
  309.     end;
  310.     writeln('|');
  311.  
  312.     { Ipisi gornju granicu naslova }
  313.     write('|');
  314.     for i := 0 to maxl - 2 do write('=');
  315.     writeln('|');
  316.  
  317.     { Ipisi donju granicu naslova }
  318.     write('|');
  319.     for i := 0 to maxl - 2 do write('=');
  320.     writeln('|');
  321.  
  322.     { Ispisi izbore }
  323.     for i := 0 to brizbora - 1 do
  324.     begin
  325.         write('| ', i + 1, '. ');
  326.         write(izbori[i]);
  327.         l := maxl - length(izbori[i]) - duzina_dekoracije;
  328.         for j := 1 to l do write(' ');
  329.         writeln('|');
  330.     end;
  331.  
  332.     { Ispisi donju granicu menija }
  333.     write(' ');
  334.     for i := 0 to maxl - 2 do write('-');
  335.     writeln(' ');
  336.  
  337.     write('> ');
  338.     meni := integer(readkey()) - integer('0');
  339. end;
  340.  
  341. { Pocetak programa }
  342. var
  343.     w, h, izb : integer;
  344.     izbori : array [1..2] of string;
  345.     treba_izaci : boolean;
  346. begin
  347.     izbori[1] := 'Nova igra';
  348.     izbori[2] := 'Izadji';
  349.     treba_izaci := false;
  350.  
  351.     while not treba_izaci do
  352.     begin
  353.         clrscr();
  354.         izb := meni('IKSOKS', izbori);
  355.         clrscr();
  356.  
  357.         case izb of
  358.             1: begin
  359.                 write('Unesite dimenzije table: ');
  360.                 readln(w, h);
  361.                 nova_igra(w, h, xoicovek, xoicovek);
  362.             end;
  363.             2: treba_izaci := true
  364.             else
  365.             begin
  366.                 writeln('Nepostojeca komanda!');
  367.                 readkey();
  368.             end;
  369.         end;
  370.     end;
  371. end.
Advertisement
Add Comment
Please, Sign In to add comment