home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / TicTacToe_GameUnit.pas < prev    next >
Pascal/Delphi Source File  |  1997-08-20  |  8KB  |  367 lines

  1. //
  2. // File          : TicTacToe_GameUnit.pas
  3. //
  4. // Project       : PCProject
  5. // Configuration : PCConfig 1
  6. // Phase         : Implementation 1
  7. // System        : TicTacToe 1
  8. //
  9. unit TicTacToe_GameUnit;
  10.  
  11. interface
  12.  
  13. uses
  14.   // Start user include section
  15.   // End user include section
  16.   ClassDict,
  17.   TicTacToe_CellUnit;
  18.  
  19. type
  20.   // The Tic Tac Toe game itself.
  21.   TicTacToe_Game = class
  22.  
  23.   private
  24.     // User defined attributes
  25.     turnNumber: Integer;
  26.     players: String   (* = 'XO' *);
  27.     drawText: String   (* = 'It''s a draw!!!' *);
  28.     winText: String   (* = ' is the winner!!!' *);
  29.  
  30.     // Association attributes
  31.     guiRef: Pointer;
  32.     boardDict: TClassDict;
  33.  
  34.     // User defined methods
  35.  
  36.     // Properties
  37.  
  38.   protected
  39.     // User defined attributes
  40.  
  41.     // User defined methods
  42.  
  43.     // Properties
  44.  
  45.   public
  46.     // User defined attributes
  47.  
  48.     // Default constructor/destructor
  49.     constructor Create;
  50.     destructor Destroy; override;
  51.  
  52.     // User defined methods
  53.     procedure selectCell(number: Integer);
  54.     procedure connectCells;
  55.     procedure checkResult(number: Integer);
  56.     procedure createCells;
  57.     procedure startGame;
  58.     function getActivePlayer: String;
  59.     procedure clearBoard;
  60.  
  61.     // Access methods
  62.     procedure setWinText(newWinText: String);
  63.     procedure setPlayers(newPlayers: String);
  64.     function getDrawText: String;
  65.     procedure setDrawText(newDrawText: String);
  66.     function getTurnNumber: Integer;
  67.     procedure setTurnNumber(newTurnNumber: Integer);
  68.     function getPlayers: String;
  69.     function getWinText: String;
  70.  
  71.     // Association methods
  72.     procedure removeBoard(Index: Integer);
  73.     function getGui: Pointer;
  74.     function getBoard(Index: Integer): TicTacToe_Cell;
  75.     procedure removeGui;
  76.     procedure setGui(newTTicTacToe_GUI: Pointer);
  77.     procedure setBoard(Index: Integer; newTicTacToe_Cell: TicTacToe_Cell);
  78.  
  79.     // Properties
  80.  
  81.   published
  82.     // User defined attributes
  83.  
  84.     // User defined methods
  85.  
  86.     // Properties
  87.   end;
  88.  
  89.  
  90. implementation
  91.  
  92. uses
  93.   // Start user include section
  94.   // End user include section
  95.   TTicTacToe_GUIUnit;
  96.  
  97. constructor TicTacToe_Game.Create;
  98.   // Start user section
  99.   // End user section
  100. begin
  101.   players := 'XO';
  102.   drawText := 'It''s a draw!!!';
  103.   winText := ' is the winner!!!';
  104.  
  105.   inherited Create;
  106.   boardDict := TClassDict.Create;
  107.   // Start user section
  108.   createCells;
  109.   connectCells;
  110.   // End user section
  111. end;
  112.  
  113.  
  114. destructor TicTacToe_Game.Destroy;
  115.   // Start user section
  116.   // End user section
  117. begin
  118.   // Start user section
  119.   // End user section
  120.   removeGui;
  121.   boardDict.Destroy;
  122.  
  123.   inherited Destroy;
  124. end;
  125.  
  126.  
  127. // Marks the selected cell and checks to
  128. // see if there is a result.
  129. procedure TicTacToe_Game.selectCell(number: Integer);
  130. var
  131.   cell: TicTacToe_Cell;
  132. begin
  133.   cell := getBoard(number);
  134.   cell.setContents(getActivePlayer);
  135.   checkResult(number);
  136. end;
  137.  
  138.  
  139. // Connects all the cells of the board.
  140. procedure TicTacToe_Game.connectCells;
  141. var
  142.   N, E, W, S: Integer;
  143.   i: Integer;
  144.   cell: TicTacToe_Cell;
  145.  
  146. begin
  147.   N := 3;
  148.   W := -1;
  149.   E := -W;
  150.   S := -N;
  151.  
  152.   for i := 1 to 9 do
  153.   begin
  154.     cell := getBoard(i);
  155.     cell.setNeighbour('N', getBoard(i + N));
  156.     if ((i mod 3) <> 0) then
  157.     begin
  158.       cell.setNeighbour('NE', getBoard(i + N + E));
  159.       cell.setNeighbour('E', getBoard(i + E));
  160.       cell.setNeighbour('SE', getBoard(i + S + E));
  161.     end;
  162.     cell.setNeighbour('S', getBoard(i + S));
  163.     if ((i mod 3) <> 1) then
  164.     begin
  165.       cell.setNeighbour('SW', getBoard(i + S + W));
  166.       cell.setNeighbour('W', getBoard(i + W));
  167.       cell.setNeighbour('NW', getBoard(i + N + W));
  168.     end;
  169.   end;
  170. end;
  171.  
  172.  
  173. // Checks if there is a winner or a draw
  174. // and displays this result.
  175. procedure TicTacToe_Game.checkResult(number: Integer);
  176. var
  177.   gui: TTicTacToe_GUI;
  178.   cell: TicTacToe_Cell;
  179. begin
  180.   gui := getGUI();
  181.   cell := getBoard(number);
  182.  
  183.   if cell.getMaxLine() = 3 then
  184.   begin
  185.     gui.disableBoard();
  186.     gui.displayResult(getActivePlayer() + getWinText());
  187.   end
  188.   else
  189.   begin
  190.     if (getTurnNumber = 9 -1) then
  191.     begin
  192.       gui.disableBoard();
  193.       gui.displayResult(getDrawText());
  194.     end;
  195.   end;
  196.   setTurnNumber(getTurnNumber() + 1);
  197. end;
  198.  
  199.  
  200. // Creates all the cells of the board.
  201. // 
  202. procedure TicTacToe_Game.createCells;
  203. var
  204.   aCell: TicTacToe_Cell;
  205.   i: Integer;
  206.  
  207. begin
  208.   for i := 1 to 9 do
  209.   begin
  210.     aCell := TicTacToe_Cell.Create;
  211.     setBoard(i, aCell);
  212.   end;
  213. end;
  214.  
  215.  
  216. // Initialize everything for a new game.
  217. procedure TicTacToe_Game.startGame;
  218. var
  219.   gui: TTicTacToe_GUI;
  220.  
  221. begin
  222.   gui := getGUI();
  223.  
  224.   setTurnNumber(0);
  225.   gui.ClearBoard();
  226.   Self.ClearBoard();
  227.   gui.enableBoard();
  228.   gui.displayResult('');
  229. end;
  230.  
  231.  
  232. // Determines the active player.
  233. function TicTacToe_Game.getActivePlayer: String;
  234. begin
  235.   getActivePlayer := getPlayers()[turnNumber mod Length(getPlayers()) + 1];
  236. end;
  237.  
  238.  
  239. // Clears all the cells of the board.
  240. procedure TicTacToe_Game.clearBoard;
  241. var
  242.    i: Integer;
  243.    cell: TicTacToe_Cell;
  244. begin
  245.   for i := 1 to boardDict.Count do
  246.   begin
  247.     cell := getBoard(i);
  248.     cell.setContents(' ');
  249.   end;
  250. end;
  251.  
  252.  
  253. // Do not delete this line -- regeneration marker
  254.  
  255. procedure TicTacToe_Game.setWinText(newWinText: String);
  256. begin
  257.   winText := newWinText;
  258. end;
  259.  
  260.  
  261. procedure TicTacToe_Game.setPlayers(newPlayers: String);
  262. begin
  263.   players := newPlayers;
  264. end;
  265.  
  266.  
  267. function TicTacToe_Game.getDrawText: String;
  268. begin
  269.   getDrawText := drawText;
  270. end;
  271.  
  272.  
  273. procedure TicTacToe_Game.setDrawText(newDrawText: String);
  274. begin
  275.   drawText := newDrawText;
  276. end;
  277.  
  278.  
  279. function TicTacToe_Game.getTurnNumber: Integer;
  280. begin
  281.   getTurnNumber := turnNumber;
  282. end;
  283.  
  284.  
  285. procedure TicTacToe_Game.setTurnNumber(newTurnNumber: Integer);
  286. begin
  287.   turnNumber := newTurnNumber;
  288. end;
  289.  
  290.  
  291. function TicTacToe_Game.getPlayers: String;
  292. begin
  293.   getPlayers := players;
  294. end;
  295.  
  296.  
  297. function TicTacToe_Game.getWinText: String;
  298. begin
  299.   getWinText := winText;
  300. end;
  301.  
  302.  
  303. procedure TicTacToe_Game.removeBoard(Index: Integer);
  304. begin
  305.   boardDict.RemoveUsingKey(Index)
  306. end;
  307.  
  308.  
  309. function TicTacToe_Game.getGui: Pointer;
  310. begin
  311.   getGui := guiRef;
  312. end;
  313.  
  314.  
  315. function TicTacToe_Game.getBoard(Index: Integer): TicTacToe_Cell;
  316. begin
  317.   getBoard := boardDict.Item(Index);
  318. end;
  319.  
  320.  
  321. procedure TicTacToe_Game.removeGui;
  322. var
  323.   oldTTicTacToe_GUI: TTicTacToe_GUI;
  324.  
  325. begin
  326.   if (guiRef <> NIL) then
  327.   begin
  328.     oldTTicTacToe_GUI := guiRef;
  329.     guiRef := NIL;
  330.     oldTTicTacToe_GUI.removeGame();
  331.   end;
  332. end;
  333.  
  334.  
  335. procedure TicTacToe_Game.setGui(newTTicTacToe_GUI: Pointer);
  336. begin
  337.   if (newTTicTacToe_GUI <> NIL) then
  338.   begin
  339.     if (newTTicTacToe_GUI <> guiRef) then
  340.     begin
  341.       if (guiRef <> NIL) then
  342.       begin
  343.         TTicTacToe_GUI(guiRef).removeGame;
  344.       end;
  345.       guiRef := newTTicTacToe_GUI;
  346.       TTicTacToe_GUI(newTTicTacToe_GUI).setGame(SELF);
  347.     end;
  348.   end
  349.   else
  350.   begin
  351.     removeGui;
  352.   end;
  353. end;
  354.  
  355.  
  356. procedure TicTacToe_Game.setBoard(Index: Integer; newTicTacToe_Cell: TicTacToe_Cell);
  357. begin
  358.   if (newTicTacToe_Cell <> NIL) then
  359.   begin
  360.     boardDict.Add(Index, newTicTacToe_Cell);
  361.   end;
  362. end;
  363.  
  364.  
  365.  
  366. end.
  367.