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); } }
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)); } }
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))); } }
/** * 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()); } } }
public void Add(string move, IGameTree <string> child) { _children.Add(move, child); }
public LazyGameTree(IGameTree <MOVE> gameTree) { Debug.Assert(gameTree != null); this._originalTree = gameTree; }