【问题标题】:Random Playing Cards Generation in UnityUnity 中的随机纸牌生成
【发布时间】:2020-04-02 07:31:37
【问题描述】:

我正在尝试统一创建一个简单的德州扑克游戏,我有一副牌中有 52 张卡片的精灵(图像)

我正在尝试在一轮开始时为 n 名玩家加载玩家卡(每个玩家 2 张卡),所有玩家都对应于套牌中的 52 张卡。

所以我要做的是首先生成一个随机数,然后基于该数字,我加载特定的精灵,但我的统一冻结并且没有任何工作,我知道如果我复制我的这种方法将不起作用与 Get_Card 类绑定的 Card Prefab,所以我需要另一种方法。帮忙谢谢

随机数类

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 现已修复,冻结问题是由无限循环引起的。

【问题讨论】:

  • 是否肯定会调用 Random_Number Start 来初始化 all_num?发完所有 52 张牌后,您的代码也将锁定:您可以让 get_me_a_number 发现 all_num 全为零并重新洗牌。
  • number in Random_Number 是班级成员,因此您每次都将返回同一张卡,因为您不会将其重置为零。 (可能与冻结无关)
  • 阻止你改变问题......不是很好;,答案没有链接到关于无限循环的新问题..请重新发布最后一个问题并打开一个新问题..但不要改变问题
  • @Frenchy 好的兄弟
  • 如果你想增加随机生成使用随机算法dotnetfiddle.net/zrHCuw

标签: c# unity3d


【解决方案1】:

在您的情况下,在 Random_Number 类中

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

永远不会被调用..so all_num 是一个零值数组(-> while 中的无限循环)

我想你想在类被实例化时调用它

所以我建议你声明一个构造函数:

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

【讨论】:

  • 我已经更新了问题,谢谢,问题已经结束了。
  • 在同一个帖子中更改问题既不好也不愉快。请通过验证答案来关闭您的问题(并加载您的初始无限循环问题)并发布新问题
【解决方案2】:

Start()Update() 是 Unity 事件函数,会被 Unity 自动调用继承MonoBehaviour,并附加到活动游戏对象。在您的代码中,您的类Random_Number 没有继承Monobehaviour,因此Start() 只不过是一个方法,没有调用者就永远不会调用它。

因为未初始化的int 的默认值是0 并且永远不会调用Start(),所以all_num 的每个元素都是零。所以当你打电话给get_me_a_number()时,你所做的只是

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

这基本上是无限循环。这就是为什么你们的团结停止了。

这是我的建议:使用显式构造函数初始化Random_Number

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2021-01-01
    • 2022-06-10
    • 2020-10-16
    相关资源
    最近更新 更多