public IMove ABNegamax(IBoardGame game, int maxDepth, int currentDepth, double alfa, double beta) { if (maxDepth == currentDepth || game.GameIsOver()) return game.EvaluatePosition(); IMove bestMove = null; var moves = (new RandomList<IMove>(game.GetLegalMoves())).Randomize(); foreach (var validMove in moves) { if (bestMove == null) bestMove = validMove; IBoardGame testGame = game.TestMove(validMove); validMove.SetMoveScore(-(ABNegamax(testGame, maxDepth, currentDepth + 1, -beta, -Math.Max(alfa, bestMove.GetMoveScore())).GetMoveScore())); if (validMove.GetMoveScore() > bestMove.GetMoveScore()) { bestMove = validMove; } if (bestMove.GetMoveScore() >= beta) return bestMove; } return bestMove; }
public IMove MiniMax(IBoardGame game, int maxDepth, double alfa, double beta) { if (maxDepth == 0) return null; IMove bestMove = null; var moves = (new RandomList<IMove>(game.GetLegalMoves())).Randomize(); int color = game.GetCurrentPlayer().GetPlayerID(); foreach (var validMove in moves) { IBoardGame testGame = game.TestMove(validMove); validMove.SetMoveScore(testGame.EvaluatePosition(game)); if (bestMove == null) bestMove = validMove; if (!testGame.GameIsOver()) { IMove nextBestMove = MiniMax(testGame, maxDepth - 1, alfa, beta); if (nextBestMove != null) validMove.SetMoveScore(nextBestMove.GetMoveScore()); if (color == 1 && validMove.GetMoveScore() > beta) { beta = validMove.GetMoveScore(); } if (color == -1 && validMove.GetMoveScore() < alfa) { alfa = validMove.GetMoveScore(); } } if (color == 1 && validMove.GetMoveScore() > alfa) { validMove.SetMoveScore(alfa); return validMove; } if (color == -1 && validMove.GetMoveScore() < beta) { validMove.SetMoveScore(beta); return validMove; } if (color * validMove.GetMoveScore() > color * bestMove.GetMoveScore()) bestMove = validMove; } return bestMove; }
public List<IMove> EvaluateMoves(IBoardGame game, int maxDepth, int currentDepth, double alfa, double beta) { List<IMove> rankedMoveList = new List<IMove>(); var moves = (new RandomList<IMove>(game.GetLegalMoves())).Randomize(); foreach (var validMove in moves) { IBoardGame testGame = game.TestMove(validMove); validMove.SetMoveScore(-(ABNegamax(testGame, maxDepth, currentDepth + 1, -beta, -alfa)).GetMoveScore()); int moveRank = 0; foreach (var insertedMove in rankedMoveList) { if (validMove.GetMoveScore() < insertedMove.GetMoveScore()) moveRank++; else break; } rankedMoveList.Insert(moveRank, validMove); for (int index = 0; index < rankedMoveList.Count; index++) { rankedMoveList[index].SetRank(index); } } return rankedMoveList; }