Ejemplo n.º 1
0
        private BestMove minimax(int depth, Player player, int alpha, int beta)
        {
            BestMove          currentMove;
            List <BoardSpace> spaces = generateMoves();

            spaces.Shuffle();
            int    score;
            string bestPosition = null;



            if (spaces.Count == 0 || depth == 0)
            {
                score = evaluate();
                return(new BestMove(score, bestPosition));
            }
            else
            {
                foreach (BoardSpace space in spaces)
                {
                    space.owner = BoardState.GetOwner(player.Token);
                    if (player.Token == currentPlayer.Token)
                    {
                        currentMove = minimax(depth - 1, opponentPlayer, alpha, beta);
                        score       = currentMove.Score;
                        if (score > alpha)
                        {
                            alpha        = score;
                            bestPosition = space.position;
                        }
                    }
                    else
                    {
                        currentMove = minimax(depth - 1, currentPlayer, alpha, beta);
                        score       = currentMove.Score;
                        if (score < beta)
                        {
                            beta         = score;
                            bestPosition = space.position;
                        }
                    }
                    space.owner = Owner.Empty;
                    if (alpha >= beta)
                    {
                        break;
                    }
                }
            }

            return(new BestMove((player.Token == currentPlayer.Token)?alpha:beta, bestPosition));
        }
Ejemplo n.º 2
0
        public int evaluate()
        {
            int   score = 0;
            Owner currentPlayerOwner  = BoardState.GetOwner(currentPlayer.token);
            Owner opponentPlayerOwner = BoardState.GetOwner(opponentPlayer.token);

            score += EvaluateWin(currentBoard.win1, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win2, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win3, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win4, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win5, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win6, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win7, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win8, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win9, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win10, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win11, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win12, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win13, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win14, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win15, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win16, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win17, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win18, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win19, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win20, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win21, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win22, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win23, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win24, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win25, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win26, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win27, currentPlayerOwner, opponentPlayerOwner);
            score += EvaluateWin(currentBoard.win28, currentPlayerOwner, opponentPlayerOwner);

            return(score);
        }