質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

1384閲覧

【Unity】山札からカードを1枚引きたいです。

IT___

総合スコア0

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/01/09 07:17

前提・実現したいこと

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; } } }

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

基本的に変数名は最初小文字(ローワーキャメルケース)にした方が良いと思います。
大文字にするにしても少なくとも型と同名にしてはいけません。

そうしたうえで以下のようにすればエラーが消え、カード(おそらくクラブの13?)が表示されませんか?

//試しに1枚だけカードを表示してみる。 if (Input.GetKeyDown(KeyCode.Space)) { var card = cards.GetCard(12); var cardImage = cardDeck.GetSprite($"Card_{card.Num}"); image.sprite = cardImage; }

ランダムに表示する方法に関しては任意のカードを表示させることが出来るようになってから考えてみては如何でしょう?

ちなみにGetCard関数でカードを取得する際にそのカードをリストから削除しているので、2枚目以降のカードはそれを考慮して関数を呼び出す必要がありそうです(ランダムなら関係ないですかね)。

投稿2022/01/29 12:36

Kyukooon

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問