発展課題 (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

ヒント

ストレートフラッシュは、「ストレートかつフラッシュ」という状況です。