対戦カードゲームをunityとc#とphotonで作りたい:役の点数に基づいた勝敗判定(12)

Githubソースコード公開&まとめ

今更気付いたことですが、6桁あれば充分に役の点数化は可能でした。1桁目で役の種類を特定し、残りの5桁で数値判定をすれば良かったですね。わざわざ桁数を上げる必要はありませんでした。折角無理にでも判定が出来ているので今の所は直さないでおこうと思います。次回このプログラムを書き直すときには下記のように書き直したいと思います。

役     点数
"pig "      0ABCDE
"1pair"     1AABCD
"2pair"     2AABBC
"3card"     3AAABC
"straight"  4C0000
"Flush"     5ABCDE
"Fullhouse" 6AAABB
"4card"     7AAAAB
"S.Flush"   8C0000

今回はお互いの点数を比べる部分を考えます。前回のスクリプトの最後の部分でRoomCustomPropertyに役の点数を送っています。本来であれば、エラーを出さないために、双方のデータが送られたことを確認してから、どちらかが勝っているかを比べるボタンを出したい所です。よって、(int)PhotonNetwork.room.customProperties[key]が存在するかどうかを判定したいのですが、この文自体はintにキャストしているので、!=nullはいつも正となってしまい、それに加え存在しない場合にNullReferenceErrorが出てしまいます。調べてみたのですがnullかどうかの判定の仕方が分からず、取り急ぎはボタンは双方がデータを送った後、合意の下で押されるという事を前提として、最初から押せる状態で表示してしまう仕様としました。非常に心残りなので、後日やり方を改めて探します。

空のオブジェクトを作成して、MiddleJudge.csをアタッチしてMiddleJudgeクラスを作りました。先に部屋に入ったプレイヤーのPhotonNetwork.Player.IDが1、次のプレイヤーが2になる事が確認できたので、IDによってif文で自分の点数と相手の点数を分けています。それによって勝ち負けの判定が正しく行われるように工夫してあります。

public class MiddleJudge : MonoBehaviour {

    public GameControler gameControler;
    public string winner;

    double Myhand;
    double Yourhand;
    private void Awake()
    {
        gameControler = GetComponent<GameControler>();
    }

    void OnGUI()
    {
        
            if (GUI.Button(new Rect(400, 100, 256, 28), "Judge"))
            {
                //HITMEを押したら下記を実行

                if (PhotonNetwork.player.ID == 1)
                {
                    Myhand = (double)PhotonNetwork.room.customProperties[PhotonNetwork.player.ID + "middle"];
                    Yourhand = (double)PhotonNetwork.room.customProperties[2 + "middle"];
                }
                else
                {
                    Myhand = (double)PhotonNetwork.room.customProperties[PhotonNetwork.player.ID + "middle"];
                    Yourhand = (double)PhotonNetwork.room.customProperties[1 + "middle"];
                }
                if (Myhand >= Yourhand)
                {
                    winner = "You win!";
                }
                else
                {
                    winner = "You lose!";
                }
            }
    }
}

左のプレイヤーの画面

 
右のプレイヤーの画面

このように、お互いの勝ち負け判定が正しく出る事が確認できます。このテキストはGameControler.csのint winnerを参照していて、テキストにWinner.csをつける事で、winnnerのstring値を表示するようになっています。役の名前と点数も同様の考え方で表示しています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Winner : MonoBehaviour {

    MiddleJudge middleJudge;


    void Update()
    {
        MiddleJudge middleJudge = GameObject.Find("MiddleJudge").GetComponent<MiddleJudge>();
        this.GetComponent<Text>().text = middleJudge.winner;
    }
}

これによって、役判定とプレイヤーの勝ち負け判定が正しくできるようになりました。今の所一つのハンドに対してしか対応していないので、これを3/5/5の全てにおいて同時に判定しなければなりません。そして、今後は勝った方が掛けたチップを貰える仕組みも必要になります。これからどう実装するか考えていきたいと思います。

おすすめの記事