This is the solution document for the challenge called ChallengeHeroMonsterClasses Part 1. The purpose of this challenge is to test your knowledge on creating classes and creating properties and methods for those classes. As always, look through only as much of this solution as you need in order to solve the issue you're having.
To begin, create a new ASP.NET Web Application called 'ChallengeHeroMonsterClassesPart1' and add a Default.aspx page as we've done many times in this series. Once added, navigate to Default.aspx.cs and add a new Character class underneath the Default class' definition:
The challenge specifies that this class should have a series of properties within its definition: Name, Health, DamageMaximum and AttackBonus. While no data types were specifically given, we'll initialize these properties with the following:
In order to add these properties to the class, we can make use of IntelliSense to generate property stubs. Inside the opening and closing brackets for the Character class, type the word 'prop' and press the Tab key twice to have the following stub generated for you:
This sets up the format correctly for initializing a class property. Repeat this process three times to have four total stubs generated for you:
Next, replace the data types and names with those previously specified to add the properties to our Character class:
The next requirement of this challenge is to create two methods: Attack() and Defend(). Attack() will return an integer value representing the damage inflicted. This amount will be randomly determined. This means that we'll be using the Random class to generate a random integer value representing the damage.
Beneath the properties of the Character class, but still within the class definition, create the Attack() method with an integer return value. Inside the code block of that method, create an instance of the Random class:
Next, create an integer called damage, which will represent the amount of damage this attack will deal. Set this damage variable equal to a random value, making use of that random instance. Call the random.Next() method, passing in 0 for the lower bound and DamageMaximum for the upper bound:
Then, simply return that damage value to complete this Attack() method:
Now that the attack has been calculated, we need to create another method for defending. Still within the Character class' code block, create a new Defend() method that takes in an integer damage amount:
This method will simply take the health of the calling Character and subtract the damage dealt from their health. To do this, use the 'this' keyword to access the Health property of the Character (hero or monster) who called the method, and subtract the damage amount from their health:
According to the requirements of this challenge, we need to create two characters inside the Page_Load: A hero and a monster. We'll begin with the hero:
Next, let's initialize the hero's Name, Health, DamageMaximum and AttackBonus properties to the following values:
In the same format, create a new Character called monster and initialize its properties to the following values:
The next requirement set out for us is to perform the battle, with both opponents taking turns attacking and defending. The hero will go first. To set this up, create a new integer called damage within the Page_Load. Initialize its value to the hero's Attack() method:
Directly underneath this code, call the monster's Defend() method, passing in that same damage integer:
Follow the same pattern to reassign the damage integer to the returned result of the monster's Attack() method, then call the hero's Defend() beneath it:
While this method of reusing the damage variable might not be effective in other cases, such as in the case of multiple rounds of attacking and defending, it works for this example. Ideally, you may want instead to create separate heroDamage and monsterDamage variables, but that is optional in this case.
The final requirement of this challenge is to create a Label Server Control on the Default page and display the results of the battle to it using a helper method. Let's begin by adding the Label. Navigate to the Default.aspx page and drag and drop a Label onto the form. Clear out its Text property and name it resultLabel, following the naming convention used in this course:
Return to the Default.aspx.cs page and create a new method within the Default class called printStats() that takes in a Character as an input parameter:
Inside this method, we'll simply add to the resultLabel's text (not replace, because this method will be called twice). Use a formatted string displaying the character's Name, Health, DamageMaximum, and AttackBonus properties:
Next, return to the bottom of the Page_Load event and call printStats() twice; once for the hero and once for the monster:
Finally, save and run your project to see the result:
This concludes the solution to the first part of this Hero/Monster Classes challenge. Most of the details should be familiar; creating methods, calling them, etc. However, the concept of creating classes, giving properties, and class-specific methods can be tricky at first. If you did have trouble with this challenge, try it again later. Change the challenge up to make your own so that you can continue to cement these concepts in your mind. Continue to struggle with it until you can successfully complete it on your own. Struggling forces you to really learn the content, not just emulate it.
Congratulations on completing this challenge. The next part, which builds on this, awaits you. Good luck!
Solution - Hero Monster Classes Part 1