Esempio n. 1
0
        public MOVE GetBestMove(IGameTree <MOVE> state)
        {
            if (!state.IsAITurn)
            {
                throw new InvalidOperationException("It is not the AI's turn");
            }
            else if (state.ValidMoves.Count == 0)
            {
                throw new InvalidOperationException("No valid moves");
            }
            else
            {
                var best      = default(MOVE);
                var bestScore = double.NegativeInfinity;

                foreach (var move in state.ValidMoves)
                {
                    var successorState      = state.MakeMove(move);
                    var successorStateScore = ScoreState(successorState, this._ply - 1);

                    if (successorStateScore > bestScore)
                    {
                        best      = move;
                        bestScore = successorStateScore;
                    }
                }

                return(best);
            }
        }
        private double ScoreOpponentState(IGameTree <MOVE> state, int ply, double minimum, double maximum)
        {
            Debug.Assert(ply >= 0);
            Debug.Assert(!state.IsAITurn);

            if (ply == 0 || state.ValidMoves.Count == 0)
            {
                return(state.Score);
            }
            else
            {
                var worst = double.PositiveInfinity;

                foreach (var validMove in state.ValidMoves)
                {
                    var successorState      = state.MakeMove(validMove);
                    var successorStateScore = ScoreState(successorState, ply - 1, minimum, worst);

                    if (successorStateScore < worst)
                    {
                        worst = successorStateScore;

                        if (worst <= minimum)
                        {
                            return(worst);
                        }
                    }
                }

                return(worst);
            }
        }
        private double ScoreAIState(IGameTree <MOVE> state, int ply, double minimum, double maximum)
        {
            Debug.Assert(ply >= 0);
            Debug.Assert(state.IsAITurn);

            if (state.ValidMoves.Count == 0)
            {
                return(state.Score);
            }
            else
            {
                var best = double.NegativeInfinity;

                foreach (var validMove in state.ValidMoves)
                {
                    var successorState      = state.MakeMove(validMove);
                    var successorStateScore = ScoreState(successorState, ply - 1, best, maximum);

                    if (successorStateScore > best)
                    {
                        best = successorStateScore;

                        if (best >= maximum)
                        {
                            return(best);
                        }
                    }
                }

                return(best);
            }
        }
Esempio n. 4
0
 private double ScoreState(IGameTree <MOVE> state, int ply)
 {
     if (state.IsAITurn)
     {
         return(ScoreAIState(state, ply));
     }
     else
     {
         return(ScoreOpponentState(state, ply));
     }
 }
 private double ScoreState(IGameTree <MOVE> state, int ply, double minimum, double maximum)
 {
     if (state.IsAITurn)
     {
         return(ScoreAIState(state, ply, minimum, maximum));
     }
     else
     {
         return(ScoreOpponentState(state, ply, minimum, maximum));
     }
 }
Esempio n. 6
0
        private double ScoreOpponentState(IGameTree <MOVE> state, int ply)
        {
            Debug.Assert(ply >= 0);
            Debug.Assert(!state.IsAITurn);

            if (ply == 0 || state.ValidMoves.Count == 0)
            {
                return(state.Score);
            }
            else
            {
                return(state.ValidMoves.Min(move => ScoreState(state.MakeMove(move), ply - 1)));
            }
        }
Esempio n. 7
0
        /**
         * Set player who opens the game.
         * called by parallel thread in a server game
         */
        public override void SetStarter(bool b)
        {
            if (b)
            {
                // computer starts
                if (VERBOSE)
                {
                    Debug.WriteLine("Computer starts");
                }
                m_humanColor  = IController.BLACK;
                m_humanStarts = false;
            }
            else
            {
                // human starts
                if (VERBOSE)
                {
                    Debug.WriteLine("Human starts");
                }
                m_humanColor  = IController.WHITE;
                m_humanStarts = true;
            }

            // refresh gui: must be called after beginning player have been chosen
            m_view.PrepareBoard();

            // create new game tree
            m_gameTree = new GameTree();
            if (b)
            {
                // computer will open the game
                m_gameTree.Create(TREEDEPTH, null);
                if (VERBOSE)
                {
                    Debug.WriteLine("\tgame tree created; tree size: " + m_gameTree.Size());
                }
            }
        }
Esempio n. 8
0
 public void Add(string move, IGameTree <string> child)
 {
     _children.Add(move, child);
 }
Esempio n. 9
0
        public LazyGameTree(IGameTree <MOVE> gameTree)
        {
            Debug.Assert(gameTree != null);

            this._originalTree = gameTree;
        }