Difference between revisions of "CISC181 S2019 Lab4"

From class_wiki
Jump to: navigation, search
(Instructions)
(Instructions)
Line 9: Line 9:
 
==Instructions==
 
==Instructions==
  
Suppose you want to write a ''video poker'' simulator based on the provided <tt>Card</tt> , <tt>Deck</tt>, and <tt>Hand</tt> classes.  See "The Game" section [https://en.wikipedia.org/wiki/Video_poker here] for the rules, in particular the "Jacks or Better" variant.  In short, let's say you bet $1 per hand.  For each hand you are given 5 random cards, and you can choose from 1 to 5 of them to replace.  Depending on what you have (a pair, two pairs, three of a kind, flush, etc.), you get a payout based on the odds.  We will use the following payout chart:
+
Suppose you want to write a ''video poker'' simulator based on the provided <tt>Card</tt> , <tt>Deck</tt>, and <tt>Hand</tt> classes.  See "The Game" section [https://en.wikipedia.org/wiki/Video_poker here] for the rules, in particular the "Jacks or Better" variant.  In short, for each hand you are given 5 random cards, and you can choose from 0 to 5 of them to replace.  Depending on the result (a pair, two pairs, three of a kind, flush, etc.), you get a payout based on the odds, as shown below:
  
 
[[Image:poker_payouts.png|150px]]<br>
 
[[Image:poker_payouts.png|150px]]<br>
  
 +
Playing each game one by one is rather boring (but you should probably do this in the course of your testing).  So instead you will modify and add to the above classes to create a *simulator* to tabulate gains or losses over many games played automatically.  Specifically, your player starts with a bankroll of $1,000,000 and bets $1 per game.  Win or lose, play 1,000,000 games ''automatically'' according to the following super-simple strategy and print (1) the final amount, and (2) the ''best'' hand that you ever had.
  
This will not be visual -- no Swing this week!
+
* If you have worse than a single high card, discard everything
 +
* If you have no better than one "high card" (jack or higher), keep it and discard the other four
 +
* If you have no better than a pair, keep it and discard the other three
 +
* If you have no better than two pairs, keep them and discard the remaining card
 +
* If you have no better than three of a kind, keep it and discard the other two
 +
* If you have better than three of a kind, keep everything
 +
 
 +
Here are some of the key changes you will need to make for this to happen:
 +
 
 +
* Currently there is no way to compare individual cards to see which one is "better".  Make the <tt>Card</tt> class implement <tt>Comparable<Card></tt>
  
 
Obviously, a core function would be to ''compare'' two hands and determine which one is better.
 
Obviously, a core function would be to ''compare'' two hands and determine which one is better.
Line 21: Line 31:
  
 
The ranking of hands is detailed [https://en.wikipedia.org/wiki/List_of_poker_hands here].  Assume that cards come from a standard 52-card deck with no wildcards, and aces can be high or low.  This will be a complicated function -- please make it as modular as possible by calling other support functions.
 
The ranking of hands is detailed [https://en.wikipedia.org/wiki/List_of_poker_hands here].  Assume that cards come from a standard 52-card deck with no wildcards, and aces can be high or low.  This will be a complicated function -- please make it as modular as possible by calling other support functions.
 
 
We will grade your lab '''strictly''' by how many of the ''N'' unit tests in our grading suite are passed.  Since you can get <tt>compare()</tt> right 1/3 of the time just by chance, your lab score will be determined by a linear map from [N/3, N] tests passed to a score of [1, 4].
 
  
 
==Submission==
 
==Submission==
  
 
Submit your <tt>ByHandValue.java</tt> on Canvas (be sure to add your name to any files you create or change).  Do NOT submit <tt>Lab4.java</tt>.
 
Submit your <tt>ByHandValue.java</tt> on Canvas (be sure to add your name to any files you create or change).  Do NOT submit <tt>Lab4.java</tt>.

Revision as of 12:14, 13 March 2019

Preliminaries

  • Make a new project with n = 4 (following these instructions)
  • Name your main class "Lab4" (when creating a new module in the instructions above, in the Java class name field)
  • Remember that this week you can choose a partner, or work alone. No partners will be assigned

Instructions

Suppose you want to write a video poker simulator based on the provided Card , Deck, and Hand classes. See "The Game" section here for the rules, in particular the "Jacks or Better" variant. In short, for each hand you are given 5 random cards, and you can choose from 0 to 5 of them to replace. Depending on the result (a pair, two pairs, three of a kind, flush, etc.), you get a payout based on the odds, as shown below:

Poker payouts.png

Playing each game one by one is rather boring (but you should probably do this in the course of your testing). So instead you will modify and add to the above classes to create a *simulator* to tabulate gains or losses over many games played automatically. Specifically, your player starts with a bankroll of $1,000,000 and bets $1 per game. Win or lose, play 1,000,000 games automatically according to the following super-simple strategy and print (1) the final amount, and (2) the best hand that you ever had.

  • If you have worse than a single high card, discard everything
  • If you have no better than one "high card" (jack or higher), keep it and discard the other four
  • If you have no better than a pair, keep it and discard the other three
  • If you have no better than two pairs, keep them and discard the remaining card
  • If you have no better than three of a kind, keep it and discard the other two
  • If you have better than three of a kind, keep everything

Here are some of the key changes you will need to make for this to happen:

  • Currently there is no way to compare individual cards to see which one is "better". Make the Card class implement Comparable<Card>

Obviously, a core function would be to compare two hands and determine which one is better.

In this lab you will write a Comparator class ByHandValue to compare hands in 5-card draw Poker. The comparison function will be int compare(ArrayList<Card> H1, ArrayList<Card> H2), where a return value < 0 indicates that H1 would lose to H2, a return value > 0 means that H1 would beat H2, and a return value of 0 means H1 and H2 are "tied." You must use the Card class provided -- do not make your own.

The ranking of hands is detailed here. Assume that cards come from a standard 52-card deck with no wildcards, and aces can be high or low. This will be a complicated function -- please make it as modular as possible by calling other support functions.

Submission

Submit your ByHandValue.java on Canvas (be sure to add your name to any files you create or change). Do NOT submit Lab4.java.