発展課題 (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 |
ヒント
ストレートフラッシュは、「ストレートかつフラッシュ」という状況です。