//gets the number of available rows, columns and diagonals for specified State. private int heuristics(Board.State player) { Board.State opponent = (player == Board.State.X) ? Board.State.O : Board.State.X; int heuristic = 0; for (int x = 0; x < 3; x++) { //for each row for (int i = 0; i < 3; i++) { if (board[x][i] == opponent) { break; } if (i == 2) { heuristic++; } } //for each column for (int i = 0; i < 3; i++) { if (board[i][x] == opponent) { break; } if (i == 2) { heuristic++; } } } //diagonal for (int i = 0; i < 3; i++) { if (board[i][i] == opponent) { break; } if (i == 2) { heuristic++; } } //diagonal for (int i = 0; i < 3; i++) { if (board[2 - i][i] == opponent) { break; } if (i == 2) { heuristic++; } } return(heuristic); }
public int score(Board board, Board.State player) { Board.State opponent = (player == Board.State.X) ? Board.State.O : Board.State.X; if (board.isGameOver() && board.getWinner() == player) { return(10); } else if (board.isGameOver() && board.getWinner() == opponent) { return(-10); } else { return(board.heuristic()); } }
int _Rollout(Board board) { Board.State player = board.turn; while (!board.IsEnd()) { Random rand = new Random((int)DateTime.Now.Ticks); var moves = _GetValidMove(board); List <Point> pt = new List <Point>(); double prior = double.MinValue; foreach (var m in moves) { if (Prior[m.X, m.Y] > prior) { pt.Clear(); prior = Prior[m.X, m.Y]; pt.Add(m); } else if (Prior[m.X, m.Y] == prior) { pt.Add(m); } } var move = pt[rand.Next(0, pt.Count)]; board.Play(move.X, move.Y); } if (board.GetWinner() == Board.State.SAME) { return(0); } else if (board.GetWinner() == player) { return(-1); } else { return(1); } }
public int alphaBetaPruning(Board board, Board.State player, int depth, double alpha, double beta) { Board.State opponent = (player == Board.State.X) ? Board.State.O : Board.State.X; if (board.isGameOver() || depth++ == maxDepth) { return(score(board, player)); } if (board.getTurn() == player) { int indexOfBestMove = -1; List <int> moves = board.getAvailableStates(); for (int i = 0; i < moves.Count; i++) { int theMove = moves[i]; Board modifiedBoard = board.getDeepCopy(); modifiedBoard.move(theMove); int score = alphaBetaPruning(modifiedBoard, player, depth, alpha, beta); if (score > alpha) { alpha = score; indexOfBestMove = theMove; } if (alpha >= beta) { break; } } if (indexOfBestMove != -1) { board.move(indexOfBestMove); } return((int)alpha); } else { int indexOfBestMove = -1; List <int> moves = board.getAvailableStates(); for (int i = 0; i < moves.Count; i++) { int theMove = moves[i]; Board modifiedBoard = board.getDeepCopy(); modifiedBoard.move(theMove); int score = alphaBetaPruning(modifiedBoard, player, depth, alpha, beta); if (score < beta) { beta = score; indexOfBestMove = theMove; } if (alpha >= beta) { break; } } if (indexOfBestMove != -1) { board.move(indexOfBestMove); } return((int)beta); } }
public StateEnumerator(Board.State state) { _state = state; }
//heuristic value calculated according to: //(number of available rows,columns and diagonals for player)-(number of available rows,columns and diagonals for computer) public int heuristic() { Board.State player = Board.State.X; Board.State opponent = Board.State.O; return((heuristics(player)) - (heuristics(opponent))); }