Assignment 4: All In a Row, Part 3:   Different Models
1 Purpose
2 Poker Rectangles
3 Looser Poker Triangles
4 Assignment Requirements and Design Constraints
5 Hints
6 The Poker  Polygons  Builder 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: All In a Row, Part 3: Different Models

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 20 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 Poker Polygons. 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.pokerpolygons.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 two 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 model related code is in the cs3500.pokerpolygons.model.hw04 package. Your new view must be in the cs3500.pokerpolygons.view package. Additionally, your code from the previous assignment should remain in the cs3500.pokerpolygons.model.hw02, cs3500.pokerpolygons.view and cs3500.pokerpolygons.controller packages.

2 Poker Rectangles

The traditional game of Poker Polygons is played on a square board, not a triangle. For this model, you will be getting closer to that origin by playing the game on a rectangular board. The sides of the board must each be greater than or equal to 5 cards. Note that because this is a rectangle, the sides need not be equal.

Scoring changes slightly in this version. In Poker Rectangles, you only score the columns and rows with 5 or more cards. This means diagonals are not scored. Implement this model as a class called PokerRectangles which again uses your cards.

This version has only the following two constructors

However, with the new board comes a new view. Since the PokerTrianglesTextualView assumed we wanted to view the model’s board as a triangle, we need a new view that assumes we want to view the model’s board as a rectangle. We shall call that view PokerRectanglesTextualView.

It should implement the PokerPolygonsTextualView with the only difference being the view assumes the polygon is a rectangle. This means the field is still of type PokerPolygons<?>.

Note: It is okay if you rewrite the existing PokerTrianglesTexView to properly handle any shape, but you still need to define the new class and have that new class do the same without duplicating existing code.

3 Looser Poker Triangles

In the original version of Poker Triangles, a flush was defined as a poker hand of 5 cards where every card has the same suit. Furthermore, a straight was defined as a hand of 5 cards such that if sorted, form a run: a sequence of ranks that can be ordered such that the numerical value of each card’s rank increases by 1.

However, we can loosen these rules. For this new version of PokerTriangles, we will redefine both of those terms as follows

This does have an effect on the definition of a straight flush.

Implement this new model as a class called LoosePokerTriangles which again uses your cards. Of note, this model must work with the existing PokerTrianglesTextualView as this board is a triangular shape.

4 Assignment Requirements and Design Constraints

  1. Design classes implementing the PokerRectangles and LoosePokerTriangles variants of PokerPolygons as well as the PokerRectanglesTextualView. Both variant model classes should clearly implement PokerPolygons, and clearly share some commonalities with the existing PokerTriangles. 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 builder class, named PokerPolygonsBuilder, 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 PokerPolygonsBuilder class

Updates are marked in red.

Design a class with the above name in the cs3500.pokerpolygons.model.hw04 package. The class should define a public enum GameType with three possible values: TRI, RECT and LOOSE.

The class should offer the following methods

It should also offer the following constructor

You may add additional methods to your PokerPolygonsBuilder class, but you must maintain the build and customization methods specified above, for our tests to compile against your code.

7 The main() method

Add the following class to your project:

package cs3500.pokerpolygons;

public final class PokerPolygonsGame {
  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.

Specifically:

Updates are indicated in red.

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

Hint: Notice that the options for a model have defaults and are customizable. Consider having an object that represents the options. If so, how can we handle the sheer customizability of these options?

This command-line specification also does not allow for customizing the deck of cards to be dealt. 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 for the optional arguments (e.g. by producing an informative error message). However, your code should not crash (e.g. by specifying -1 as the hand size , and causing an IndexOutOfBounds exception).

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.pokerpolygons package, your new view in the cs3500.pokerpolygons.view package, while all other new classes and interfaces for this homework should be in the cs3500.pokerpolygons.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.