TDD Boot Camp(TDDBC) - TDDBC仙台07/課題_5 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
!TDDBC仙台07課題:ポーカー
!! ポーカー
ポーカー(poker)は、トランプを使って行うゲームのジャンルである。
プレイヤー達は5枚の札でハンド(役、手役)を作って役の強さを競う
( [[https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%82%AB%E3%83%BC]] より抜粋)
!! トランプ
トランプは、日本ではカードを使用した室内用の玩具を指すために用いられている用語で、もっぱら4種各13枚の計52枚(+α)を1セットとするタイプのものを指して言うことが多い。
( [[https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%83%97]] より抜粋)
* カード (card)
** スートとランクを持つ
* スート (suit) - 以下の4種類を持つ
** ♠ (スペード/spade)
** ♥ (ハート/heart)
** ♣ (クラブ/club)
** ♦︎ (ダイヤ/diamond)
* ランク (rank) - 以下の13種類を持つ
** A (エース/ace), 2, 3, 4, 5, 6, 7, 8, 9, 10, J(ジャック/jack), Q(クイーン/queen), K(キング/king)
* カードひと組(4スート x 13ランク = 52枚)のことをデッキ(deck)と呼ぶ
!!課題1 トランプのカード
!!!課題1-1 カードの文字列表記
任意のカード1枚について、その文字列表記を取得してください
* '''スート''' (suit) と '''ランク''' (rank) を与えて '''カード''' (card) を生成してください
* 生成した'''カード'''から'''文字列表記''' (notation) を取得してください
【例】
// スートにスペード, ランクに3を与えてカードを生成
Card threeOfSpades = new Card("♠", "3");
// 「スペードの3」の文字列表記は「3♠」
String notation = threeOfSpades.getNotation(); // => "3♠"
// スートにハート, ランクにJを与えてカードを生成
Card jackOfHearts = new Card("♥", "J");
// 「ハートのJ」の文字列表記は「J♥」
String notation = jackOfHearts.getNotation(); // => "J♥"
!!!課題1-2 カードの比較
任意のカード2枚について、同じスート/ランクを持つか判断してください
* '''カード''' (card) がもう1枚のカードと'''同じスートを持つか''' (has same suit) を判断してください
* '''カード''' (card) がもう1枚のカードと'''同じランクを持つか''' (has same rank) を判断してください
【例】
Card threeOfSpades = new Card("♠", "3"); // スペードの3
Card aceOfSpades = new Card("♠", "A"); // スペードのA
Card aceOfHearts = new Card("♥", "A") // ハートのA
// スペードの3とスペードのAは同じスートを持つ
threeOfSpades.hasSameSuit(aceOfSpades) // => true
// スペードの3とハートのAは異なるスートを持つ
threeOfSpades.hasSameSuit(aceOfHearts) // => false
// スペードの3とスペードのAは異なるランクを持つ
threeOfSpades.hasSameRank(aceOfSpades) // => false
// スペードのAとハートのAは同じランクを持つ
aceOfSpades.hasSameRank(aceOfHearts) // => true
!!課題2 ツーカードポーカー (two card poker) の役を判定
1デッキのトランプの内、任意の2枚から構成される手札を使ったポーカー
!!課題2-1 ツーカードポーカーの役を判定
ツーカードボーカーの任意の '''手札''' (cards) について、その '''役''' (hand) を判定してください
ツーカードポーカーには以下の役があります
* ペア (pair)
** 2枚のカードが同じランクを持つ
* フラッシュ (flush)
** 2枚のカードが同じスートを持つ
* ハイカード (high card)
** 2枚のカードが異なるランク/スートを持つ
!!課題2-2 ツーカードポーカーの役を判定(役の追加)
ツーカードポーカーに新たな役が追加されます
ツーカードボーカーの任意の '''手札''' (cards) について、その '''役''' (hand) を判定してください
複数の役が成立している場合は、より上位の役が成立しているとみなしてください
* ストレートフラッシュ (straight flush)
** ストレートかつフラッシュが成立している
* ペア (pair)
** 2枚のカードが同じランクを持つ
* ストレート (straight)
** 2枚のカードのランクが連続している
** Aは2とKの両方と連続しているとみなす(AK および 2Aの組み合わせはいずれもストレートである)
* フラッシュ (flush)
** 2枚のカードが同じスートを持つ
* ハイカード (high card)
** 上記の役が1つも成立していない
!!課題3 ツーカードポーカーの2つの手札の強さを比較
ツーカードポーカーの2つの手札について、その強さを比較してください
!!課題3-1 2つの手札の役が異なる場合
より上位の役を持つ手札が強いものとします
!!課題3-2 2つの手札の役が同じ場合も含む
同じ役を持つ場合は以下の条件で強さを比較します
* ストレートフラッシュ
** AK が最強、2Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* ペア
** Aのペアが最強, 2のペアが最弱
** ランクが同じ場合は引き分け
* ストレート
** AK が最強、2Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* フラッシュ
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
* ハイカード
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
!!課題4 スリーカードポーカー (three card poker)
1デッキのトランプの内、任意の3枚から構成される手札を使ったポーカー
!!課題4-1 スリーカードポーカーの役を判定
スリーカードボーカーの任意の '''手札''' (cards) について、その '''役''' (hand) を判定してください
スリーカードポーカーには以下の役があります
複数の役が成立している場合は、より上位の役が成立しているとみなしてください
* ストレートフラッシュ (straight flush)
** ストレートかつフラッシュが成立している
* スリーカード (three of a kind)
** 3枚のカードが同じランクを持つ
* ストレート (straight)
** 3枚のカードのランクが連続している
** Aは2とKの両方と連続しているとみなす(AKQ および 32Aの組み合わせはいずれもストレートである. ただし、2AKの組み合わせはストレートとはみなさない)
* フラッシュ (flush)
** 3枚のカードが同じスートを持つ
* ペア (pair)
** 3枚のカードの内、2枚のカードが同じランクを持つ
* ハイカード (high card)
** 上記の役が1つも成立していない
!!課題4-2 スリーカードポーカーの2つの手札の強さを比較
スリーカードポーカーの2つの手札について、その強さを比較してください
2つの手札の役が異なる場合は、より上位の役を持つ手札が強いものとします
2つの手札が同じ役を持つ場合は、以下の条件で強さを比較します
* ストレートフラッシュ
** AKQ が最強、32Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* スリーカード
** Aのスリーカードが最強、2のスリーカードが最弱
** ランクが同じ場合は引き分け
* ストレート
** AKQ が最強、32Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* フラッシュ
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目・3枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
* ペア
** Aのペアが最強, 2のペアが最弱
** ペアのランクが同じ場合、ペアではない3枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* ハイカード
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目・3枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
!!課題5 ファイブカードポーカー (five card poker)
1デッキのトランプの内、任意の5枚から構成される手札を使ったポーカー
!!課題5-1 ファイブカードポーカーの役を判定
ファイブカードボーカーの任意の '''手札''' (cards) について、その '''役''' (hand) を判定してください
ファイブカードポーカーには以下の役があります
複数の役が成立している場合は、より上位の役が成立しているとみなしてください
* ロイヤルフラッシュ (royal flush)
** ストレートフラッシュかつ、AKQJ10 のランクの組み合わせを持つ
* ストレートフラッシュ (straight flush)
** ストレートかつフラッシュが成立している
* フォーカード (four of a kind)
** 5枚のカードの内、4枚のカードが同じランクを持つ
* フルハウス (full house)
** 5枚のカードの内、3枚のカードが同じランクを持ち、かつ、残りの2枚も同じランクを持つ
* フラッシュ (flush)
** 5枚のカードが同じスートを持つ
* ストレート (straight)
** 5枚のカードのランクが連続している
** Aは2とKの両方と連続しているとみなす(AKQJ10 および 5432Aの組み合わせはいずれもストレートである. ただし、432AK/321AK/21AKJ の組み合わせはストレートとはみなさない)
* スリーカード (three of a kind)
** 5枚のカードの内、3枚のカードが同じランクを持つ
* ツーペア (two pair)
** 5枚のカードの内、2枚のカードが同じランクを持ち、残りの3枚の内、2枚が同じランクを持つ
* ワンペア (one pair)
** 5枚のカードの内、2枚のカードが同じランクを持つ
* ハイカード (high card)
** 上記の役が1つも成立していない
!!課題5-2 ファイブカードポーカーの2つの手札の強さを比較
ファイブカードポーカーの2つの手札について、その強さを比較してください
2つの手札の役が異なる場合は、より上位の役を持つ手札が強いものとします
2つの手札が同じ役を持つ場合は、以下の条件で強さを比較します
* ロイヤルフラッシュ
** AKQJ10 が最強、5432Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* ストレートフラッシュ
** AKQ が最強、32Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* フォーカード
** Aのフォーカードが最強、2のフォーカードが最弱
** フォーカードのランクが同じ場合、5枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* フルハウス
** Aの3枚組が最強、2の3枚組が最弱
** 3枚組が同じランクの場合、残りの2枚組のランクを比較(Aの2枚組が最強, 2の2枚組が最弱)
** 2枚組のランクも同じ場合は引き分け
* フラッシュ
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目〜5枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
* ストレート
** AKQJ10 が最強、5432Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* スリーカード
** Aのスリーカードが最強、2のスリーカードが最弱
** スリーカードのランクが同じ場合、4枚目・5枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* ツーペア
** 2つのペアの内、より大きいランクを持つペア同士で比較(Aのペアが最強, 2のペアが最弱)
** より大きいランクを持つペアが同じランクを持つ場合、弱いランクを持つペア同士で比較
** 2つのペアが同じランクを持つ場合、5枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* ワンペア
** Aのペアが最強, 2のペアが最弱
** ペアのランクが同じ場合、残りの3枚目〜5枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* ハイカード
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目〜5枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
!ライセンス
[[クリエイティブ・コモンズ・ライセンス|http://i.creativecommons.org/l/by-sa/2.1/jp/88x31.png]]
この演習問題は [[クリエイティブ・コモンズ 表示 - 継承 2.1 日本 ライセンスの下に提供されています。|http://creativecommons.org/licenses/by-sa/2.1/jp/]]
!! ポーカー
ポーカー(poker)は、トランプを使って行うゲームのジャンルである。
プレイヤー達は5枚の札でハンド(役、手役)を作って役の強さを競う
( [[https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%82%AB%E3%83%BC]] より抜粋)
!! トランプ
トランプは、日本ではカードを使用した室内用の玩具を指すために用いられている用語で、もっぱら4種各13枚の計52枚(+α)を1セットとするタイプのものを指して言うことが多い。
( [[https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%83%97]] より抜粋)
* カード (card)
** スートとランクを持つ
* スート (suit) - 以下の4種類を持つ
** ♠ (スペード/spade)
** ♥ (ハート/heart)
** ♣ (クラブ/club)
** ♦︎ (ダイヤ/diamond)
* ランク (rank) - 以下の13種類を持つ
** A (エース/ace), 2, 3, 4, 5, 6, 7, 8, 9, 10, J(ジャック/jack), Q(クイーン/queen), K(キング/king)
* カードひと組(4スート x 13ランク = 52枚)のことをデッキ(deck)と呼ぶ
!!課題1 トランプのカード
!!!課題1-1 カードの文字列表記
任意のカード1枚について、その文字列表記を取得してください
* '''スート''' (suit) と '''ランク''' (rank) を与えて '''カード''' (card) を生成してください
* 生成した'''カード'''から'''文字列表記''' (notation) を取得してください
【例】
// スートにスペード, ランクに3を与えてカードを生成
Card threeOfSpades = new Card("♠", "3");
// 「スペードの3」の文字列表記は「3♠」
String notation = threeOfSpades.getNotation(); // => "3♠"
// スートにハート, ランクにJを与えてカードを生成
Card jackOfHearts = new Card("♥", "J");
// 「ハートのJ」の文字列表記は「J♥」
String notation = jackOfHearts.getNotation(); // => "J♥"
!!!課題1-2 カードの比較
任意のカード2枚について、同じスート/ランクを持つか判断してください
* '''カード''' (card) がもう1枚のカードと'''同じスートを持つか''' (has same suit) を判断してください
* '''カード''' (card) がもう1枚のカードと'''同じランクを持つか''' (has same rank) を判断してください
【例】
Card threeOfSpades = new Card("♠", "3"); // スペードの3
Card aceOfSpades = new Card("♠", "A"); // スペードのA
Card aceOfHearts = new Card("♥", "A") // ハートのA
// スペードの3とスペードのAは同じスートを持つ
threeOfSpades.hasSameSuit(aceOfSpades) // => true
// スペードの3とハートのAは異なるスートを持つ
threeOfSpades.hasSameSuit(aceOfHearts) // => false
// スペードの3とスペードのAは異なるランクを持つ
threeOfSpades.hasSameRank(aceOfSpades) // => false
// スペードのAとハートのAは同じランクを持つ
aceOfSpades.hasSameRank(aceOfHearts) // => true
!!課題2 ツーカードポーカー (two card poker) の役を判定
1デッキのトランプの内、任意の2枚から構成される手札を使ったポーカー
!!課題2-1 ツーカードポーカーの役を判定
ツーカードボーカーの任意の '''手札''' (cards) について、その '''役''' (hand) を判定してください
ツーカードポーカーには以下の役があります
* ペア (pair)
** 2枚のカードが同じランクを持つ
* フラッシュ (flush)
** 2枚のカードが同じスートを持つ
* ハイカード (high card)
** 2枚のカードが異なるランク/スートを持つ
!!課題2-2 ツーカードポーカーの役を判定(役の追加)
ツーカードポーカーに新たな役が追加されます
ツーカードボーカーの任意の '''手札''' (cards) について、その '''役''' (hand) を判定してください
複数の役が成立している場合は、より上位の役が成立しているとみなしてください
* ストレートフラッシュ (straight flush)
** ストレートかつフラッシュが成立している
* ペア (pair)
** 2枚のカードが同じランクを持つ
* ストレート (straight)
** 2枚のカードのランクが連続している
** Aは2とKの両方と連続しているとみなす(AK および 2Aの組み合わせはいずれもストレートである)
* フラッシュ (flush)
** 2枚のカードが同じスートを持つ
* ハイカード (high card)
** 上記の役が1つも成立していない
!!課題3 ツーカードポーカーの2つの手札の強さを比較
ツーカードポーカーの2つの手札について、その強さを比較してください
!!課題3-1 2つの手札の役が異なる場合
より上位の役を持つ手札が強いものとします
!!課題3-2 2つの手札の役が同じ場合も含む
同じ役を持つ場合は以下の条件で強さを比較します
* ストレートフラッシュ
** AK が最強、2Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* ペア
** Aのペアが最強, 2のペアが最弱
** ランクが同じ場合は引き分け
* ストレート
** AK が最強、2Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* フラッシュ
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
* ハイカード
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
!!課題4 スリーカードポーカー (three card poker)
1デッキのトランプの内、任意の3枚から構成される手札を使ったポーカー
!!課題4-1 スリーカードポーカーの役を判定
スリーカードボーカーの任意の '''手札''' (cards) について、その '''役''' (hand) を判定してください
スリーカードポーカーには以下の役があります
複数の役が成立している場合は、より上位の役が成立しているとみなしてください
* ストレートフラッシュ (straight flush)
** ストレートかつフラッシュが成立している
* スリーカード (three of a kind)
** 3枚のカードが同じランクを持つ
* ストレート (straight)
** 3枚のカードのランクが連続している
** Aは2とKの両方と連続しているとみなす(AKQ および 32Aの組み合わせはいずれもストレートである. ただし、2AKの組み合わせはストレートとはみなさない)
* フラッシュ (flush)
** 3枚のカードが同じスートを持つ
* ペア (pair)
** 3枚のカードの内、2枚のカードが同じランクを持つ
* ハイカード (high card)
** 上記の役が1つも成立していない
!!課題4-2 スリーカードポーカーの2つの手札の強さを比較
スリーカードポーカーの2つの手札について、その強さを比較してください
2つの手札の役が異なる場合は、より上位の役を持つ手札が強いものとします
2つの手札が同じ役を持つ場合は、以下の条件で強さを比較します
* ストレートフラッシュ
** AKQ が最強、32Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* スリーカード
** Aのスリーカードが最強、2のスリーカードが最弱
** ランクが同じ場合は引き分け
* ストレート
** AKQ が最強、32Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* フラッシュ
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目・3枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
* ペア
** Aのペアが最強, 2のペアが最弱
** ペアのランクが同じ場合、ペアではない3枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* ハイカード
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目・3枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
!!課題5 ファイブカードポーカー (five card poker)
1デッキのトランプの内、任意の5枚から構成される手札を使ったポーカー
!!課題5-1 ファイブカードポーカーの役を判定
ファイブカードボーカーの任意の '''手札''' (cards) について、その '''役''' (hand) を判定してください
ファイブカードポーカーには以下の役があります
複数の役が成立している場合は、より上位の役が成立しているとみなしてください
* ロイヤルフラッシュ (royal flush)
** ストレートフラッシュかつ、AKQJ10 のランクの組み合わせを持つ
* ストレートフラッシュ (straight flush)
** ストレートかつフラッシュが成立している
* フォーカード (four of a kind)
** 5枚のカードの内、4枚のカードが同じランクを持つ
* フルハウス (full house)
** 5枚のカードの内、3枚のカードが同じランクを持ち、かつ、残りの2枚も同じランクを持つ
* フラッシュ (flush)
** 5枚のカードが同じスートを持つ
* ストレート (straight)
** 5枚のカードのランクが連続している
** Aは2とKの両方と連続しているとみなす(AKQJ10 および 5432Aの組み合わせはいずれもストレートである. ただし、432AK/321AK/21AKJ の組み合わせはストレートとはみなさない)
* スリーカード (three of a kind)
** 5枚のカードの内、3枚のカードが同じランクを持つ
* ツーペア (two pair)
** 5枚のカードの内、2枚のカードが同じランクを持ち、残りの3枚の内、2枚が同じランクを持つ
* ワンペア (one pair)
** 5枚のカードの内、2枚のカードが同じランクを持つ
* ハイカード (high card)
** 上記の役が1つも成立していない
!!課題5-2 ファイブカードポーカーの2つの手札の強さを比較
ファイブカードポーカーの2つの手札について、その強さを比較してください
2つの手札の役が異なる場合は、より上位の役を持つ手札が強いものとします
2つの手札が同じ役を持つ場合は、以下の条件で強さを比較します
* ロイヤルフラッシュ
** AKQJ10 が最強、5432Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* ストレートフラッシュ
** AKQ が最強、32Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* フォーカード
** Aのフォーカードが最強、2のフォーカードが最弱
** フォーカードのランクが同じ場合、5枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* フルハウス
** Aの3枚組が最強、2の3枚組が最弱
** 3枚組が同じランクの場合、残りの2枚組のランクを比較(Aの2枚組が最強, 2の2枚組が最弱)
** 2枚組のランクも同じ場合は引き分け
* フラッシュ
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目〜5枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
* ストレート
** AKQJ10 が最強、5432Aが最弱
** ランクの組み合わせが同じ場合は引き分け
* スリーカード
** Aのスリーカードが最強、2のスリーカードが最弱
** スリーカードのランクが同じ場合、4枚目・5枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* ツーペア
** 2つのペアの内、より大きいランクを持つペア同士で比較(Aのペアが最強, 2のペアが最弱)
** より大きいランクを持つペアが同じランクを持つ場合、弱いランクを持つペア同士で比較
** 2つのペアが同じランクを持つ場合、5枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* ワンペア
** Aのペアが最強, 2のペアが最弱
** ペアのランクが同じ場合、残りの3枚目〜5枚目のランクを比較(Aが最強, 2が最弱)
** ランクが同じ場合は引き分け
* ハイカード
** 個々のカードのランクを比較
** より強い1枚を比較(Aが最強, 2が最弱)
** 1枚目が同じランクの場合、2枚目〜5枚目のランクを比較
** ランクの組み合わせが同じ場合は引き分け
!ライセンス
[[クリエイティブ・コモンズ・ライセンス|http://i.creativecommons.org/l/by-sa/2.1/jp/88x31.png]]
この演習問題は [[クリエイティブ・コモンズ 表示 - 継承 2.1 日本 ライセンスの下に提供されています。|http://creativecommons.org/licenses/by-sa/2.1/jp/]]