(* This program was created by Volvo *) uses crt, graph; Procedure DrawTable; Var i, DX, DY: Integer; Begin DX := GetMaxX Div 5; DY := GetMaxY Div 5; For i := 1 To 4 Do Line(DX, i*DY, 4*DX, i*DY); For i := 1 To 4 Do Line(i*DX, DY, i*DX, 4*DY); End; const colors: array[boolean] Of integer = (red, white); Procedure PutChar(b: boolean; x, y: Integer; Ch: Char); var centerx, centery: integer; begin centerx := x*(getmaxx Div 5) + (getmaxx div 10); centery := y*(getmaxy Div 5) + (getmaxy div 10); setcolor(colors[b]); settextjustify(centertext, centertext); outtextxy(centerx, centery, ch); setcolor(white); end; var tbl: array[1 .. 3, 1 .. 3] of integer; function sumDiag(main: Boolean): Integer; var i, s: integer; begin s := 0; case main of false: for i := 1 to 3 do s := s + tbl[i, i]; true: for i := 1 to 3 do s := s + tbl[i, 3 - i + 1] end; sumDiag := s end; function sumR(x: integer): integer; var i, s: integer; begin s := 0; for i := 1 to 3 do s := s + tbl[x, i]; sumR := s end; function sumC(x: integer): integer; var i, s: integer; begin s := 0; for i := 1 to 3 do s := s + tbl[i, x]; sumC := s end; var grDriver: Integer; grMode: Integer; ErrCode: Integer; const prompt: array[boolean] Of String = ('Player 2 >', 'Player 1 >'); letter: array[boolean] Of Char = ('0', 'X'); amount: array[boolean] Of Byte = (7, 10); possibleLetters: set of char = ['1' .. '9']; var imove, p: Integer; posX, posY: integer; curr, ch: char; i, j: integer; winner, ok, b, stopped: boolean; begin grDriver := Detect; InitGraph(grDriver, grMode,''); ErrCode := GraphResult; if ErrCode <> grOk then begin Writeln('Graphics error:', GraphErrorMsg(ErrCode)); halt(100) end; for i := 1 to 3 do for j := 1 to 3 do tbl[i, j] := 0; DrawTable; For imove := 1 to 9 do begin setviewport(1, getmaxy-60, getmaxx, getmaxy, true); clearviewport; setviewport(1, 1, getmaxx, getmaxy, true); outtextxy(getmaxx div 2, getmaxy - 30, prompt[odd(imove)]); repeat ch := readkey; until ch in possibleletters; possibleletters := possibleletters - [ch]; p := Ord(ch) - Ord('0'); posY := ((p - 1) div 3) + 1; posX := (p mod 3); if posX = 0 then posX := 3; PutChar(odd(imove), posX, posY, letter[odd(imove)]); tbl[posX, posY] := amount[odd(imove)]; stopped := false; for b := false to true do begin for i := 1 to 3 do if (sumR(i) = 3*amount[b]) or (sumC(i) = 3*amount[b]) then begin winner := b; stopped := true; end; if not stopped then if (sumDiag(false) = 3*amount[b]) or (sumDiag(true) = 3*amount[b]) then begin winner := b; stopped := true; end; end; if stopped then break; end; setviewport(1, getmaxy-60, getmaxx, getmaxy, true); clearviewport; setviewport(1, 1, getmaxx, getmaxy, true); if stopped then begin setcolor(red); outtextxy(getmaxx div 2, getmaxy - 30, 'Winner: ' + prompt[winner]); setcolor(white); readln end else begin setcolor(lightblue); outtextxy(getmaxx div 2, getmaxy - 30, 'no winner...'); setcolor(white); readln end; CloseGraph end.