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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

772閲覧

オリジナルポーカーの役判定について

kante

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/10/01 12:06

大学の授業でお金を題材にしたオリジナルポーカーをunityを使って作成しています。

プレーヤーは7つの項目の山札からカードを1枚ずつ引きます。
それぞれの項目の金額の合計や組み合わせで役が決定します。
例として貯金2万円、住宅5万円、生活費3万円、衣服2万円、趣味2万円、交際費2万円、を引いた場合はロイヤルライフという役になります。
そこで役判定のコードを書いているのですが、それぞれの山札から引いた7枚の手札を10種の役と比べるコードが思いつきません。
どのような方法があるのか、また、どのような書き方になるのか教えていただけないでしょうか。

public class NewBehaviourScript : MonoBehaviour
{
public enum PokerHand
{
ロイヤルライフフラッシュ,ロイヤル将来メザッシュ,現状充実ウイッシュ,金貯まりペア,FULLハウス,健康ペア,
ハッピー3カード,見栄ペア,人生ダイナシペア,健全家計ストレート,
}
class life {
int saving =2;
int home = 5 ;
int life = 3;
int clothes = 3;
int hobby = 2;
int dating = 2;
}
class syourai
{
int saving = 4;
int home = 5;
int life = 3;
int clothes = 1;
int hobby = 2;
int dating = 1;
}
class jyuuzitu
{
int saving = 1;
int home = 5;
int life = 3;
int clothes = 2;
int hobby = 3;
int dating = 2;
}
class kenzen
{
int saving = 4;
int home = 5;
int life = 3;
int clothes = 1;
int hobby = 2;
int dating = 1;
}
class fullhouse
{
int home = 9;
int life = 2;
int clothes = 0;
}

class happy3 { int clothes = 3; int hobby = 3; int dating = 3; } class kanetamari { int saving = 6; int home = 2; } class kenkou { int life = 3; int hobby = 2; } class mie { int life = 7; int clothes = 5; } class dainashi { int hobby = 5; int dating = 5; }

}
自分はクラスを用いて判断しようとしたのですがこの先の判定が思いつきませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、強い役が完成していたら、それより弱い役は判定する必要がないかと思います。
なので一番強い役から順に判定していきます。

ひとまずロイヤルライフフラッシュかどうかだけを判定できるようにしましょう。

役の判定1つにつき、1つのメソッドを作るとよいでしょう。

C#

1//ロイヤルライフフラッシュが成立しているかどうかの判定 2//成立していたらTrue,不成立ならFalseが返ってきます 3bool RoyalLifeFlush( List<Card> Hands ) 4{ 5 //手札に特定のカードが存在するか調べる 6 7  //貯金2万のカードを持っているかどうか 8 bool hasSavings2 = Hands.Exists(card=> card.type == CardType.貯金 && card.value == 2) 9 10 //住宅5万のカードを持っているかどうか 11 bool hasHome5 = Hands.Exists(card=> card.type == CardType.住宅 && card.value == 5) 12 13 ...中略 14 15 //全部Trueだったらロイヤルライフフラッシュ成立 16 return hasSavings2 && hasHome5 && ..... 17} 18 19//ロイヤル将来メザッシュが成立しているかどうかの判定 20bool RoyalFutureMezash( List<Card> Hands ) 21{ 22} 23 24PokerHand HandJudgment() 25{ 26 if( RoyalLifeFlush(Hands) ) return PokerHand.ロイヤルライフフラッシュ; 27 if( RoyalFutureMezash(Hands) ) return PokerHand.ロイヤル将来メザッシュ; 28}

もっとスマートに書けますが、とりあえずわかりやすさ重視にしました。

Cardクラスは、CardTypeというEnumと、int Valueを持っています。

一旦これぐらいでどうでしょうか?

ここからメソッドではなく、判定用のクラスを作って、判定用クラスの配列をfor文で回して、
それだけで判定できるようになったらOKかなと思います

もしわからなければ更に追記していきますので、何度か質問してください。

投稿2022/10/01 13:32

編集2022/10/01 13:59
ganta7188

総合スコア436

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

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

kante

2022/10/06 00:54 編集

分かりやすい丁寧な回答ありがとうございます!「判定用のクラスを作って、判定用クラスの配列をfor文で回して、それだけで判定できるようになったらOKかなと思います」ここの部分の意味が分からないのですが、配られた手札とすべてのメソッドの内容をfor文で判定するということでしょうか?また、 PokerHand HandJudgment() { if( RoyalLifeFlush(Hands) ) return PokerHand.ロイヤルライフフラッシュ; if( RoyalFutureMezash(Hands) ) return PokerHand.ロイヤル将来メザッシュ; }ここの部分は判定する部分ではないのでしょうか?
ganta7188

2022/10/06 15:54

それについては、一旦完成したあとの発展なので、まずは気にしなくて大丈夫です。 僕が書いた方法は初心者向けなので、本来はもっとクラスを上手く使ったほうが、 追加、変更、修正が簡単になるという話ですね。 どういうことか想像付きにくいと思いますので一応クラスでやる方法を書いておきますが、 まずはメソッドでやる方法を試してからのほうが良いかなと思います。 HandJudgementerというクラスを作り、 それに、それぞれの役のデータを入れることで、あとでまとめてfor文で処理できるようにします。 ```C# var RoyalLifeFlush = new HandJudgementer(PokerHand.ロイヤルライフフラッシュ); RoyalLifeFlush.Add(CardType.貯金, 2); RoyalLifeFlush.Add(CardType.住宅, 5); ・・・中略 var RoyalFutureMezash = new HandJudgementer(PokerHand.ロイヤル将来メザッシュ); RoyalFutureMezash .Add(CardType.貯金, 4); RoyalFutureMezash .Add(CardType.住宅, 5); ・・・中略 JudgementerList.Add(RoyalLifeFlush); JudgementerList.Add(RoyalFutureMezash); ・・・中略 for(int i=0; i < JudgementerList.Count; i++) { //Judgeという共通のメソッドで、全ての役を判定 bool seiritsu = JudgementerList[i].Judge(Hands);  //成立していた場合は、成立役名を取得して、for文を抜ける if(seiritsu) { seiritsuYaku = JudgementerList[i].pokerHand; break; } } ``` みたいなイメージです。 こうすることでメソッドを作るよりは短くなりますし、後から修正箇所を見つけやすくなります。 また、例えば「ジョーカーを持っていた場合は、持っていないカードに置き換えて判定する」 などの仕様が入った場合に、メソッドがたくさんある場合はすべてのメソッドに修正を加える必要があります。 ですがクラスを使って共通のJudgeメソッドを使う場合、Judgeメソッドにジョーカーの処理を追加するだけでよくなります。 こんな感じで、クラスを使うとそれ以外にも色々と利点がありますので、 良かったら勉強を進めてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問