• Source
    1. package tictac;
    2.  
    3.  
    4. import java.util.*;
    5.  
    6. public class Strategy1 {
    7.  
    8. int bestScore;
    9. int score;
    10. int bestMove;
    11. int depth;
    12. ArrayList<Integer> myMoves = new ArrayList<Integer>();
    13. //Player imitateHuman = new HumanPlayer("HUMAN",'O');
    14. //Player AI = new HumanPlayer("AI",'X');
    15.  
    16. public void displayMoves()
    17. {
    18. for(int i = 0; i < myMoves.size();i++)
    19. {
    20. System.out.println(myMoves.get(i) + " ");
    21. }
    22. }
    23. public void makeMove(Player p, Cell c)
    24. {
    25. c.setSymbol(p.getSymbol());
    26. }
    27. public void unmakeMove(Cell c)
    28. {
    29. c.setSymbol('.');
    30. }
    31. ArrayList<Integer> generateMoves(Board b)
    32. {
    33. ArrayList<Integer> allPossibleMoves = new ArrayList<Integer>();
    34. for(int i = 0; i < b.myBoard.size();i++)
    35. {
    36. if(b.myBoard.get(i).getSymbol() == '.')
    37. {
    38. allPossibleMoves.add(i);
    39. }
    40. }
    41. return allPossibleMoves;
    42. }
    43. int evaluate(Board b)
    44. {
    45. if(GameController.hasWon(b.whoseTurn, b))
    46. {
    47. //if(p1.getId()=="AI")
    48. return 100 - depth;
    49. //else
    50. //return depth - 100;
    51. }
    52.  
    53. if(GameController.hasWon(b.whoseNotInTurn,b))
    54. {
    55. //if(p2.getId()=="AI")
    56. //return 100 - depth;
    57. //else
    58. return depth - 100;
    59. }
    60.  
    61. return 0;
    62. }
    63. void swapPlayers(Board b)
    64. {
    65. Player temp;
    66. temp = b.getWhoseTurn();
    67. b.setWhoseTurn(b.getWhoseNotInTurn());
    68. b.setWhoseNotInTurn(temp);
    69.  
    70. }
    71. public int minimax(Board b) //player1 is AI
    72. {
    73. //depth+=10;
    74. System.out.println("Current board is " );
    75. System.out.println("To play now on this board is " + b.whoseTurn.getId() );
    76. b.display();
    77. if( (GameController.hasWon(b.whoseTurn,b)) || (GameController.hasWon(b.whoseNotInTurn, b)) || (GameController.isDraw(b.whoseTurn,b,b.whoseNotInTurn)))
    78. {
    79.  
    80. return evaluate(b);
    81. }
    82. ArrayList<Integer> possibleMoves = generateMoves(b);
    83.  
    84. if(b.whoseTurn.getId()=="AI")
    85. {
    86.  
    87. bestScore = -1000000;
    88.  
    89. for(int i = 0; i < possibleMoves.size();i++)
    90. {
    91. int move = possibleMoves.get(i);
    92. b.myBoard.get(move).setSymbol(b.whoseTurn.getSymbol());
    93.  
    94. swapPlayers(b);
    95. score = minimax (b);
    96.  
    97. if(score > bestScore)
    98. {
    99.  
    100. bestScore = score;
    101. bestMove = move;
    102. System.out.println("In maximum Move is " + move + "BESTScore is" + score);
    103.  
    104. }
    105. unmakeMove(b.myBoard.get(move));
    106.  
    107. }
    108.  
    109. return bestMove;
    110. }
    111. else
    112. {
    113. bestScore = 1000000;
    114. for(int i = 0; i < possibleMoves.size();i++)
    115. {
    116. int move = possibleMoves.get(i);
    117. b.myBoard.get(move).setSymbol(b.whoseTurn.getSymbol());
    118.  
    119. swapPlayers(b);
    120. score = minimax(b);
    121.  
    122. if(score < bestScore)
    123. {
    124. myMoves.add(move);
    125. bestScore = score;
    126. bestMove = move;
    127. System.out.println("In minimum Move is " + move + "Score is" + score);
    128.  
    129. }
    130. unmakeMove(b.myBoard.get(move));
    131.  
    132. }
    133. return bestMove;
    134.  
    135.  
    136.  
    137. }
    138.  
    139.  
    140.  
    141.  
    142. }
    143. public static void main(String[] args)
    144. {
    145.  
    146. Player AI = new HumanPlayer("AI",'X');
    147. Player Human = new HumanPlayer("Human",'O');
    148. Board testBoard = new Board();
    149. testBoard.setWhoseTurn(AI);
    150. testBoard.setWhoseNotInTurn(Human);
    151. testBoard.myBoard.get(3).setSymbol(AI.getSymbol());
    152. testBoard.myBoard.get(6).setSymbol(AI.getSymbol());
    153. testBoard.myBoard.get(7).setSymbol('O');
    154. testBoard.myBoard.get(8).setSymbol('O');
    155. testBoard.myBoard.get(0).setSymbol('O');
    156. testBoard.myBoard.get(2).setSymbol(AI.getSymbol());
    157. //testBoard.myBoard.get(8).setSymbol(AI.getSymbol());
    158. Strategy1 instance = new Strategy1();
    159. int score = instance.minimax(testBoard);
    160. System.out.println("Move " + score);
    161. //testBoard.display();
    162. //instance.displayMoves();
    163.  
    164.  
    165. }
    166.  
    167.  
    168. }
    169.