前提・実現したいこと
Unityの基礎学習として
ハイ&ローなどのごく手軽なカードゲーム制作を
演習しております。
「スペースキーを押すと山札からランダムに1枚引く」
という操作を実現させたいです。
そのためにいろいろなサイトを調べているのですが、
なかなか解決に至りません。
どのようにすれば
上記の内容が実現しますでしょうか。
ご教示いただけますと幸いです。
発生している問題・エラーメッセージ
Assets\Scripts\CardDealer.cs(21,24): error CS0103: The name 'DeckOfCards' does not exist in the current context
Assets\Scripts\CardDealer.cs(21,71): error CS0103: The name 'num' does not exist in the current context
該当のソースコード
CardDealer.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.U2D; using UnityEngine.UI; using System.Linq; public class CardDealer : MonoBehaviour { public Cards Cards; public Image image; public Image cpuimage; public SpriteAtlas CardDeck; private void Update() { //試しに1枚だけカードを表示してみる。 if (Input.GetKeyDown(KeyCode.Space)) { var card = Cards.GetCard(12); var cardImage = CardDeck.GetSprite($"Card_{card.Num}"); image.sprite = cardImage; } if (Input.GetKeyDown(KeyCode.X)) { var card = Cards.GetCard(12); var cardImage = CardDeck.GetSprite($"Card_{card.Num}"); cpuimage.sprite = cardImage; } } }
Cards.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using System; public class Cards : MonoBehaviour { public List<Card> DeckOfCards = new List<Card>(); private void Start() { DeckOfCards.Clear(); for (int i = 0; i < 51; i++) { var card = new Card(CardSuitJudge(i), CardNumJudge(i), i); DeckOfCards.Add(card); } var getCard = GetCard(0); Debug.Log($"Suitは{getCard.CardSuit}数字は{getCard.Number}"); } public Card GetCard(int num) { var card = DeckOfCards.FirstOrDefault(Card => Card.Num == num); DeckOfCards.Remove(card); return card; } public int num = 0; /// <summary> /// カードの数を決める1~13 /// </summary> /// <returns></returns> public int CardNumJudge(int num) { for (int i = 0; i < 13; i++) { if (num % 13 == i) { return i + 1; } } return 0; } /// <summary> /// カードのスートを決める0~3 /// </summary> /// <return></returns> public Card.Suit CardSuitJudge(int num) { for (int i = 0; i < (int)Card.Suit.Max; i++) { if (num / 13 == i) { return (Card.Suit)i; } } return Card.Suit.Invalid; } } /// <summary> /// カードの情報をclassに登録 /// </summary> public class Card { public enum Suit { Invalid = -1, Club, Dia, Heart, Spade, Max }; public Suit CardSuit = Suit.Invalid; public int Number = 0; public int Num = 0; public Card(Suit suit, int number, int num) { CardSuit = suit; Number = number; Num = num; } }
試したこと1
CardDealer.csを下記のように書き換える
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.U2D; using UnityEngine.UI; using System.Linq; public class CardDealer : MonoBehaviour { public Cards Cards; public Image image; public Image cpuimage; public SpriteAtlas CardDeck; private void Update() { //ここを手探りで書き換えてみました。 if (Input.GetKeyDown(KeyCode.Space)) { var card = DeckOfCards.FirstOrDefault(Card => Card.Num == num); var cardImage = CardDeck.GetSprite($"Card_{card.Num}"); image.sprite = cardImage; } }
試したこと2
カードをシャッフルする
参照元:https://nekojara.city/unity-shuffle
ShuffleExtensions.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public static class ShuffleExtensions { /// <summary> /// 指定された要素の配列をシャッフルする /// </summary> public static void Shuffle<Card>(this IList<Card> array) { for (var i = array.Count - 1; i > 0; --i) { // 0以上i以下のランダムな整数を取得 // Random.Rangeの最大値は第2引数未満なので、+1することに注意 var j = Random.Range(0, i + 1); // i番目とj番目の要素を交換する var tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } }
CardDealer.csの加筆後
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.U2D; using UnityEngine.UI; using System.Linq; public class CardDealer : MonoBehaviour { public Cards Cards; public Image image; public Image cpuimage; public SpriteAtlas CardDeck; [SerializeField] private int[] _array; private void Update() { // Zキーが押されたら if (Input.GetKeyDown(KeyCode.Z)) { // 配列をシャッフル _array.Shuffle(); // シャッフル結果を出力 print( string.Join( ", ", _array.Select(x => x.ToString()) ) ); } /// 上記 /// https://nekojara.city/unity-shuffle //試しに1枚だけカードを表示してみる。 if (Input.GetKeyDown(KeyCode.Space)) { var card = Cards.GetCard(13); var cardImage = CardDeck.GetSprite($"Card_{card.Num}"); image.sprite = cardImage; } if (Input.GetKeyDown(KeyCode.X)) { var card = Cards.GetCard(12); var cardImage = CardDeck.GetSprite($"Card_{card.Num}"); cpuimage.sprite = cardImage; } } }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。