Skip to content

Latest commit

 

History

History
37 lines (30 loc) · 2.24 KB

7ec8.md

File metadata and controls

37 lines (30 loc) · 2.24 KB

Back to questions

Solution to 7ec8: Battling fighters

See code at solutions/code/tutorialquestions/question7ec8

There are many ways you could model this question. Take a look at my solution, check you understand it, and compare it with yours.

In my solution, I decided that dice rolling is the responsibility of the game engine, not of a fighter, so I equipped GameEngine with a field generator of type Random, used to generate random numbers. In addition, I made an instance method, rollDice(), which uses generator to generate a random integer between 1 and 6. By making generator private, I ensure that clients of GameEngine must use the rollDice() method to simulate dice rolls: they cannot access the random number generator directly. This means that I could use a different scheme for simulating dice rolling. I could also easily modify GameEngine to log the number of times a dice has been rolled. If generator was public, clients could bypass such a logging mechanism.

In the question, you were asked to reduce a fighter's stamina by 2 when a hit occurs. In my solution I have documented this by defining a constant, DAMAGE_VALUE, inside caclulateDamage. The constant is set to 2, and calculateDamage simply returns DAMAGE_VALUE. This is slightly preferable to simply returning the magic number 2, because the named constant adds additional documentation stating the purpose of this value.

Because Fighter needs to roll dice (e.g. in calculateAttackScore), in my solution every Fighter has a reference to a GameEngine object. In my solution, Fighter objects use a log method of GameWorld to log the progress of their battle. Currently, log is implemented by delegating to System.out.println. To have the progress of a battle displayed in some other manner, (e.g., on a web page) all I would need to do would be re-implement log in GameWorld.

While we will have multiple instances of Fighter, we might wish there to be a single GameEngine object. This could be achieved using the singleton pattern, as described in the lectures. Can you extend your or my solution to use the singleton pattern, ensuring that it is not possible to create multiple game worlds?