public int MinMax(int depth, bool isMaximiser, int alpha, int beta, MainGame m) { //end of specified traversal length, evaluate board if (depth == 0) { int k = -EvaluateBoard(m); return(k); } List <Mutare> newGameMoves = new List <Mutare>(); List <Mutare> pnewGameMoves = new List <Mutare>(); if (isMaximiser) { if (m.DatePartidaCastig.Culoare == CuloarePiesa.Negru) { pnewGameMoves = m.GetToateMutarilePosibileWhite(m); } else { pnewGameMoves = m.GetToateMutarilePosibileBlack(m); } newGameMoves = pnewGameMoves.OrderByDescending(o => o.Value).ToList(); int bestMove = Int32.MinValue; for (int i = 0; i < newGameMoves.Count; i++) { Mutare myMove = newGameMoves[i]; string tempToName = m.pieceIdBoard[myMove.To].PieceName; int tempToValue = m.pieceIdBoard[myMove.To].PieceValue; string tempFromName = m.pieceIdBoard[myMove.From].PieceName; int tempFromValue = m.pieceIdBoard[myMove.From].PieceValue; int minValue = m.pieceIdBoard[myMove.To].PieceValue; ExecutaMutarea(m, myMove); bestMove = Math.Max(bestMove, MinMax(depth - 1, false, alpha, beta, m)); UndoMove(m, myMove, tempToName, tempToValue, tempFromName, tempFromValue); alpha = Math.Max(alpha, bestMove); if (alpha >= beta) { break; } } return(bestMove); } else { if (m.DatePartidaCastig.Culoare != CuloarePiesa.Negru) { pnewGameMoves = m.GetToateMutarilePosibileWhite(m); } else { pnewGameMoves = m.GetToateMutarilePosibileBlack(m); } newGameMoves = pnewGameMoves.OrderByDescending(o => o.Value).ToList(); int bestMove = Int32.MaxValue; for (int i = 0; i < newGameMoves.Count; i++) { Mutare myMove = newGameMoves[i]; int maxValue = m.pieceIdBoard[myMove.To].PieceValue; string tempToName = m.pieceIdBoard[myMove.To].PieceName; int tempToValue = m.pieceIdBoard[myMove.To].PieceValue; string tempFromName = m.pieceIdBoard[myMove.From].PieceName; int tempFromValue = m.pieceIdBoard[myMove.From].PieceValue; int minValue = m.pieceIdBoard[myMove.To].PieceValue; ExecutaMutarea(m, myMove); bestMove = Math.Min(bestMove, MinMax(depth - 1, true, alpha, beta, m)); UndoMove(m, myMove, tempToName, tempToValue, tempFromName, tempFromValue); beta = Math.Min(beta, bestMove); if (alpha >= beta) { break; } } return(bestMove); } }