Exemplo n.º 1
0
        public GamePlayerMoveResult MakeMove(PieceColour pieceColour, GameState gameState)
        {
            var currentMoves = gameState.CalculateAvailableMoves(pieceColour).ToList();

            if (!currentMoves.Any())
            {
                return(new GamePlayerMoveResult(null, MoveStatus.NoLegalMoves));
            }

            var moveWeights = new List <Tuple <double, GameMove> >();

            foreach (var move in currentMoves)
            {
                var moveMetric = move.CalculateGameMoveMetrics(pieceColour);

                double weightedResult = 0;
                weightedResult += KingWeight * moveMetric.CreatedFriendlyKings;
                weightedResult += NextAvailableMoveCountWeight * moveMetric.FriendlyMovesAvailable;
                weightedResult += OpponentNextAvailableMoveCountWeight * moveMetric.OpponentMovesAvailable;
                weightedResult += NextMovePiecesAtRiskWeight * moveMetric.NextMoveFriendlyPiecesAtRisk;
                weightedResult += NextMovePiecesToTakeWeight * moveMetric.NextMoveOpponentPiecesAtRisk;
                weightedResult += NextMoveKingWeight * moveMetric.NextMoveFriendlyKingsCreated;
                weightedResult += OpponentNextMoveKingWeight * moveMetric.NextMoveOpponentKingsCreated;

                var resultTuple = new Tuple <double, GameMove>(weightedResult, move);
                moveWeights.Add(resultTuple);
            }

            var selectedMove      = moveWeights.OrderByDescending(m => m.Item1).First().Item2;
            var selectedGameState = selectedMove.PerformMove();
            var result            = new GamePlayerMoveResult(selectedGameState, MoveStatus.SuccessfulMove);

            return(result);
        }
Exemplo n.º 2
0
 public GamePlayerMoveResult MakeMove(PieceColour pieceColour, GameState gameState)
 {
     CurrentTurn = true;
     GamePlayerMoveResult gamePlayerMoveResult;
     // check if human has lost
     if (gameState.CalculateAvailableMoves(pieceColour).Count > 0)
     {
         if (null == SelectedMove)
         {
             throw new ArgumentException("SelectedMove is null.");
         }
         gamePlayerMoveResult = new GamePlayerMoveResult(SelectedMove.PerformMove(), MoveStatus.SuccessfulMove);
     }
     else
     {
         gamePlayerMoveResult = new GamePlayerMoveResult(gameState, MoveStatus.NoLegalMoves);
     }
     SelectedMove = null;
     CurrentTurn = false;
     return gamePlayerMoveResult;
 }
Exemplo n.º 3
0
        public GamePlayerMoveResult MakeMove(PieceColour pieceColour, GameState gameState)
        {
            CurrentTurn = true;
            GamePlayerMoveResult gamePlayerMoveResult;

            // check if human has lost
            if (gameState.CalculateAvailableMoves(pieceColour).Count > 0)
            {
                while (null == SelectedMove)
                {
                    Thread.Sleep(10);
                }
                gamePlayerMoveResult = new GamePlayerMoveResult(SelectedMove.PerformMove(), MoveStatus.SuccessfulMove);
            }
            else
            {
                gamePlayerMoveResult = new GamePlayerMoveResult(gameState, MoveStatus.NoLegalMoves);
            }
            SelectedMove = null;
            CurrentTurn  = false;
            return(gamePlayerMoveResult);
        }
Exemplo n.º 4
0
        public GamePlayerMoveResult MakeMove(PieceColour pieceColour, GameState gameState)
        {
            // build list of previous game states
            var       previousGameStates = new HashSet <GameState>();
            GameState lastGameState      = gameState;

            while ((lastGameState = lastGameState.PreviousGameState) != null)
            {
                previousGameStates.Add(lastGameState);
            }

            var currentMoves = gameState.CalculateAvailableMoves(pieceColour).ToList();

            if (!currentMoves.Any())
            {
                return(new GamePlayerMoveResult(null, MoveStatus.NoLegalMoves));
            }

            var distinctMoves = currentMoves.Where(gm => !previousGameStates.Contains(gm.GameState)).ToList();

            if (!distinctMoves.Any())
            {
                return(new GamePlayerMoveResult(null, MoveStatus.Resign));
            }

            var moveWeights = new List <Tuple <double, GameMove> >();

            foreach (var move in distinctMoves)
            {
                var moveMetric = move.CalculateGameMoveMetrics(pieceColour);

                var inputs = new double[] {
                    moveMetric.CreatedFriendlyKings,
                    moveMetric.FriendlyMovesAvailable,
                    moveMetric.OpponentMovesAvailable,
                    moveMetric.NextMoveFriendlyPiecesAtRisk,
                    moveMetric.NextMoveOpponentPiecesAtRisk,
                    moveMetric.NextMoveFriendlyKingsCreated,
                    moveMetric.NextMoveOpponentKingsCreated,
                    moveMetric.TotalPieces / 100.0,
                    moveMetric.TotalFriendlyPieces / 100.0,
                    moveMetric.TotalOpponentPieces / 100.0,
                    moveMetric.TotalMinionPieces / 100.0,
                    moveMetric.TotalFriendlyMinionPieces / 100.0,
                    moveMetric.TotalOpponentMinionPieces / 100.0,
                    moveMetric.TotalKingPieces / 100.0,
                    moveMetric.TotalFriendlyKingPieces / 100.0,
                    moveMetric.TotalOpponentKingPieces / 100.0,
                    moveMetric.FriendlyMinionsHome / 100.0,
                    moveMetric.OpponentMinionsHome / 100.0,
                    moveMetric.FriendlyMinionsAway / 100.0,
                    moveMetric.OpponentMinionsAway / 100.0,
                    moveMetric.OpponentPiecesTaken / 100.0
                };

                double weightedResult = Net.Calculate(inputs).Single();

                var resultTuple = new Tuple <double, GameMove>(weightedResult, move);
                moveWeights.Add(resultTuple);
            }

            var selectedMove      = moveWeights.OrderByDescending(m => m.Item1).First().Item2;
            var selectedGameState = selectedMove.PerformMove();
            var result            = new GamePlayerMoveResult(selectedGameState, MoveStatus.SuccessfulMove);

            return(result);
        }