public short getNextPlayer(Desk desk) { //get opposite player, check if players can move short oppositePlayer = getOppositePlayer(desk.getCurrentPlayer()); if (getPossibleMoves(desk, oppositePlayer, true).Count > 0) { return(oppositePlayer); } else if (getPossibleMoves(desk, desk.getCurrentPlayer(), true).Count > 0) { return(desk.getCurrentPlayer()); } return(-1); //neither of players can move }
public Move getBestMove(Desk desk, GameRules rules) { movesInspected = 0; int topMoveScore = int.MinValue; int currentScore = 0; short currentPlayer = desk.getCurrentPlayer(); short oppositePlayer = rules.getOppositePlayer(currentPlayer); bool maximizingPlayer = false; ArrayList topMoves = new ArrayList(); //check game end - both players have some fields and at least one can move if (rules.isGameEnd(desk)) { return(null); } ArrayList possiblePlayerMoves = rules.getPossibleMoves(desk, currentPlayer); if (possiblePlayerMoves.Count == 0) //no possible moves for current player, switch to another player { possiblePlayerMoves = rules.getPossibleMoves(desk, oppositePlayer); oppositePlayer = currentPlayer; maximizingPlayer = !maximizingPlayer; } //loop possible moves foreach (Move move in possiblePlayerMoves) { //try the move and run minimax desk.makeMove(move); currentScore = minimax(desk, rules, depthMax, oppositePlayer, maximizingPlayer); desk.undoMove(move); if (currentScore > topMoveScore) //new top move found { topMoveScore = currentScore; topMoves.Clear(); topMoves.Add(move); } else if (currentScore == topMoveScore) //more moves with same value found { topMoves.Add(move); } } if (!randomMoveSelection) { return((Move)topMoves[0]); } //pick randomly one of the top moves Random r = new Random(); return((Move)topMoves[r.Next(0, topMoves.Count)]); }
private void startAIComputing(object sender, DoWorkEventArgs e) { // run ai with its own desk, while computing the desk is modified Desk aiDesk = new Desk(rules.getDeskSize(), rules.getPiecesPerPlayer()); aiDesk.setPlayerPieces(desk.getPlayerFields(GameVar.PLAYER_WHITE), GameVar.PLAYER_WHITE); aiDesk.setPlayerPieces(desk.getPlayerFields(GameVar.PLAYER_BLACK), GameVar.PLAYER_BLACK); aiDesk.setCurrentPlayer(desk.getCurrentPlayer()); aiMove = engine.getBestMove(aiDesk, rules); }