//MiniMax base on number of moves static List<int> MiniMaxMove(Board board, int player, int callingPlayer, int maxDepth, int currentDepth) { // This array contains: bestScore, bestMoveX, bestMoveY in that order List<int> miniMaxReturn = new List<int>(); // This array contains: bestScore, bestMoveX, bestMoveY in that order List<int> currentReturn = new List<int>(); // Check for recursion end if (board.IsGameOver(player) || currentDepth == maxDepth) { miniMaxReturn.Add(board.GetPossibleMoves(callingPlayer).Count); miniMaxReturn.Add(-1); miniMaxReturn.Add(-1); miniMaxReturn.Add(-1); miniMaxReturn.Add(-1); return miniMaxReturn; } // Depending on the player we choose a starting bestScore // Negative if currentPlayer so we always chose a higher scored board if (board.GetCurrentPlayer() == player) miniMaxReturn.Add(-int.MaxValue); // Positive for opponent so that they always choose a lower scored // board else miniMaxReturn.Add(int.MaxValue); // Contains default moveX, moveY miniMaxReturn.Add(-1); miniMaxReturn.Add(-1); miniMaxReturn.Add(-1); miniMaxReturn.Add(-1); Board newBoard; // Recurse for each move foreach (List<int> move in board.GetPossibleMoves(player)) { // Get new board configuration newBoard = board.MakeMove(move, player); // Recurse till return currentReturn = MiniMaxMove(newBoard, 1 - player, callingPlayer, maxDepth, currentDepth + 1); // Update the best score based on which player is playing if (board.GetCurrentPlayer() == player) { if (currentReturn[0] > miniMaxReturn[0]) { miniMaxReturn.Clear(); miniMaxReturn.Add(currentReturn[0]); //miniMaxReturn[0] = currentReturn[0]; foreach(int val in move) miniMaxReturn.Add(val); } } else { if (currentReturn[0] < miniMaxReturn[0]) { miniMaxReturn.Clear(); miniMaxReturn.Add(currentReturn[0]); //miniMaxReturn[0] = currentReturn[0]; foreach (int val in move) miniMaxReturn.Add(val); } } } return miniMaxReturn; }