package tictac;
import java.util.*;
public class Strategy1 {
int bestScore;
int score;
int bestMove;
int depth;
ArrayList<Integer> myMoves = new ArrayList<Integer>();
//Player imitateHuman = new HumanPlayer("HUMAN",'O');
//Player AI = new HumanPlayer("AI",'X');
public void displayMoves()
{
for(int i = 0; i < myMoves.size();i++)
{
System.
out.
println(myMoves.
get(i
) + " "); }
}
public void makeMove(Player p, Cell c)
{
c.setSymbol(p.getSymbol());
}
public void unmakeMove(Cell c)
{
c.setSymbol('.');
}
ArrayList<Integer> generateMoves(Board b)
{
ArrayList<Integer> allPossibleMoves = new ArrayList<Integer>();
for(int i = 0; i < b.myBoard.size();i++)
{
if(b.myBoard.get(i).getSymbol() == '.')
{
allPossibleMoves.add(i);
}
}
return allPossibleMoves;
}
int evaluate(Board b)
{
if(GameController.hasWon(b.whoseTurn, b))
{
//if(p1.getId()=="AI")
return 100 - depth;
//else
//return depth - 100;
}
if(GameController.hasWon(b.whoseNotInTurn,b))
{
//if(p2.getId()=="AI")
//return 100 - depth;
//else
return depth - 100;
}
return 0;
}
void swapPlayers(Board b)
{
Player temp;
temp = b.getWhoseTurn();
b.setWhoseTurn(b.getWhoseNotInTurn());
b.setWhoseNotInTurn(temp);
}
public int minimax(Board b) //player1 is AI
{
//depth+=10;
System.
out.
println("Current board is " ); System.
out.
println("To play now on this board is " + b.
whoseTurn.
getId() ); b.display();
if( (GameController.hasWon(b.whoseTurn,b)) || (GameController.hasWon(b.whoseNotInTurn, b)) || (GameController.isDraw(b.whoseTurn,b,b.whoseNotInTurn)))
{
return evaluate(b);
}
ArrayList<Integer> possibleMoves = generateMoves(b);
if(b.whoseTurn.getId()=="AI")
{
bestScore = -1000000;
for(int i = 0; i < possibleMoves.size();i++)
{
int move = possibleMoves.get(i);
b.myBoard.get(move).setSymbol(b.whoseTurn.getSymbol());
swapPlayers(b);
score = minimax (b);
if(score > bestScore)
{
bestScore = score;
bestMove = move;
System.
out.
println("In maximum Move is " + move
+ "BESTScore is" + score
);
}
unmakeMove(b.myBoard.get(move));
}
return bestMove;
}
else
{
bestScore = 1000000;
for(int i = 0; i < possibleMoves.size();i++)
{
int move = possibleMoves.get(i);
b.myBoard.get(move).setSymbol(b.whoseTurn.getSymbol());
swapPlayers(b);
score = minimax(b);
if(score < bestScore)
{
myMoves.add(move);
bestScore = score;
bestMove = move;
System.
out.
println("In minimum Move is " + move
+ "Score is" + score
);
}
unmakeMove(b.myBoard.get(move));
}
return bestMove;
}
}
public static void main
(String[] args
) {
Player AI = new HumanPlayer("AI",'X');
Player Human = new HumanPlayer("Human",'O');
Board testBoard = new Board();
testBoard.setWhoseTurn(AI);
testBoard.setWhoseNotInTurn(Human);
testBoard.myBoard.get(3).setSymbol(AI.getSymbol());
testBoard.myBoard.get(6).setSymbol(AI.getSymbol());
testBoard.myBoard.get(7).setSymbol('O');
testBoard.myBoard.get(8).setSymbol('O');
testBoard.myBoard.get(0).setSymbol('O');
testBoard.myBoard.get(2).setSymbol(AI.getSymbol());
//testBoard.myBoard.get(8).setSymbol(AI.getSymbol());
Strategy1 instance = new Strategy1();
int score = instance.minimax(testBoard);
System.
out.
println("Move " + score
); //testBoard.display();
//instance.displayMoves();
}
}