kiyodori / oop_poker

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OOP Poker

ポーカーゲームをオブジェクト指向を使って実装する演習問題です(Ruby)。

学習の狙い

  • オブジェクト指向の必要性を実感してもらう
  • オブジェクト指向を使った基本的な実装ができる
  • ポリモーフィズムの効果を実感してもらう

仕様

Step1. ツーカードポーカー

オブジェクト指向(クラス)を使わずに実装しましょう。オブジェクト指向を使わないことで、クラスを使わないことの不便さを実感します。

ディーラーとプレイヤーの2人で対戦するコンソールゲームを作成しましょう。2枚の手札でポーカーを行います。以下のルールの元、コンソール(ターミナル)上で動作するようにします。

  • プレイヤーは2人です
  • 各プレイヤーはトランプ2枚を与えられます
  • ジョーカーはありません
  • 与えられたカードから、役を判定します。役は番号が大きくなるほど強くなります

役は次の通りです。

  1. ハイカード:以下の役が一つも成立していない
  2. ペア:2枚のカードが同じ数字
  3. ストレート:2枚のカードが連続している。A は 2 と K の両方と連続しているとみなし、A を含むストレート は、A-2 と K-A の2つです

それぞれの役を判定するプログラムを作成ください。

コンソール画面のイメージは次の通りです。

ポーカーを開始します。
あなたの引いたカードはハートの7です。
あなたの引いたカードはクラブの7です。
ディーラーの引いたカードはダイヤのQです。
ディーラーの引いたカードはスペードのKです。
あなたの役はペアです。
ディーラーの役はストレートです。

Step2. スリーカードポーカー

オブジェクト指向(クラス)を使わずに実装しましょう。オブジェクト指向を使わないことで、クラスを使わないことの不便さを実感します。

仕様変更が入りました。2枚の手札で行うツーカードポーカーに加え、3枚の手札で行うスリーカードポーカー、両方のルールに対応できるようにする必要が発生しました。

各プレイヤーに配られたカードの枚数が2枚ずつのときはツーカードポーカーとして処理し、配られたカードの枚数が3枚ずつのときはスリーカードポーカーとして処理します。

ツーカードポーカーとスリーカードポーカーの両方に対応させてください。

スリーカードポーカーにおける役は次の通りです。ツーカードポーカーの役はStep1のままです。

  1. ハイカード:以下の役が一つも成立していない
  2. ペア:2枚のカードが同じ数字
  3. ストレート:3枚のカードが連続している。A は 2 と K の両方と連続しているとみなし、A を含むストレート は、A-2-3 と Q-K-A の2つ。ただし、K-A-2 のランクの組み合わせはストレートとはみなさない
  4. スリーカード:3枚のカードが同じ数字
ポーカーを開始します。カードを引く枚数を選択してください(2, 3):
3
あなたの引いたカードはハートの7です。
あなたの引いたカードはクラブの7です。
あなたの引いたカードはスペードの7です。
ディーラーの引いたカードはダイヤのQです。
ディーラーの引いたカードはスペードのKです。
ディーラーの引いたカードはスペードのAです。
あなたの役はスリーカードです。
ディーラーの役はストレートです。

Step3. OOP ツーカードポーカー

Step2 まで開発すると、条件分岐が多く発生し、コードが複雑になったかと思います。ここに役が追加されたり、カードの枚数がより可変になると、コードはさらに複雑になります。コードの変更がかなり大変になります。

そこで、オブジェクト指向を使ってコードを整理しましょう。

Step1 のツーカードポーカーをオブジェクト指向を使って実装してください。

Step4. OOP スリーカードポーカー

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

About


Languages

Language:Dockerfile 59.5%Language:Ruby 40.5%