コード例 #1
0
ファイル: Unit.cs プロジェクト: Julien-Marcou/SmallWorld
        public FightIssue Fight(Unit defender)
        {
            Unit attacker = this;

            int currentRound = 1;
            int minRound = 3;
            int maxRound = minRound + Math.Max(attacker.HealthPoints, defender.HealthPoints);
            int totalRound = randomizer.Next(minRound, maxRound);

            double baseChanceToLose = 0.5;

            while (currentRound <= totalRound && attacker.IsAlive() && defender.IsAlive())
            {
                double realAttackAttacker = attacker.GetRealAttack();
                double realDefenseDefender = defender.GetRealDefense();
                double balanceOfPower;
                double chanceToLose;

                // Fighting random chance
                if (realAttackAttacker < realDefenseDefender)
                {
                    balanceOfPower = 1 - (realAttackAttacker / realDefenseDefender);
                    chanceToLose = baseChanceToLose * (1 + balanceOfPower);
                }
                else
                {
                    balanceOfPower = 1 - (realDefenseDefender / realAttackAttacker);
                    chanceToLose = baseChanceToLose * (1 - balanceOfPower);
                }

                double random = randomizer.NextDouble();

                // Attacker lose one health point
                if (random < chanceToLose)
                {
                    attacker.HealthPoints--;
                }
                // Defender lose one health point
                else
                {
                    defender.HealthPoints--;
                }

                // Next round
                currentRound++;
            }

            // Before attacker died
            if (attacker.IsDead())
            {
                attacker.BeforeDying();
            }
            // Before defender died
            else if (defender.IsDead())
            {
                defender.BeforeDying();
            }

            // Check again, because, before dying, some unit may resurrected (e.g: the elf unit)

            // Attacker died => Lose
            if (attacker.IsDead())
            {
                // After defender kills
                defender.AfterKill();
                return FightIssue.Lose;
            }
            // Defender died => Win
            else if (defender.IsDead())
            {
                // After attacker kills
                attacker.AfterKill();
                return FightIssue.Win;
            }
            // No unit died => Draw
            else
            {
                return FightIssue.Draw;
            }
        }