예제 #1
0
        // Utility Methods
        // Takes a Shot at another Player
        public bool ShootAt(Duelist target)
        {
            double missChance = rand.NextDouble();

            // For making sure Miss Chance is random
            //Console.WriteLine("\n\n-----" + missChance + "-----\n\n");

            if (GetHitChance() > missChance)
            {
                target.Kill();
                return(true);
            }
            else
            {
                return(false);
            }
        }
        // Experimental Data Implies that by default
        // Aaron Win Rate = 36%
        // Bob Win Rate = 42%
        // Charlie Win Rate = 22%

        // Experiment Data with Aaron missing his First Shot Implies
        // Aaron Win Rate = 42%
        // Bob Win Rate = 25%
        // Charlie Win Rate = 33%

        // Explanation is that because Aaron Misses, the other two
        // are guaranteed to shoot eachother no matter whether Bob
        // hits or not, so Aaron only has one target to worry about
        // causing a net increase in his odds

        public static void Main(string[] args)
        {
            // Creates the 3 Duelists
            Duelist aaron   = new Duelist("Aaron", DUELIST_ONE_HIT_CHANCE, true);
            Duelist bob     = new Duelist("Bob", DUELIST_TWO_HIT_CHANCE, true);
            Duelist charlie = new Duelist("Charlie", DUELIST_THREE_HIT_CHANCE, true);

            // Temporary Duelist for storing winner
            Duelist winner;

            // Variables
            int numRoundsTotal = 0;

            // Aaron's Stats
            int    roundsAaronWon = 0;
            double aaronWinRate   = 0;

            // Bob's Stats
            int    roundsBobWon = 0;
            double bobWinRate   = 0;

            // Charlie's Stats
            int    roundsCharlieWon = 0;
            double charlieWinRate   = 0;

            // Gives the User Feedback on whether Strategy is being used
            if (AARON_MISS)
            {
                Console.WriteLine("{0} is employing the strategy of missing their first shot!\n", aaron.GetName());
            }

            // Runs the given number of rounds
            while (numRoundsTotal < MAX_ROUNDS)
            {
                // Revives All Duelists Before Beginning
                aaron.Respawn();
                bob.Respawn();
                charlie.Respawn();

                // Stores Duelist to update Statistics
                winner = BeginDuelistMatch(aaron, bob, charlie);

                // Checks who won and adds to their win count
                if (winner.Equals(aaron))
                {
                    roundsAaronWon++;
                }
                else if (winner.Equals(bob))
                {
                    roundsBobWon++;
                }
                else if (winner.Equals(charlie))
                {
                    roundsCharlieWon++;
                }

                // Increments number of Total Rounds
                numRoundsTotal++;
            }

            // Calculates Win Rates
            aaronWinRate   = Math.Round((roundsAaronWon / (double)numRoundsTotal) * 100, 2);
            bobWinRate     = Math.Round((roundsBobWon / (double)numRoundsTotal) * 100, 2);
            charlieWinRate = Math.Round((roundsCharlieWon / (double)numRoundsTotal) * 100, 2);

            // Prints out Relevant Information
            Console.WriteLine("{0}\nWins: {1}\nWin Rate: {2}%\n", aaron.ToString(), roundsAaronWon, aaronWinRate);
            Console.WriteLine("{0}\nWins: {1}\nWin Rate: {2}%\n", bob.ToString(), roundsBobWon, bobWinRate);
            Console.WriteLine("{0}\nWins: {1}\nWin Rate: {2}%\n", charlie.ToString(), roundsCharlieWon, charlieWinRate);
            Console.WriteLine("\nTotal Rounds Played: {0}", numRoundsTotal);

            // Prevents Program from Closing
            Console.ReadLine();
        }
        // Runs the Match, returns winner
        public static Duelist BeginDuelistMatch(Duelist duelistOne, Duelist duelistTwo, Duelist duelistThree)
        {
            // Variables
            int  numDuelistsLeft = 3;
            bool shotHit;

            // Variables for Intentionally Missing
            bool duelistOneMissIntentionally = AARON_MISS;

            // Runs until there is only one Duelist Left
            while (numDuelistsLeft > 1)
            {
                // Clause for Testing Aaron missing Intentionally
                if (duelistOneMissIntentionally)
                {
                    duelistOne.SetHitChance(0);
                }

                // If the first Duelist is alive
                if (duelistOne.GetIsAlive() == true)
                {
                    // Shoots the most dangerous first
                    if (duelistThree.GetIsAlive() == true)
                    {
                        shotHit = duelistOne.ShootAt(duelistThree);
                    }

                    // Shoots at the only other
                    else
                    {
                        shotHit = duelistOne.ShootAt(duelistTwo);
                    }

                    // If shot hits decrement number of Duelists
                    if (shotHit)
                    {
                        numDuelistsLeft--;
                    }
                }

                // If the second Duelist is alive
                if (duelistTwo.GetIsAlive() == true)
                {
                    // Shoots the most dangerous first
                    if (duelistThree.GetIsAlive() == true)
                    {
                        shotHit = duelistTwo.ShootAt(duelistThree);
                    }

                    // Shoots at only other
                    else
                    {
                        shotHit = duelistTwo.ShootAt(duelistOne);
                    }

                    // If shot hits decrement number of Duelists
                    if (shotHit)
                    {
                        numDuelistsLeft--;
                    }
                }

                // If the third Duelist is alive
                if (duelistThree.GetIsAlive() == true)
                {
                    // Shoots the most dangerous first
                    if (duelistTwo.GetIsAlive() == true)
                    {
                        shotHit = duelistThree.ShootAt(duelistTwo);
                    }

                    // Shoots at only other
                    else
                    {
                        shotHit = duelistThree.ShootAt(duelistOne);
                    }

                    // If shot hits decrement number of Duelists
                    if (shotHit)
                    {
                        numDuelistsLeft--;
                    }
                }

                // Returns Aaron's hit chance back to normal and never misses again
                if (duelistOneMissIntentionally)
                {
                    duelistOneMissIntentionally = false;
                    duelistOne.SetHitChance(DUELIST_ONE_HIT_CHANCE);
                }
            }

            // If Duelist One lived return them
            if (duelistOne.GetIsAlive())
            {
                return(duelistOne);
            }

            // If Duelist Two lived return them
            else if (duelistTwo.GetIsAlive())
            {
                return(duelistTwo);
            }

            // If neither One or Two lived, then Duelist Three did, return them
            else
            {
                return(duelistThree);
            }
        }