ポーカーゲームをオブジェクト指向を使って実装する演習問題です(Ruby)。
- オブジェクト指向の必要性を実感してもらう
- オブジェクト指向を使った基本的な実装ができる
- ポリモーフィズムの効果を実感してもらう
オブジェクト指向(クラス)を使わずに実装しましょう。オブジェクト指向を使わないことで、クラスを使わないことの不便さを実感します。
ディーラーとプレイヤーの2人で対戦するコンソールゲームを作成しましょう。2枚の手札でポーカーを行います。以下のルールの元、コンソール(ターミナル)上で動作するようにします。
- プレイヤーは2人です
- 各プレイヤーはトランプ2枚を与えられます
- ジョーカーはありません
- 与えられたカードから、役を判定します。役は番号が大きくなるほど強くなります
役は次の通りです。
- ハイカード:以下の役が一つも成立していない
- ペア:2枚のカードが同じ数字
- ストレート:2枚のカードが連続している。A は 2 と K の両方と連続しているとみなし、A を含むストレート は、A-2 と K-A の2つです
それぞれの役を判定するプログラムを作成ください。
コンソール画面のイメージは次の通りです。
ポーカーを開始します。
あなたの引いたカードはハートの7です。
あなたの引いたカードはクラブの7です。
ディーラーの引いたカードはダイヤのQです。
ディーラーの引いたカードはスペードのKです。
あなたの役はペアです。
ディーラーの役はストレートです。
オブジェクト指向(クラス)を使わずに実装しましょう。オブジェクト指向を使わないことで、クラスを使わないことの不便さを実感します。
仕様変更が入りました。2枚の手札で行うツーカードポーカーに加え、3枚の手札で行うスリーカードポーカー、両方のルールに対応できるようにする必要が発生しました。
各プレイヤーに配られたカードの枚数が2枚ずつのときはツーカードポーカーとして処理し、配られたカードの枚数が3枚ずつのときはスリーカードポーカーとして処理します。
ツーカードポーカーとスリーカードポーカーの両方に対応させてください。
スリーカードポーカーにおける役は次の通りです。ツーカードポーカーの役はStep1のままです。
- ハイカード:以下の役が一つも成立していない
- ペア:2枚のカードが同じ数字
- ストレート:3枚のカードが連続している。A は 2 と K の両方と連続しているとみなし、A を含むストレート は、A-2-3 と Q-K-A の2つ。ただし、K-A-2 のランクの組み合わせはストレートとはみなさない
- スリーカード:3枚のカードが同じ数字
ポーカーを開始します。カードを引く枚数を選択してください(2, 3):
3
あなたの引いたカードはハートの7です。
あなたの引いたカードはクラブの7です。
あなたの引いたカードはスペードの7です。
ディーラーの引いたカードはダイヤのQです。
ディーラーの引いたカードはスペードのKです。
ディーラーの引いたカードはスペードのAです。
あなたの役はスリーカードです。
ディーラーの役はストレートです。
Step2 まで開発すると、条件分岐が多く発生し、コードが複雑になったかと思います。ここに役が追加されたり、カードの枚数がより可変になると、コードはさらに複雑になります。コードの変更がかなり大変になります。
そこで、オブジェクト指向を使ってコードを整理しましょう。
Step1 のツーカードポーカーをオブジェクト指向を使って実装してください。
Step2 の仕様変更を、オブジェクト指向を使って実装してください。その際に、ツーカードポーカーの役の判定とスリーカードポーカーの役の判定についてはポリモーフィズムを意識して実装してください。
プロジェクト直下にファイルを設置して開発しましょう。
以下、Docker を使用する場合の開発方法について説明します。
Docker コンテナを起動します。
docker build ./ -t oop_poker
docker run -it --mount type=bind,src="$(pwd)",target=/app oop_poker bash
プログラムを実行します。
ruby oop_poker.rb