ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

そろいやすいポーカー#7 リーチの認識4(Unity2019.4.4f1)

f:id:tomo_mana:20211230225650p:plain

今回は第4回に追加したリーチシグナル表示を拡張して、確率表示を追加します。

f:id:tomo_mana:20211230230010p:plain
確率表示

表示仕様

今回はあまり難しいことは特にありません。

こんな表示を想定しています。

○ Flush4: 9(23%)


フォーマットは以下になります。

[リーチ中の役]: [狙い札数] ( 確率=100 * [狙い札数] / [山札の残数] )


狙い札の数をカウントアップする処理を追加しますが、前回の処理に以下の処理を追加するだけなので、コード全体での掲載は割愛します。

int 狙い札カウンタ;

if( !ドロー済( no ) ){
	if( 狙い札[ no ].各フラグ == 0){    // 重複カウントチェック
		狙い札カウンタ++;    // 追加
	}
	狙い札[ no ].各フラグ++;
}

コード

CardSuit.cs

public class CardSuit : MonoBehaviour
{
    void DispReachSignals(HAND_NAME hand)
    {
        string str = null;
        
        if( ReferenceEquals( reachSignals, null ) )
        {
            return;
        }
        // フラッシュ点灯
        if( r_flush ){
            reachSignals.SetSignalDetail( SIGNAL_ID.SIG_FLUSH, r_flush, "Flush" + maxMarkCount + ": " + c_flush + "(" + (100 * c_flush / drawCtrl.remain) + "%)" );
        } else {
            reachSignals.SetSignal( SIGNAL_ID.SIG_FLUSH, r_flush );
        }
        // ストレート点灯
        if( r_straight ){
            reachSignals.SetSignalDetail( SIGNAL_ID.SIG_STRAIGHT, r_straight, "Straight" + maxStraightPtnCount + ": " + c_straight + "(" + (100 * c_straight / drawCtrl.remain) + "%)" );
        } else {
            reachSignals.SetSignal( SIGNAL_ID.SIG_STRAIGHT, r_straight );
        }
        // スリーカード以上点灯
        if( r_over3 ){
            if( pair_num == 2 ){
                // two pair -> fullhouse
                str = "FullHouse";
            } else {
                if( max_paircount == 2 ){
                    // pair -> three card
                    str = "Three of a kind";
                } else 
                if( max_paircount == 3 ){
                    // three card -> four card
                    str = "Four of a kind";
                }
            }
            reachSignals.SetSignalDetail( SIGNAL_ID.SIG_OVER_3_OF_A_KIND, r_over3, str + ": " + c_over3 + "(" + (100 * c_over3 / drawCtrl.remain) + "%)" );
        } else {
            reachSignals.SetSignal( SIGNAL_ID.SIG_OVER_3_OF_A_KIND, r_over3 );
        }
        // ツーペア以上点灯
        if( r_over2pair ){
            if( max_paircount == 2 ){
                // pair -> two pair
                str = "Two Pair";
            } else
            if( max_paircount == 3 ){
                // three card -> fullhouse
                str = "FullHouse";
            }
            reachSignals.SetSignalDetail( SIGNAL_ID.SIG_OVER_2PAIR, r_over2pair, str + ": " + c_over2pair + "(" + (100 * c_over2pair / drawCtrl.remain) + "%)" );
        } else {
            reachSignals.SetSignal( SIGNAL_ID.SIG_OVER_2PAIR, r_over2pair );
        }
        // ペア点灯
        if( r_pair ){
            reachSignals.SetSignalDetail( SIGNAL_ID.SIG_PAIR, r_pair, "Pair: " + c_pair + "(" + (100 * c_pair / drawCtrl.remain) + "%)" );
        } else {
            reachSignals.SetSignal( SIGNAL_ID.SIG_PAIR, r_pair );
        }
    }
    /* その他 略 */
}

ReachSignals.cs

public class ReachSignals : MonoBehaviour
{
    List<TextMeshProUGUI> sigText = new List<TextMeshProUGUI>();
    List<string> defaultStr = new List<string>();

    public void SetSignalDetail( SIGNAL_ID id, bool on, string str )
    {
        if( on ){
            signals[(int)id].color = signalColor[(int)id];
            
            // 文字
            sigText[(int)id].text = str;
        } else {
            signals[(int)id].color = signalColor[(int)SIGNAL_ID.SIG_OFF];
            
            // 文字
            sigText[(int)id].text = defaultStr[(int)id];
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        Image image;
        TextMeshProUGUI text;
        
        foreach( Transform child in gameObject.transform ){
            foreach( Transform gc in child ){
                // シグナル(Panel)
                image = gc.gameObject.GetComponent<Image>();
                if( !ReferenceEquals( image, null ) ){
                    signals.Add( image );
                }
                // 文字表示(Text(TMP))  追加
                text = gc.gameObject.GetComponent<TextMeshProUGUI>();
                if( !ReferenceEquals( text, null ) ){
                    sigText.Add( text );
                    defaultStr.Add( text.text );
                }
            }
        }
        int i = 0;
        foreach( Image im in signals ){
            SetSignal( (SIGNAL_ID)i, false );
            i++;
        }
    }
}

プレイ画面

(前回までと同じURLです。最新の状態に更新されています)
tomo-mana.hatenablog.com

次回

リーチ表示、長かった… 正直こんなに細分化して実装することになるなんて思っていませんでした…

やっとテスト環境が整って、そろいやすいポーカーのメイン、乱数調整に入る準備が整いました。楽しみです!