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

  1. //
  2. // File          : TicTacToe_ComputerUnit.pas
  3. //
  4. // Project       : PCProject
  5. // Configuration : PCConfig 1
  6. // Phase         : Implementation 1
  7. // System        : TicTacToe 1
  8. //
  9. unit TicTacToe_ComputerUnit;
  10.  
  11. interface
  12.  
  13. uses
  14.   // Start user include section
  15.   // End user include section
  16.   TicTacToe_GameUnit;
  17.  
  18. type
  19.   // The computer opponent.
  20.   TicTacToe_Computer = class
  21.  
  22.   private
  23.     // User defined attributes
  24.     id: String   (* = '' *);
  25.  
  26.     // Association attributes
  27.     guiRef: Pointer;
  28.  
  29.     // User defined methods
  30.  
  31.     // Properties
  32.  
  33.   protected
  34.     // User defined attributes
  35.  
  36.     // User defined methods
  37.  
  38.     // Properties
  39.  
  40.   public
  41.     // User defined attributes
  42.  
  43.     // Association attributes
  44.     gameRef: TicTacToe_Game;
  45.  
  46.     // Default constructor/destructor
  47.     constructor Create(newgame: TicTacToe_Game);
  48.     destructor Destroy; override;
  49.  
  50.     // User defined methods
  51.     function getMaxValue(x: Integer): Integer;
  52.     procedure checkTurn;
  53.     procedure selectCell;
  54.  
  55.     // Access methods
  56.     procedure setId(newId: String);
  57.     function getId: String;
  58.  
  59.     // Association methods
  60.     function getGui: Pointer;
  61.     procedure removeGui;
  62.     procedure setGame(newTicTacToe_Game: TicTacToe_Game);
  63.     function getGame: TicTacToe_Game;
  64.     procedure setGui(newTTicTacToe_GUI: Pointer);
  65.  
  66.     // Properties
  67.  
  68.   published
  69.     // User defined attributes
  70.  
  71.     // User defined methods
  72.  
  73.     // Properties
  74.   end;
  75.  
  76.  
  77. implementation
  78.  
  79. uses
  80.   // Start user include section
  81.   TicTacToe_CellUnit,
  82.   // End user include section
  83.   TTicTacToe_GUIUnit,
  84.   SysUtils;
  85.  
  86. constructor TicTacToe_Computer.Create(newgame: TicTacToe_Game);
  87.   // Start user section
  88.   // End user section
  89. begin
  90.   id := '';
  91.  
  92.   if (newgame <> NIL) then
  93.   begin
  94.     gameRef := newgame;
  95.   end
  96.   else
  97.     raise EInvalidOp.Create('Object newgame has mandatory relation. NIL object reference not allowed.');
  98.   inherited Create;
  99.   // Start user section
  100.   // End user section
  101. end;
  102.  
  103.  
  104. destructor TicTacToe_Computer.Destroy;
  105.   // Start user section
  106.   // End user section
  107. begin
  108.   // Start user section
  109.   // End user section
  110.   removeGui;
  111.  
  112.   inherited Destroy;
  113. end;
  114.  
  115.  
  116. // Determines the strategic value of the specified empty cell.
  117. function TicTacToe_Computer.getMaxValue(x: Integer): Integer;
  118. var
  119.   i, retValue, temp: Integer;
  120.   game: TicTacToe_Game;
  121.   cell: TicTacToe_Cell;
  122.  
  123. begin
  124.   game := getGame();
  125.   retValue := -1;
  126.  
  127.   cell := game.getBoard(x);
  128.   for i := 1 to Length(game.getPlayers()) do
  129.   begin
  130.     cell.setContents(game.getPlayers()[i]);
  131.     temp := cell.getMaxLine();
  132.     if (retValue < temp) or (retValue = -1) then
  133.       retValue := temp;
  134.   end;
  135.   cell.setContents(' ');
  136.   getMaxValue := retValue;
  137. end;
  138.  
  139.  
  140. // Checks if it's its turn.
  141. procedure TicTacToe_Computer.checkTurn;
  142. begin
  143.   if getId() = TicTacToe_Game (getGame()).getActivePlayer then selectCell;
  144. end;
  145.  
  146.  
  147. // Chooses a good empty cell.
  148. procedure TicTacToe_Computer.selectCell;
  149. var
  150.   i, maxi, temp: Integer;
  151.   selection: Integer;
  152.   game: TicTacToe_Game;
  153.   gui: TTicTacToe_GUI;
  154.   cell: TicTacToe_Cell;
  155.  
  156. begin
  157.   game := getGame();
  158.   gui := getGUI();
  159.   maxi := 0;
  160.   selection := -1;
  161.  
  162.   for i:= 1 to 9 do
  163.   begin
  164.     cell := game.getBoard(i);
  165.     if cell.getContents() = ' ' then
  166.     begin
  167.       temp := getMaxValue(i);
  168.       if (maxi < temp) or (selection = -1) then
  169.       begin
  170.         maxi := temp;
  171.         selection := i;
  172.       end;
  173.     end;
  174.   end;
  175.   if selection <> -1 then
  176.     gui.cellButtonClick(selection);
  177. end;
  178.  
  179.  
  180. // Do not delete this line -- regeneration marker
  181.  
  182. procedure TicTacToe_Computer.setId(newId: String);
  183. begin
  184.   id := newId;
  185. end;
  186.  
  187.  
  188. function TicTacToe_Computer.getId: String;
  189. begin
  190.   getId := id;
  191. end;
  192.  
  193.  
  194. function TicTacToe_Computer.getGui: Pointer;
  195. begin
  196.   getGui := guiRef;
  197. end;
  198.  
  199.  
  200. procedure TicTacToe_Computer.removeGui;
  201. var
  202.   oldTTicTacToe_GUI: TTicTacToe_GUI;
  203.  
  204. begin
  205.   if (guiRef <> NIL) then
  206.   begin
  207.     oldTTicTacToe_GUI := guiRef;
  208.     guiRef := NIL;
  209.     oldTTicTacToe_GUI.removeComputer();
  210.   end;
  211. end;
  212.  
  213.  
  214. procedure TicTacToe_Computer.setGame(newTicTacToe_Game: TicTacToe_Game);
  215. begin
  216.   if (newTicTacToe_Game <> NIL) then
  217.   begin
  218.     gameRef := newTicTacToe_Game;
  219.   end;
  220. end;
  221.  
  222.  
  223. function TicTacToe_Computer.getGame: TicTacToe_Game;
  224. begin
  225.   getGame := gameRef;
  226. end;
  227.  
  228.  
  229. procedure TicTacToe_Computer.setGui(newTTicTacToe_GUI: Pointer);
  230. begin
  231.   if (newTTicTacToe_GUI <> NIL) then
  232.   begin
  233.     if (newTTicTacToe_GUI <> guiRef) then
  234.     begin
  235.       if (guiRef <> NIL) then
  236.       begin
  237.         TTicTacToe_GUI(guiRef).removeComputer;
  238.       end;
  239.       guiRef := newTTicTacToe_GUI;
  240.       TTicTacToe_GUI(newTTicTacToe_GUI).setComputer(SELF);
  241.     end;
  242.   end
  243.   else
  244.   begin
  245.     removeGui;
  246.   end;
  247. end;
  248.  
  249.  
  250.  
  251. end.
  252.