簡単なカードゲームの作成(カイジのEカード風)Part5.勝敗判定|Unityゲーム制作

簡単なカードゲーム作成のPart5を進めていきます。今回は「勝敗の判定」をしていきます。ここまでくると一応ゲームっぽさが出てきます。

はじめに

今回はPart5です。Part1は下記から。

Part1は「仮でカードの生成」を作成、Part2は「カードの配布とカードをクリックして選択」するのを作成、Part3では「カードを場に出す」、「対戦相手のカード配布」を作成、Part4では「対戦相手のカードを自動でランダムに選択」を作成しました。

Part5では「カードの勝敗判定」を実装していきます。

ゲーム作成開始

今回は「自分が選んだカード」と「自動選択された敵のカード」の勝敗判定を実装していきます。

結果表示UI

判定結果(勝ち負け)を真ん中に表示するため、「UI」→「Legacy」→「Text」を追加。

名前はResultにしておきます。サイズや幅を調整し、テキストサイズなども変更して、テキストの中身は消しておきます。

カードの勝敗判定

「Cards」オブジェクトの配下には「自分のカード」、「EmCards」オブジェクトの配下には「敵カード」がある状態です。

「選択カードを比較する」ため、選択したカードの値を保有します。

それぞれのスクリプトに「選択しているカード番号を保管する」変数を追加します。まずは「Cards」を下記のように変更。「intCardNumber」に数値を保管します。

using UnityEngine;

public class Cards : MonoBehaviour
{
    public GameObject SelectCard;
    public Vector3 InitPosition;
    public int intCardNumber;
}

カードを選択するごとに数値を書き換えるため、「CardScript」の「ChoiceCard」を下記のように変更します。

using UnityEngine;
using UnityEngine.UI;

public class CardScript : MonoBehaviour
{
    private Cards cards;

    private void Start()
    {
        cards = transform.parent.gameObject.GetComponent<Cards>();
    }
    public void ChoiceCard()
    {
        if (cards.SelectCard != null)
        {
            cards.SelectCard.GetComponent<Transform>().localPosition = cards.InitPosition;
        }
        cards.SelectCard = this.gameObject;
        cards.InitPosition = this.transform.localPosition;

        int num = int.Parse(this.transform.Find("Text").GetComponent<Text>().text);
        cards.intCardNumber = num;

        transform.localPosition = new Vector3(-400, 350, 0);
    }
}

次に、敵の自動で選択したカード番号も保管するよう「Enemy」スクリプトを下記のように変更します。

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

public class Enemy : MonoBehaviour
{
    public int intEnemyCardNumber;
    List<GameObject> EmCardlist = new List<GameObject>();

    public void EnemyCardSelect()
    {
        foreach (Transform child in transform)
        {
            EmCardlist.Add(child.gameObject);
        }
        int r = Random.Range(0, EmCardlist.Count - 1);
        EmCardlist[r].transform.localPosition = new Vector3(70, -350, 0);
        intEnemyCardNumber = int.Parse(EmCardlist[r].transform.Find("Text").GetComponent<Text>().text);
    }
}

自分が選択したカード番号は「intCardNumber」、敵のカード番号は「intEnemyCardNumber」に格納されるので、この数値を比較して勝敗の判定をします。

「Operator」を下記に変更。「OpenCard」に敵のカードを自動選択した後に「JudgeCard」という判定処理を追加します。

using UnityEngine;
using UnityEngine.UI;

public class Operator : MonoBehaviour
{
    public GameObject CardPrefab;
    public GameObject Cards;
    public GameObject EmCards;
    public GameObject Result;

    private float ad_y_pos = 50.0f;
    private Enemy enemyobj;

    private void Start()
    {
        // 省略
    }

    void dealCards(int number,float position,GameObject parent,float adpos)
    {
        // 省略
    }

    public void OpenCard()
    {
        enemyobj.EnemyCardSelect();
        JudgeCard();
    }

    private void JudgeCard()
    {
        int myCardNm = Cards.GetComponent<Cards>().intCardNumber;
        int enCardNm = EmCards.GetComponent<Enemy>().intEnemyCardNumber;
        Text txtResult = Result.GetComponent<Text>();

        //1がグー、2がチョキ、3がパー
        if ((myCardNm - enCardNm + 3) % 3 == 0)
        {
            //引き分け
            txtResult.text = "DRAW";
        }
        else if ((myCardNm - enCardNm + 3) % 3 == 1)
        {
            //負け
            txtResult.text = "LOSE";
        }
        else
        {
            //勝ち
            txtResult.text = "WIN";
        }
    }
}

「自分が選択したカード番号」と「敵のカード番号」を取得。判定結果に応じてテキストの内容を変えています。判定方法はじゃんけん(三すくみ)でおなじみの方法です。一つ一つ場合分けする方法もあります。

Operatorスクリプトのパラメータをセットします。

試しに、実行してみます。

自分の場から1枚カード選択、OPENボタンを押す、敵カードが自動で選択されて、結果が表示される。

このように動作すればOKです。とりあえずこれで一連の流れは完成。もちろん、このままでは数字なので画像に変えないとダメですし、バグが沢山ある状態です。

タイトルとURLをコピーしました