Генерация случайных игральных карт в Unity - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь создать простую покерную игру в Техасский Холдем в единстве, у меня есть 52 спрайта (изображения) каждой карты в колоде

Я пытаюсь загрузить карты игрока в начале раунд (по 2 карты на каждого игрока) для n игроков, каждая из которых соответствует 52 картам в колоде.

, поэтому я пытаюсь сначала сгенерировать случайное число, а затем на основе этого числа, я загружаю указанный c спрайт, но мое единство замирает и ничего не работает, и я знаю, что этот подход не будет работать, если я копирую свой префаб карты, связанный с классом Get_Card, поэтому мне нужен другой подход. ПОМОГИТЕ спасибо

Класс случайных чисел

public class Random_Number
{
   const int n = 52;
    int[] all_num = new int[n];
    int number = 0;


    void Start()
    {

    for (int i = 0; i < n; i++)
    {
        all_num[i] = i;
    }

    }

    // Update is called once per frame
    void Update()
    {

    }

    public int get_me_a_number()
    {


        while (number == 0)
            {
            int rand = Random.Range(0, n);
            number = all_num[rand];
            all_num[rand] = 0;
            }

        Debug.Log(number.ToString());
        return number;
    }
}

Класс карт

public class Get_Card : MonoBehaviour
{
    public Sprite[] Sprite_pic;
    int number;
    Random_Number number_class = new Random_Number();
    // Start is called before the first frame update
    void Start()
    {

            number = number_class.get_me_a_number();
            GetComponent<SpriteRenderer>().sprite = Sprite_pic[number];


    }

Исправлена ​​ошибка ISSUE, проблема с зависанием была вызвана бесконечной l oop.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Start() и Update() - это функция события Unity, которая автоматически вызывается единицей , которая наследует MonoBehaviour и присоединяется к активному игровому объекту . В вашем коде ваш класс Random_Number не наследует Monobehaviour, поэтому Start() - это не что иное, как простой метод, который никогда не будет вызываться без вызывающей стороны.

Поскольку значение по умолчанию неинициализировано int - это 0, а Start() никогда не вызывается, каждый элемент all_num равен нулю. Поэтому, когда вы звоните get_me_a_number(), то, что вы делаете, это просто

while (0 == 0)
{
    // assign 0 to 0
}

, что в основном бесконечно-1 oop. Вот почему ваше единство прекращается.

Вот мое предложение: Инициализируйте Random_Number с помощью явного конструктора:

public Random_number()
{
    for (int i = 0; i < n; i++)
    {
        all_num[i] = i;
    }
}
2 голосов
/ 02 апреля 2020

в вашем случае в классе Random_Number

void Start()
{
    for (int i = 0; i < n; i++)
    {
        all_num[i] = i;
    }
}

никогда не вызывается .. поэтому all_num - это массив нулевого значения (-> бесконечный l oop в то время)

я полагаю вы хотите вызвать его, когда экземпляр класса

, поэтому я предлагаю вам объявить конструктор:

public Random_number()
{
    for (int i = 0; i < n; i++)
    {
        all_num[i] = i;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...