internal ContinueAttackResponse DecideToMakeNewAttack(ContinueAttackRequest continueAttackRequest)
        {
            ContinueAttackResponse response = new ContinueAttackResponse();

            response.ContinueAttacking = false;
            return(response);
        }
        internal ContinueAttackResponse DecideToMakeNewAttack(ContinueAttackRequest continueAttackRequest)
        {
            ContinueAttackResponse response = new ContinueAttackResponse();
            var myTerritories = GetMyTerritories(continueAttackRequest.Board);
            var rand          = new Random();

            foreach (var territory in myTerritories)
            {
                var territoryNeighbors = GetNeighbors(territory, continueAttackRequest.Board);
                foreach (var neighbor in territoryNeighbors)
                {
                    if (neighbor.Armies == 0 && territory.Armies > 3)
                    {
                        response.ContinueAttacking = true;
                        return(response);
                    }
                    if (territory.Armies > neighbor.Armies * 2)
                    {
                        if (rand.Next(10) != 1)
                        {
                            break;
                        }
                        response.ContinueAttacking = true;
                        return(response);
                    }
                }
            }
            response.ContinueAttacking = false;
            return(response);
        }
        public ContinueAttackResponse WhenToContinueAttack(ContinueAttackRequest continueAttackRequest)
        {
            ContinueAttackResponse attackResponse = new ContinueAttackResponse();

            attackResponse.ContinueAttacking = (continueAttackRequest.AttackingTerritorry.Armies > continueAttackRequest.DefendingTerritorry.Armies);
            return(attackResponse);
        }
Пример #4
0
        public ContinueAttackResponse ContinueAttack([FromBody] ContinueAttackRequest continueAttackRequest)
        {
            ContinueAttackResponse response = new ContinueAttackResponse();

            response.ContinueAttacking = true;

            return(response);
        }
Пример #5
0
        public ContinueAttackResponse WhenToContinueAttack(ContinueAttackRequest continueAttackRequest)
        {
            ContinueAttackResponse continueAttackResponse = new ContinueAttackResponse();

            if (continueAttackRequest.AttackingTerritorry.Armies > continueAttackRequest.DefendingTerritorry.Armies + 1)
            {
                continueAttackResponse.ContinueAttacking = true;
                return(continueAttackResponse);
            }
            continueAttackResponse.ContinueAttacking = false;
            return(continueAttackResponse);
        }
Пример #6
0
        private ContinueAttackResponse createContinueAttackResponse(ContinueAttackRequest continueAttackRequest)
        {
            Random rnd = new Random();
            ContinueAttackResponse response = new ContinueAttackResponse();

            if (rnd.Next(1, 3) == 1)
            {
                response.ContinueAttacking = false;
            }
            else
            {
                response.ContinueAttacking = true;
            }
            return(response);
        }
        internal ContinueAttackResponse DecideToMakeNewAttack(ContinueAttackRequest continueAttackRequest)
        {
            ContinueAttackResponse       response      = new ContinueAttackResponse();
            IEnumerable <BoardTerritory> myTerritories = GetMyTerritories(continueAttackRequest.Board);
            BoardTerritory topDog = new BoardTerritory();

            topDog.Armies = 0;
            foreach (BoardTerritory territory in myTerritories)
            {
                if (territory.Armies > topDog.Armies)
                {
                    if (GetNumBadTerritories(territory, continueAttackRequest.Board) > 0)
                    {
                        topDog = territory;
                    }
                }
            }
            IEnumerable <BoardTerritory> tDogNeighbors = GetNeighbors(topDog, continueAttackRequest.Board);
            BoardTerritory smallPup = new BoardTerritory();

            smallPup.Armies = 99999;
            foreach (BoardTerritory t in tDogNeighbors)
            {
                if (!myTerritories.Contains(t) && t.Armies < smallPup.Armies)
                {
                    smallPup = t;
                }
            }

            if (topDog.Armies > (2 * smallPup.Armies))
            {
                response.ContinueAttacking = true;
            }
            else
            {
                response.ContinueAttacking = false;
            }
            return(response);
        }
Пример #8
0
        public async Task DoPlayerBattle(ApiPlayer player)
        {
            if (game.PlayerCanAttack(player))
            {
                var  failedTries = 0;
                bool hasCard     = false;
                ContinueAttackResponse anotherAttackResponse = new ContinueAttackResponse {
                    ContinueAttacking = false
                };
                do
                {
                    TryAttackResult attackResult = new TryAttackResult {
                        AttackInvalid = false
                    };
                    Territory attackingTerritory = null;
                    Territory defendingTerritory = null;


                    do
                    {
                        logger.LogInformation($"Asking {player.Name} where they want to attack...");

                        var beginAttackResponse = await askForAttackLocationAsync(player, BeginAttackStatus.PreviousAttackRequestFailed);

                        try
                        {
                            attackingTerritory = game.Board.GetTerritory(beginAttackResponse.From);
                            defendingTerritory = game.Board.GetTerritory(beginAttackResponse.To);

                            logger.LogInformation($"{player.Name} wants to attack from {attackingTerritory} to {defendingTerritory}");

                            attackResult = game.TryAttack(player.Token, attackingTerritory, defendingTerritory);

                            if (attackResult.BattleWasWon && !hasCard)
                            {
                                player.PlayerCards.Add(new Card());
                                hasCard = true;
                            }
                        }
                        catch (Exception ex)
                        {
                            attackResult = new TryAttackResult {
                                AttackInvalid = true, Message = ex.Message
                            };
                        }
                        if (attackResult.AttackInvalid)
                        {
                            logger.LogError($"Invalid attack request! {player.Name} from {attackingTerritory} to {defendingTerritory} ");
                            failedTries++;
                            if (failedTries == MaxFailedTries)
                            {
                                BootPlayerFromGame(player);
                                logger.LogError($"Player {player.Name} Booted! Due to attack error");
                                return;
                            }
                        }
                    } while (attackResult.AttackInvalid);
                    while (attackResult.CanContinue)
                    {
                        var continueResponse = await askContinueAttackingAsync(player, attackingTerritory, defendingTerritory);

                        if (continueResponse.ContinueAttacking)
                        {
                            logger.LogInformation("Keep attacking!");
                            attackResult = game.TryAttack(player.Token, attackingTerritory, defendingTerritory);
                            if (attackResult.BattleWasWon && !hasCard)
                            {
                                player.PlayerCards.Add(new Card());
                                hasCard = true;
                            }
                        }
                        else
                        {
                            logger.LogInformation("run away!");
                            break;
                        }
                    }

                    if (game.PlayerCanAttack(player))
                    {
                        anotherAttackResponse = await AskMakeAnotherAttackAsync(player, attackingTerritory, defendingTerritory);
                    }
                    else
                    {
                        anotherAttackResponse.ContinueAttacking = false;
                    }
                } while (anotherAttackResponse.ContinueAttacking);
            }
            else
            {
                logger.LogWarning($"{player.Name} cannot attack.");
            }
        }