Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program iksoks;
- uses crt;
- { Tipovi promenljivih }
- type
- xopolje = (xop, xopiks, xopoks);
- xotabla = record
- polja : array of array of xopolje;
- w, h : integer;
- end;
- xoigrac = (xoicovek, xoiracunar);
- { Konstante }
- const
- escape_char : char = #27;
- { Vraca novu tablu sa praznim poljima }
- function nova_tabla(w, h : integer) : xotabla;
- var
- i, j : integer;
- begin
- if (w < 1) or (h < 1) then
- begin
- setlength(nova_tabla.polja, 0);
- exit;
- end;
- setlength(nova_tabla.polja, h);
- for i := 0 to w - 1 do
- setlength(nova_tabla.polja[i], w);
- for i := 0 to w - 1 do
- for j := 0 to h - 1 do
- nova_tabla.polja[i][j] := xop;
- nova_tabla.w := w;
- nova_tabla.h := h;
- end;
- { Proverava da li ima pobednickih kombinacija na tabli }
- function proveri_tablu(tabla : xotabla) : xopolje;
- var
- i, j : integer;
- polje : xopolje;
- begin
- { Proveri vertikalno }
- for i := 0 to tabla.h - 1 do
- begin
- polje := tabla.polja[i][0];
- proveri_tablu := polje;
- for j := 1 to tabla.w - 1 do
- begin
- if tabla.polja[i][j] <> polje then
- begin
- proveri_tablu := xop;
- break;
- end;
- end;
- if proveri_tablu <> xop then exit;
- end;
- { Proveri horizontalno }
- for i := 0 to tabla.w - 1 do
- begin
- polje := tabla.polja[0][i];
- proveri_tablu := polje;
- for j := 1 to tabla.h - 1 do
- begin
- if tabla.polja[j][i] <> polje then
- begin
- proveri_tablu := xop;
- break;
- end;
- end;
- if proveri_tablu <> xop then exit;
- end;
- { Proveri dijagonalno s leva na desno, odozgo na dole }
- for i := 0 to tabla.h - 1 do
- begin
- polje := tabla.polja[i][0];
- proveri_tablu := polje;
- for j := 1 to tabla.w - 1 do
- begin
- if (i+j >= tabla.h)
- or (tabla.polja[i+j][j] <> polje) then
- begin
- proveri_tablu := xop;
- break;
- end;
- end;
- if proveri_tablu <> xop then exit;
- end;
- { Proveri dijagonalno s desna na levo, odozgo na dole }
- for i := 0 to tabla.h - 1 do
- begin
- polje := tabla.polja[i][tabla.w-1];
- proveri_tablu := polje;
- for j := 1 to tabla.w - 1 do
- begin
- if (i+j >= tabla.h)
- or (tabla.polja[i+j][(tabla.w-1)-j] <> polje) then
- begin
- proveri_tablu := xop;
- break;
- end;
- end;
- if proveri_tablu <> xop then exit;
- end;
- { Proveri dijagonalno odozgo na dole, s leva na desno }
- for i := 0 to tabla.w - 1 do
- begin
- polje := tabla.polja[0][i];
- proveri_tablu := polje;
- for j := 1 to tabla.h - 1 do
- begin
- if (i+j >= tabla.w)
- or (tabla.polja[j][i+j] <> polje) then
- begin
- proveri_tablu := xop;
- break;
- end;
- end;
- if proveri_tablu <> xop then exit;
- end;
- { Proveri dijagonalno odozgo na dole, s desna na levo }
- for i := 0 to tabla.w - 1 do
- begin
- polje := tabla.polja[0][(tabla.w-1)-i];
- proveri_tablu := polje;
- for j := 1 to tabla.h - 1 do
- begin
- if (i+j >= tabla.w)
- or (tabla.polja[j][(tabla.w-1)-(i+j)] <> polje) then
- begin
- proveri_tablu := xop;
- break;
- end;
- end;
- if proveri_tablu <> xop then exit;
- end;
- end;
- { Prikazuje tablu }
- procedure prikazi_tablu(tabla : xotabla);
- var
- i, j : integer;
- polje : xopolje;
- begin
- { Gornji brojevi }
- write(' ');
- for j := 1 to tabla.w do
- write(' ', j ,' ');
- writeln;
- { Gornja linija }
- write(' ');
- for j := 1 to tabla.w do
- write('----');
- writeln('-');
- { Polja }
- for i := 0 to tabla.h - 1 do
- begin
- { Desni brojevi }
- write(' ', i + 1, ' |');
- for j := 0 to tabla.w - 1 do
- begin
- polje := tabla.polja[i][j];
- write(' ');
- if polje = xopiks then
- write('X')
- else if polje = xopoks then
- write('O')
- else write(' ');
- write(' |');
- end;
- { Srednje i donja linija }
- writeln();
- write(' ');
- for j := 1 to tabla.w do
- write('----');
- writeln('-');
- end;
- end;
- { Zapocinje novu igru }
- procedure nova_igra(w, h : integer; xoix, xoio : xoigrac);
- var
- tabla : xotabla;
- pob, igr : xopolje;
- x, y, pot : integer;
- treba_izaci : boolean;
- begin
- tabla := nova_tabla(w, h);
- if length(tabla.polja) = 0 then exit;
- igr := xopiks; pob := xop;
- pot := 0;
- treba_izaci := false;
- repeat
- begin
- while true do
- begin
- { Prikazi tablu i dekoracije }
- clrscr();
- prikazi_tablu(tabla);
- writeln;
- write('[');
- if igr = xopiks then write('X')
- else write('O');
- write(']> ');
- { Uzmi koordinate }
- x := integer(readkey());
- if x = integer(escape_char) then
- begin
- treba_izaci := true;
- break;
- end;
- write(char(x), ' ');
- y := integer(readkey());
- if y = integer(escape_char) then continue;
- writeln(char(y));
- { Sredi i proveri koordinate }
- x := x - integer('0');
- y := y - integer('0');
- if ((x > tabla.w) or (x <= 0)) or ((y > tabla.h) or (y <= 0)) then continue;
- dec(x); dec(y);
- { Ako je polje zauzeto opet uzmi koordinate,
- u suprotnom upisi trenutnog igraca u polje }
- if tabla.polja[y][x] <> xop then continue;
- tabla.polja[y][x] := igr;
- break;
- end;
- { Promeni igraca }
- if igr = xopiks then igr := xopoks
- else igr := xopiks;
- { Proveri tablu }
- pob := proveri_tablu(tabla);
- { Povecaj broj odigranih poteza }
- inc(pot);
- end;
- until (treba_izaci) or (pob <> xop) or (pot >= tabla.w * tabla.h);
- clrscr();
- prikazi_tablu(tabla);
- writeln();
- if pob = xop then
- writeln('Rezultat je neresen.')
- else
- begin
- write('Pobednik je ');
- if pob = xopiks then write('prvi')
- else write('drugi');
- writeln(' igrac.');
- end;
- readkey();
- end;
- { Prikazi meni i vrati odabranu stavku }
- function meni(naslov : string; izbori : array of string) : integer;
- const
- duzina_dekoracije : integer = 5;
- var
- maxl, nsl, i, j, l, brizbora : integer;
- st : string;
- begin
- { Nadji duzinu najduze linije koja ce biti prikazana }
- nsl := length(naslov);
- maxl := nsl;
- for st in izbori do
- begin
- l := length(st);
- if l > maxl then
- maxl := l;
- end;
- brizbora := length(izbori); str(brizbora, st);
- maxl := maxl + length(st) + duzina_dekoracije;
- { Ispisi gornju granicu menija }
- write(' ');
- for i := 0 to maxl - 2 do write('-');
- writeln(' ');
- { Ispisi naslov }
- write('|');
- l := maxl - nsl;
- j := l div 2;
- for i := 1 to l - 2 do
- begin
- if i = j then
- write(' ', naslov, ' ')
- else write('=');
- end;
- writeln('|');
- { Ipisi gornju granicu naslova }
- write('|');
- for i := 0 to maxl - 2 do write('=');
- writeln('|');
- { Ipisi donju granicu naslova }
- write('|');
- for i := 0 to maxl - 2 do write('=');
- writeln('|');
- { Ispisi izbore }
- for i := 0 to brizbora - 1 do
- begin
- write('| ', i + 1, '. ');
- write(izbori[i]);
- l := maxl - length(izbori[i]) - duzina_dekoracije;
- for j := 1 to l do write(' ');
- writeln('|');
- end;
- { Ispisi donju granicu menija }
- write(' ');
- for i := 0 to maxl - 2 do write('-');
- writeln(' ');
- write('> ');
- meni := integer(readkey()) - integer('0');
- end;
- { Pocetak programa }
- var
- w, h, izb : integer;
- izbori : array [1..2] of string;
- treba_izaci : boolean;
- begin
- izbori[1] := 'Nova igra';
- izbori[2] := 'Izadji';
- treba_izaci := false;
- while not treba_izaci do
- begin
- clrscr();
- izb := meni('IKSOKS', izbori);
- clrscr();
- case izb of
- 1: begin
- write('Unesite dimenzije table: ');
- readln(w, h);
- nova_igra(w, h, xoicovek, xoicovek);
- end;
- 2: treba_izaci := true
- else
- begin
- writeln('Nepostojeca komanda!');
- readkey();
- end;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment