発展課題 (r2:ベーシック)
注意点
このページは復習 (2)の発展課題を掲載しています。発展課題については「復習回の課題について」をよく読んでから取り掛かってください。
作業について
今回の課題は以下のパッケージに作成してください。
パッケージの名前 |
---|
j1.review02 |
作成するクラスの名前は問題ごとに指示があります。下記を参照してください
課題の提出方法については下記を参照してください。
また、別のコンピューター上に移動する際には、下記を参考にプログラムを持ち帰ってください。
問題
1. ポーカーの役を計算するプログラム
作成するクラスの名前 |
---|
Poker |
トランプのカードが5枚あるとき、その5枚のカードがどのようなポーカーの役になっているかを表示するプログラムを作成してください。
表示してもらう役は次のとおりです。ロイヤルストレートフラッシュなどの役を別途表示してもかまいません。
役の名前 | 説明 |
---|---|
ワンペア | 同じ数字のカードが2枚1組含まれている |
ツーペア | 同じ数字のカードが2枚2組含まれている |
スリーカード | 同じ数字のカードが3枚1組含まれている |
フルハウス | 2枚の同じ数字のカードと、3枚の同じ数字のカードで構成されている |
ストレート | 5枚の連続する数字のカードで構成されている |
フラッシュ | 5枚の同じ絵柄のカードで構成されている |
フォーカード | 同じ数字のカードが4枚1組含まれている |
ストレートフラッシュ | 5枚の連続する数字で、かつ同じ絵柄のカードで構成されている |
なお、下記の作りかけのプログラムは、52枚のカードをシャッフルしてから5枚だけ取り出して、それらの内容を表示しています。このプログラムに「役を判定して表示する」という機能を付け加えてください。
package j1.review02; import javax.swing.JOptionPane; public class Poker { public static void main(String[] args) { new Poker().start(); } void start() { Card[] deck = getDeck(); Card[] deals = new Card[5]; for (int i = 0; i < deals.length; i++) { deals[i] = deck[i]; } showDeals(deals); } Card[] getDeck() { // 13 * 4枚のカードをそろえる Card[] deck = new Card[13 * 4]; for (int number = 0; number < 13; number++) { for (int suite = 0; suite < 4; suite++) { Card card = new Card(); card.suite = suite; card.number = number + 1; deck[number + suite * 13] = card; } } // シャッフルする for (int i = 0; i < deck.length; i++) { // 0..51の乱数を生成 int random = (int) (Math.random() * deck.length); // 現在のカードと乱数の位置のカードを入れ替え Card card = deck[i]; deck[i] = deck[random]; deck[random] = card; } return deck; } void showDeals(Card[] deals) { String string = ""; for (int i = 0; i < deals.length; i++) { string = string + getPrint(deals[i]) + "\n"; } JOptionPane.showMessageDialog(null, "現在の手札:\n" + string); } String getPrint(Card card) { if (card.suite == 0) { return "ハートの" + card.number; } else if (card.suite == 1) { return "クラブの" + card.number; } else if (card.suite == 2) { return "ダイヤの" + card.number; } else { return "スペードの" + card.number; } } } class Card { int suite; int number; }
ヒント
フラッシュやストレートフラッシュ以外では絵柄は関係ありません。数字ごとにそれぞれのカードが何枚ずつあるかをまとめてやるとよいでしょう。たとえば、フルハウスは次のようになります。
数字 | 枚数 |
---|---|
1 | 0 |
2 | 3 |
3 | 0 |
4 | 0 |
5 | 0 |
6 | 0 |
7 | 0 |
8 | 0 |
9 | 2 |
10 | 0 |
11 | 0 |
12 | 0 |
13 | 0 |
ヒント
逆に、フラッシュに数字は関係ありません。絵柄ごとにカードが何枚ずつあるかをまとめてやると計算が楽になります。以下はダイヤの絵柄がそろった際の状況です。
数字 | 枚数 |
---|---|
ハート | 0 |
ダイヤ | 5 |
クラブ | 0 |
スペード | 0 |
ヒント
ストレートフラッシュは、「ストレートかつフラッシュ」という状況です。