質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2407閲覧

ポーカーハンドについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2018/07/23 07:38

前提・実現したいこと

PH の #unfair と #classify を実装したいのですが、いい考えが浮かびません。ヒントを頂けないでしょうか。#unfair は、手札に同じ数字のカードがあったときに、 true を返します。#classify は、今の自分の手札が、どの役にあたるのかを分類します。
Card、CardObj、Joker、PokerHandは、前提です。

Card

Java

1enum Suit { 2 DIAMONDS, CLUBS, HEARTS, SPADES 3} 4 5enum Rank { 6 ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING 7} 8 9public interface Card { 10 public Rank getRank(); 11 public Suit getSuit(); 12 public boolean isJoker(); 13 // the following are not named in interfaces, typically, since they're assumed 14 // public boolean equals(Object o); 15 // public String toString(); 16} 17

CardObj

Java

1public class CardObj implements Card { 2 3 private Rank r; 4 private Suit s; 5 6 public CardObj(Rank r, Suit s) { 7 if (r == null || s == null) { 8 throw new IllegalArgumentException(); 9 } 10 this.r = r; 11 this.s = s; 12 } 13 14 public Rank getRank() { 15 return this.r; 16 } 17 18 public Suit getSuit() { 19 return this.s; 20 } 21 22 public boolean isJoker() { 23 return false; 24 } 25 26 public boolean equals(Object o) { 27 if (!(o instanceof Card)) 28 return false; 29 30 Card that = (Card)o; 31 32 return r.equals(that.getRank()) && s.equals(that.getSuit()); 33 } 34 35 public String toString() { 36 return r + "of" + s; 37 } 38 39} 40

Joker

Java

1public class Joker implements Card { 2 3 public Rank getRank() { 4 throw new UnsupportedOperationException("joker"); 5 } 6 7 public Suit getSuit() { 8 throw new UnsupportedOperationException("joker"); 9 } 10 11 public boolean isJoker() { 12 return true; 13 } 14 15 public boolean equals(Object o) { 16 return ((o instanceof Card) && ((Card)o).isJoker()); 17 } 18 19 public String toString() { 20 return "joker"; 21 } 22 23} 24

PokerHand

Java

1enum HandType { 2 NOTHING, PAIR, TWO_PAIR, THREE_OF_A_KIND, STRAIGHT, FLUSH, 3 FULL_HOUSE, FOUR_OF_A_KIND, STRAIGHT_FLUSH, ROYAL_FLUSH 4} 5 6public interface PokerHand { 7 public Card[] getCards(); 8 public boolean unfair(); // return true if hand contains duplicates 9 public HandType classify(); // classify the hand as its *best* hand type 10} 11

PH

Java

1public class PH implements PokerHand { 2 3 private Card[] cards; 4 5 public PH(Card[] cards) { 6 if (cards == null) 7 throw new IllegalArgumentException(); 8 9 for (Card c: cards) 10 if (c == null) 11 throw new IllegalArgumentException(); 12 13 if (cards.length != 5) 14 throw new IllegalArgumentException(); 15 16 this.cards = cards; 17 } 18 19 public Card[] getCards() { 20 return this.cards; 21 } 22 23 public boolean unfair() { 24 } 25 26 public HandType classify() { 27 } 28 29} 30
DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ヒントですが、まず unfair は、「同じランクのカードが2枚以上ある」のですから、
手持ちのカードをランク順にソートした時に、隣合っている2枚が同一ランクである場合が存在しているなら true です。(3枚以上あるとか、2種類以上あるとか考慮する必要はないので)
つまり、

  1. 手持ちカードをランク順にソートする
  2. 現在のランク(=一つ前のカードのランク)を「なし」にする
  3. カードの先頭から末尾まで以下をくり返す
  4. 着目中のカードのランクが、現在のランクと一致するなら、true を返して終了
  5. 着目中のカードのランクが、現在のランクと異なるなら、現在のランクを着目中のカードのランクにする
  6. ループを抜けたら false で終了

とすればよいことになります。
問題は 1. のソート処理ですが、Java のコレクションでのソートは、比較関数を定義してやることで「どのキーでソートするか」を制御できますから、さほど面倒ではないはずです。

classify については、まずカードのスーツで集計を取る(どのスーツが何個あるか)と、フラッシュであればどこかのスーツが 5 になるはずです(ジョーカーがある場合はジョーカーを一つのスーツとして捉えて、5 のスーツがあるか、4 かつジョーカーがあるか、で判定する)。
同様にランクで集計すれば、ファイブカード、フォーカード、フルハウス、スリーカード、ツーペアは判定できます。ここまでくればあとはストレート系のチェック(ロイヤルストレートは組み合わせが分かっているのでそうなっているか限定でチェック、他のストレートは、「並べた時に隣り合うカードのランクの差が常に1」)も難しくありません。

これで例えば「フラッシュ」かつ「ストレート」なら、ストレートフラッシュとすればいいのです。

投稿2018/07/23 08:17

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/24 01:50

とても詳しい解説をありがとうございます。難しそうですが、頑張って取り組んでみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問