-
Notifications
You must be signed in to change notification settings - Fork 0
enmoed/Bricker
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
This project was built for an assignment at The Hebrew University of Jerusalem School of Computer Science
Some of the files included are part of provided course material for the assignment.
Be sure to import the DanoGameLab.jar External Library.
Ball: This class is derived from the GameObject class. It is responsible for creating ball objects for the
game. It does not put the object in the game. We added a getBallCollision function to the API in order
to implement certain strategies based on the amount of collisions the game ball incurred.
Brick: This class is derived from the GameObject class. It is responsible for creating brick objects for the
game. It does not put the object in the game. I added a second constructor for receiving a
BrickStrategy and not only a CollisionStrategy.
FollowCamera: This class is derived from the Camera class. It is responsible for creating a special camera
that follows a game object. It does not change the camera in the game but is responsible for
reverting the camera back to null.
GraphicLifeCounter: This class is derived from the GameObject class. It is responsible for creating a
specified amount of live objects for the game. It does put the objects in the game. I
added a second constructor implementing situations when we are given a maximum extra lives
parameter. There is a default constant set to 1 in the class for constructors that do not
receive this parameter such as in part 1 one this exercise. Additionally, this class does
not remove the hearts, only changes the render. This allows us to easily increase/decrease
the objects according to the game state.
Heart: This class is derived from the GameObject class. It is responsible for creating heart objects for
a game. It does not put the object in the game.
NumericLifeCounter: This class is derived from the GameObject class. It is responsible for creating a numeric
representation of the amount of lives left in the game. It puts the object in the game.
Paddle: This class is derived from the GameObject class. It is responsible for creating paddle objects for a
game. It does not put the object in the game.
Puck: This class is derived from the Ball class. It is responsible for creating ball object that has borders.
It does not put the object in the game but is responsible for removing them.
TempPaddle: This class is derived from the GameObject class. It is responsible for creating a temporary paddle
with a predefined life length. It does not put the object in the game but is responsible for
removing them.
AddLocatedObjectStrategy: This class is implements the BrickStrategyDecorator interface. Along with receiving
a strategy this class receives a GameObject initialized with a location and starting
speed, and inserts it into the game when the strategy is invoked.
AddObjectsStrategy: This class is implements the BrickStrategyDecorator interface. Along with receiving
a strategy this class receives an array of GameObjects, initialized with starting
speeds, and inserts them into the game at specified location when the strategy is invoked.
CollisionStrategy: This class is implements the BrickStrategy interface. This strategy class removes an object
from the game when invoked
ChangeCameraStrategy: This class is implements the BrickStrategyDecorator interface. Along with receiving
a strategy this class receives a Camera object and switches the game camera settings to
it when the strategy is invoked.
BrickStrategyFactory: This class acts as a factory for deciding which strategy to assign to each brick. When
called upon, the factory chooses between 6 different strategies. Note that depending on
the lottery, the factory can potentially provide a single brick up to three different
strategies.
BrickStrategy: This interface defines what a brick collision strategy entails. It's functions provide us with
abstraction when invoking different game strategies.
BrickStrategyDecorator: This interface defines what a decorator for a brick collision strategy entails. It
does not include functionality but rather provides us with an easier readability
when viewing strategy hierarchy.
Design: I designed the game with a view to maximize abstraction and encapsulation. By attempting to do so, I
focused on minimizing the API. This led me to the design pattern of a strategy factory, which
receives all the parameters needed to implement any of the strategies. This allowed me to focus on
implementing the strategies within the factory, rather than also creating the objects, which is better
encapsulation. Additionally, this made for clearer strategy classes, as they received the parameters
needed to invoke the class strategy, rather than also having to create game objects.
Additionally, by not creating game objects within the strategy classes, I was able to create more
general strategies and therefore decrease the number of strategy classes. This was due to some of the
strategies, such as the temporary paddle and additional lives, having the same functionality of only
needing to add a predefined GameObject into the game. Lastly, I noticed that certain GameObjects, such
as TempPaddle and FollowCamera, can be reused amongst different bricks. Therefore, by creating them
ahead of time I was able to send the same instances repeatedly to the factory, reducing worst case
space complexity.
Implementation issues: The most noticeable implementation issue is to increase the double strategy
implementation. It makes it a tad more difficult to add more layers to the game as you
need to carefully increase the factory. Additionally, we need to be aware that we are
initializing the game objects in a correct order, making sure that certain objects
are created before others.
Question 1+2: The answers is explained in the "Design" section above.
Question 3: As noted previously, I was able to prevent more than 3 strategies by creating specific functions
in the strategy factory, for each layer of a double strategy. This allowed me to clearly view the
different layers when having more than one strategy per brick, making sure I have implemented
the layers correctly.
Question 4: I used a decorator within the strategy design pattern. This allowed me to initialize a base
strategy and then send it as a parameter to the special strategy selected in the factory,
allowing for double strategies in a simple manner. This design allows for extra layers of
strategies as all special strategies are decorators and decorate one another from layer to layer.
About
Bricker game manager program. It can be extended to include more functionality
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published