コード例 #1
0
        public void AttackIsSafe_AttackingEnemyRegion_ReturnsFalse()
        {
            var fromRegion = _gameState.AddRegion(_myName, 2);
            var toRegion   = _gameState.AddRegion(TestGameState.EnemyName, 2);

            fromRegion.Neighbors.Add(toRegion);

            var result = BattleAnalysis.AttackIsSafe(fromRegion, 1, toRegion, toRegion.Armies, _myName, 0.90f);

            Assert.IsFalse(result);
        }
コード例 #2
0
        public void SimulateBattle_Attackers10Defenders10Threshold90_()
        {
            var result = BattleAnalysis.AnalyzeBattle(0.90f, 10, 10);

            Assert.AreEqual(4, result.AttackerRemainingArmies);
            Assert.AreEqual(5, result.AttackerRemainingArmiesHigh);
            Assert.AreEqual(1, result.AttackerRemainingArmiesLow);
            Assert.AreEqual(4, result.DefenderRemainingArmies);
            Assert.AreEqual(7, result.DefenderRemainingArmiesHigh);
            Assert.AreEqual(2, result.DefenderRemainingArmiesLow);
        }
コード例 #3
0
        public void AttackIsSafe_AttackingNeutralRegion_ReturnsTrue()
        {
            var fromRegion = _gameState.AddRegion(_myName, 2);
            var toRegion   = _gameState.AddRegion(Constants.NeutralPlayerName, 2);

            fromRegion.Neighbors.Add(toRegion);

            var result = BattleAnalysis.AttackIsSafe(fromRegion, 1, toRegion, toRegion.Armies, _myName, 0.90f);

            Assert.IsTrue(result);
        }
コード例 #4
0
        public void SimulateBattle_Attackers10Defenders5Threshold75_()
        {
            var result = BattleAnalysis.AnalyzeBattle(0.75f, 5, 10);

            Assert.AreEqual(7, result.AttackerRemainingArmies);
            Assert.AreEqual(8, result.AttackerRemainingArmiesHigh);
            Assert.AreEqual(5, result.AttackerRemainingArmiesLow);
            Assert.AreEqual(0, result.DefenderRemainingArmies);
            Assert.AreEqual(1, result.DefenderRemainingArmiesHigh);
            Assert.AreEqual(0, result.DefenderRemainingArmiesLow);
        }
コード例 #5
0
        public void DetermineMaximumSafeAttack_AttackingEnemyRegionWithNeighbors_Returns0()
        {
            var fromRegion = _gameState.AddRegion(_myName, 2);
            var toRegion   = _gameState.AddRegion(TestGameState.EnemyName, 2);
            var neighbor2  = _gameState.AddRegion(Constants.NeutralPlayerName, 2);
            var neighbor3  = _gameState.AddRegion(Constants.NeutralPlayerName, 2);

            fromRegion.Neighbors.Add(toRegion);
            fromRegion.Neighbors.Add(neighbor2);
            fromRegion.Neighbors.Add(neighbor3);

            var result = BattleAnalysis.DetermineMaximumSafeAttack(fromRegion, toRegion, TestGameState.MyPlayerName, 0.9f);

            Assert.AreEqual(0, result);
        }
コード例 #6
0
        public void AttackIsSafe_AttackingEnemyRegionWithNeighbors_ReturnsTrue()
        {
            var fromRegion = _gameState.AddRegion(_myName, 2);
            var toRegion   = _gameState.AddRegion(TestGameState.EnemyName, 2);
            var neighbor2  = _gameState.AddRegion(Constants.NeutralPlayerName, 2);
            var neighbor3  = _gameState.AddRegion(Constants.NeutralPlayerName, 2);

            fromRegion.Neighbors.Add(toRegion);
            fromRegion.Neighbors.Add(neighbor2);
            fromRegion.Neighbors.Add(neighbor3);

            var result = BattleAnalysis.AttackIsSafe(fromRegion, 1, toRegion, toRegion.Armies, _myName, 0.90f);

            Assert.IsFalse(result);
        }
コード例 #7
0
        private static int PlaceOffensiveArmies(int armiesLeft, GameState state, List <PlaceArmiesMove> placeArmiesMoves)
        {
            if (armiesLeft == 0)
            {
                return(armiesLeft);
            }

            foreach (var targetRegion in StrategicMap.UncontrolledRegionsByValue)
            {
                foreach (var offensiveRegion in targetRegion.Neighbors)
                {
                    if (offensiveRegion.PlayerName == GameState.MyPlayerName)
                    {
                        BattleResult result = BattleAnalysis.AnalyzeBattle(confidence, targetRegion.Armies, offensiveRegion.Armies + armiesLeft);
                        if (result.AttackerExpectedToWinAtAll())
                        {
                            if (offensiveRegion.Armies > Constants.DeadlockThreshold && armiesLeft > 1)
                            {
                                armiesLeft = PlaceFailSafeArmy(offensiveRegion, 1, armiesLeft, placeArmiesMoves);
                            }

                            placeArmiesMoves.Add(new PlaceArmiesMove(GameState.MyPlayerName, offensiveRegion, armiesLeft));
                            armiesLeft = 0;
                        }
                    }

                    if (armiesLeft == 0)
                    {
                        break;
                    }
                }

                if (armiesLeft == 0)
                {
                    break;
                }
            }

            if (armiesLeft > 0)
            {
                PlaceRemainingArmies(armiesLeft, placeArmiesMoves);
                armiesLeft = 0;
            }

            return(armiesLeft);
        }
コード例 #8
0
        private static void ConsiderAttacks(Region fromRegion, List <Region> neighbors, List <AttackTransferMove> attackTransferMoves, ConditionalAttackList conditionalAttacks)
        {
            neighbors.Sort((a, b) => b.StrategicValue.CompareTo(a.StrategicValue));
            Region conditionalAttackTarget = null;

            foreach (var toRegion in neighbors)
            {
                if (toRegion.PlayerName != GameState.MyPlayerName)
                {
                    var attackingArmies = BattleAnalysis.DetermineMaximumSafeAttack(fromRegion, toRegion, GameState.MyPlayerName, _confidence);

                    // it's not safe to attack this guy alone, but if we have armies left and others will attack too, maybe it will be
                    if (attackingArmies == 0 && conditionalAttackTarget == null)
                    {
                        conditionalAttackTarget = toRegion;
                    }

                    // don't attack with just one army, it's pretty much always a waste
                    if (attackingArmies > 1)
                    {
                        attackTransferMoves.Add(new AttackTransferMove(GameState.MyPlayerName, fromRegion, toRegion, attackingArmies));
                        fromRegion.Armies -= attackingArmies; // TODO: this isn't entirely true - maybe revisit it in the future
                    }
                }

                if (fromRegion.Armies <= 1)
                {
                    break;
                }
            }

            if (fromRegion.Armies > 2 && conditionalAttackTarget != null)
            {
                conditionalAttacks.Add(fromRegion, conditionalAttackTarget, fromRegion.Armies - 1);
            }
        }
コード例 #9
0
        public void MaximumArmiesNecessaryToConquer_Attackers24Defenders1Threshold99_()
        {
            var result = BattleAnalysis.MaximumArmiesNecessaryToConquer(0.99f, 1, 24);

            Assert.AreEqual(6, result);
        }