簡単なカードゲーム作成の第5回目を進めていきます。今回は「勝敗の判定」をしていきます。ここまでくると一応ゲームっぽさが出てきます。楽しさとかは全くないですが・・・
はじめに
今回は第5回目です。第1回目は下記から。
ゲーム作成開始
今回は「自分が選んだカード」と「自動選択された敵のカード」の勝敗判定を実装していきます。
軽くおさらい
これまで実装したのを簡単におさらいすると、Part1で「カードを生成」、Part2で「プレイヤーがカードを選択できるように」、Part3で「プレイヤーのカード決定と敵カードの配置」、そしてPart4では「敵カードをランダムで選択」です。
カードの勝敗判定
まずは判定結果(勝ち負け)を真ん中に表示するため、「テキストオブジェクト」を追加。名前はResultにしておきます。サイズや幅を調整し、テキストの中身は消しておきます。

選択された「カードを比較する」ため、選択済みカードの値を保有します。「Cards」オブジェクトの配下には「自分のカード」、「EmCards」オブジェクトの配下には「敵カード」がある状態です。

それぞれに「選択されているカード番号を保管する」変数を追加します。まずは「Cards」を下記のように変更。「intCardNumber」に数値を保管します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Cards : MonoBehaviour { public GameObject SelectCard; public Vector3 InitPosition; public int intCardNumber; }
カードを選択するごとに数値を書き換えるため、「CardScript」の「ChoiceCard」を下記のように変更。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CardScript : MonoBehaviour { public void ChoiceCard() { GameObject objCards = this.transform.parent.gameObject; if (objCards.GetComponent<Cards>().SelectCard != null) { objCards.GetComponent<Cards>().SelectCard.GetComponent<Transform>().localPosition = objCards.GetComponent<Cards>().InitPosition; } objCards.GetComponent<Cards>().SelectCard = this.gameObject; objCards.GetComponent<Cards>().InitPosition = this.transform.localPosition; objCards.GetComponent<Cards>().intCardNumber = int.Parse(this.transform.Find("Text").GetComponent<Text>().text); this.transform.localPosition = new Vector3(-400, 400, 0); } }
次が敵のカード。自動でカードが選択されたときにカード番号も保管するよう「intEnemyCardNumber」を追加、「Enemy」を下記のように変更します。
using System.Collections; 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(400, -400, 0); intEnemyCardNumber = int.Parse(EmCardlist[r].transform.Find("Text").GetComponent<Text>().text); } }
自分が選択したカード番号は「intCardNumber」、敵のカード番号は「intEnemyCardNumber」に格納されるので、この数値を比較して勝敗の判定をします。
「Operator」を下記に変更。「OpenCard」に敵のカードを自動選択した後に「JugeCard」という判定処理を追加。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Operator : MonoBehaviour { public GameObject CardPrefab; public GameObject Cards; public GameObject EmCards; public GameObject Result; private void Start() { //Player dealCards(1, -500, Cards); dealCards(2, -250, Cards); dealCards(2, 0, Cards); dealCards(2, 250, Cards); dealCards(3, 500, Cards); //Enemy dealCards(1, -500, EmCards); dealCards(2, -250, EmCards); dealCards(2, 0, EmCards); dealCards(2, 250, EmCards); dealCards(3, 500, EmCards); } void dealCards(int iNumber,float fPosition,GameObject objParent) { GameObject prefab = (GameObject)Instantiate(CardPrefab); prefab.transform.Find("Text").GetComponent<Text>().text = iNumber.ToString(); prefab.transform.SetParent(objParent.transform, false); prefab.transform.localPosition = new Vector3(fPosition, 0, 0); } public void OpenCard() { EmCards.GetComponent<Enemy>().EnemyCardSelect(); JugeCard(); } private void JugeCard() { 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"; } } }
「自分が選択したカード番号」と「敵のカード番号」を取得。判定結果に応じてテキストの内容を変えています。判定方法はじゃんけん(三すくみ)でおなじみの方法です。一つ一つ場合分けする方法もあります。
これで一度、実行してみます。

1.自分の場から1枚カード選択、2.OPENボタンを押す、3.敵カードが自動で選択されて、結果が表示される。
このように動作すればOKです。とりあえずこれで一連の流れは完成。もちろん、このままでは数字なので画像に変えないとなんだかおかしいですし、様々なバグが沢山ある状態です。