Example #1
0
        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
        }
Example #2
0
        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)]);
        }
Example #3
0
        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);
        }