Assignment 4: Meet Your Match, Part 3:   Changing the Game
1 Purpose
2 Same  Game with gravity
3 Same  Game with auto-matching capabilities
4 Assignment Requirements and Design Constraints
5 Hints
6 The Same  Game  Creator class
7 The main() method
7.1 To actually run your program with command line arguments in Intelli  J IDEA:
8 What to submit
9 Grading standards
8.9

Assignment 4: Meet Your Match, Part 3: Changing the Game

Due dates:

Note: Homeworks 5 through 8 will begin a new project, and you will be working with a partner for them. Start thinking about who you’d like to partner with. You will sign up with your partner on the handin server, and you will not be able to submit subsequent assignments until you are part of a team on the handin server. If you do not know (or remember) how to request teams, follow these instructions. Please request teams no later than the start of homework 5, which is Feb 26 if you have not requested a teammate by then, we will randomly assign you one. You only need to request a partner for Assignment 5; we will copy the teams to the remaining assignments.

1 Purpose

The benefits of the model-view-controller architecture shine when we need to add new features, by isolating relevant parts of our design and changing them independently. In this assignment we will see those benefits pay off by supporting other forms of SameGame. The goal of this assignment is to give you a chance to critically examine your earlier design choices, and either leverage or revise them to enable adding variations of this game with minimal change and duplication of code.

With one exception (main), all new classes and interfaces for this homework should be in the cs3500.samegame.model.hw04 package. All classes written in previous assignments, even if improved upon, should remain in their respective packages.

There will be two submissions for this assignment:

The same late-day policy as on the previous homework applies: each of these submissions independently may use up to one late day, and you are still able to submit your self-evaluation on time even if you submit your implementation late.

You are expected to use your code from the previous assignment as the starting point for this assignment. However, please ensure all of your new code is in the cs3500.samegame.model.hw04 package. Additionally, your code from the previous assignment should remain in the cs3500.samegame.model.hw02, cs3500.samegame.view and cs3500.samegame.controller packages.

For all implementations below, no method must exceed 50 lines of code!

2 SameGame with gravity

The SameGame implementation described in homework 2 allows pieces to float in space. While simpler to implement, this decision removes some strategy from the game. Mainly, removing a matching block to make room for a bigger one.

You will make a version of SameGame called GravitySameGame which will force pieces to fall as long as there is a missing piece beneath them. The game should otherwise behave like FourPieceSameGame except whenever the game starts or a move is applied, gravity is applied to any floating pieces.

Suppose the board, after starting the game or making a move, is left in the "Before" state. Gravity will then force the green and blue pieces in the third column to fall as well as the green piece in the fourth column and the other blue and green pieces in the fifth column, resulting in the "After" state. Notice how gravity creates a new matching block, one that would not have been found in our previous implementation.

          

Before gravity is applied

          

After gravity is applied

X G B X X X X
X R G X X G B
X Y X G B Y G
R R X X G B Y
R G B Y X G B

          

X G X X X X X
X R X X X G B
X Y B X X Y G
R R G G B B Y
R G B Y G G B

3 SameGame with auto-matching capabilities

SameGame is a predecessor to match-3 games: games that ask the player to swap pieces to create a matching block of 3 or more pieces. That matching block is then removed along with any other matching block on the board. You will be implementing the same mechanism. In this version, whenever a swap or match is made, the model will remove any existing matching blocks on the board until none are left. Each match is increases the player’s score as if the player had made the match themselves (i.e. each auto-match is still worth N - 2 points, where N is the number of pieces in the matching block}.

Consider the example below. The user will try to remove the matching block of red pieces, colored in red. The underlined blue pieces are part of another matching block. Once the user removes the red matching block, auto-matching will remove the blue matching block as well. This increases the score by 4 for the red matching block and then 3 for the blue one, resulting in a score of 7.

          

Before

          

After an R matching block

X G B X X X X
X R B B X G B
X Y R B B Y G
R R R R G B Y
R G B Y R G B
Score: 0

          

X G X X X X X
X R X X X G B
X Y X X X Y G
X X X X G B Y
X G B Y R G B
Score: 7

Implement a version of SameGame called AutoMatchSameGame which will automatically remove existing matching blocks from the board after the player makes a move. Note this does not apply to the starting board of the game: all matches there must be left unchanged.

4 Assignment Requirements and Design Constraints

  1. Design classes implementing the Gravity and AutoMatch variants of SameGame. Both classes should clearly implement SameGameModel, and clearly share some commonalities with the existing FourPieceSameGame. In your implementation, strive to avoid as much code-duplication as possible among the three models, while making sure that all three fully work properly. If done correctly, none of your code from before should break or be affected. You may need to refactor your earlier code, though, to make it more flexible and enable better code reuse for these new classes.

  2. Design a factory class, named SameGameCreator, as described below.

  3. Implement a main method to allow you to choose different game variants from the command line, when running your program. (This is described below.)

  4. If you had to change any part of your design from prior assignments, document those changes in a README file. (This must be a plain-text file.)

  5. Test everything thoroughly: make sure the new models work properly, and that the controller can control them as well as it could the original model. You do not need to test your main method.

You must complete these requirements while respecting the following constraints:

In this assignment it is important not only to have a correctly working model, but also a design that uses interfaces and classes appropriately. Make sure you minimize replication of code. You may refactor your earlier designs to do this. You may also have to change earlier implementations to remove bugs. This is OK, but must be properly documented and justified.

5 Hints

6 The SameGameCreator class

Design a class with the above name. The class should define a public enum GameType with three possible values: FOURPIECE, GRAVITY and AUTOMATCH. It should offer a static factory method createGame(GameType type) that returns an instance of (an appropriate subclass of) SameGameModel, depending on the value of the parameter.}

7 The main() method

Add the following class to your project:

package cs3500.samegame;

public final class SameGame {
  public static void main(String[] args) {
    // FILL IN HERE
  }
}

This main() method will be the entry point for your program. Your program needs to take inputs as command-line arguments (available in your program through the argument args above). Review the documentation for command-line arguments in a Java program.

The following are some examples of valid command lines, and their meanings:

You may add additional methods to your SameGameCreator class, but you must maintain the create methods specified above, for our tests to compile against your code.

This command-line specification also does not allow for the user to specify a board ahead of time. It is an interesting challenge to think how you might design such configuration options.

This is not an exhaustive list; other command lines are possible.

When you specify command-line arguments, they are always treated as strings, even if they are not within quotes. However, quotes are necessary if you want to pass a string that contains spaces in it.

These arguments will appear in the String[] args parameter to your main method; you can use them however you need to, to configure your models. For this assignment, you do not need to explicitly handle invalid command lines (e.g. by producing an informative error message). However, your code should not crash when given a bad optional argument: that is, the bad optional arguments must not produce any exceptions. How you choose to handle this beyond not crashing (e.g. print a message or ignore it) is up to you. However, your program must throw an exception if the given game type is not valid and can thus crash in this way alone.

7.1 To actually run your program with command line arguments in IntelliJ IDEA:

You can repeat this process as many times as you want, to make as many run configurations as you need. Then to choose among them, use the dropdown menu next to the run icon in the toolbar:

and press Run.

8 What to submit

Your main class should be in the cs3500.samegame package, while all other new classes and interfaces for this homework should be in the cs3500.samegame.model.hw04 package. All classes written in previous assignments, even if improved upon, should remain in their respective packages.

As with Assignment 3, please submit a zip containing only the src/ and test/ directories with no surrounding directories, so that the autograder recognizes your package structure. Please do not include your output/ or .idea/ directories — they’re not useful!

9 Grading standards

For this assignment, you will be graded on

Please submit your homework to https://handins.ccs.neu.edu/ by the above deadline. Then be sure to complete your self evaluation by its deadline.