Пример #1
0
        public IMove GetAlfaBetaMoveNew(IGame game, IMove lastMove, int depth, double α, double β)
        {
            IMove _bestMove = null;
            var   _moves    = game.GetBoard().GetPossibleMoves();

            if (depth == 0 || _moves.Count == 0)
            {
                if (lastMove != null)
                {
                    lastMove.SetPoints(game.CountResult(resultPlayer, game.GetPlayers()[resultPlayer]));
                }
                return(lastMove);
            }

            foreach (var _move in _moves)
            {
                game.MakeMove(_move);
                GetAlfaBetaMoveNew(game, _move, depth - 1, α, β);
                game.UndoMove(_move);

                if (game.GetPlayerWithMove() == resultPlayer)
                {
                    if (_bestMove == null || _bestMove.GetPoints() < _move.GetPoints())
                    {
                        _bestMove = _move;
                    }
                    if (α < _bestMove.GetPoints())
                    {
                        α = _bestMove.GetPoints();
                    }
                    if (_bestMove.GetPoints() > β)
                    {
                        lastMove.SetPoints(_bestMove.GetPoints());
                        return(lastMove);
                    }
                }
                else
                {
                    if (_bestMove == null || _bestMove.GetPoints() > _move.GetPoints())
                    {
                        _bestMove = _move;
                    }
                    if (β > _bestMove.GetPoints())
                    {
                        β = _bestMove.GetPoints();
                    }
                    if (_bestMove.GetPoints() < α)
                    {
                        lastMove.SetPoints(_bestMove.GetPoints());
                        return(lastMove);
                    }
                }
            }

            if (lastMove != null)
            {
                if (game.GetPlayerWithMove() == resultPlayer)
                {
                    lastMove.SetPoints(GetMax(_moves).GetPoints());
                    return(lastMove);
                }
                else
                {
                    lastMove.SetPoints(GetMin(_moves).GetPoints());
                    return(lastMove);
                }
            }

            return(GetMax(_moves));
        }