Exemple #1
0
        //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());
     }
 }
Exemple #3
0
        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);
            }
        }
Exemple #5
0
 public StateEnumerator(Board.State state)
 {
     _state = state;
 }
Exemple #6
0
 //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)));
 }