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)); }