前两天突发奇想,想搞一个类似巫师3昆特牌的小游戏来让玩家带入《镜花战记·大冒险》的世界观。于是自己脑洞了一个类似拼点数的集换式卡牌桌游。

思维导图写好之后,很快就遇到了第一个困难:洗牌这个函数应该怎么写。

因为使用的是Unity2017版本,因此使用C#这个语言来编写脚本。在权衡了几次后,决定使用”较灵活”的ArrayList储存牌堆、手牌及场上卡牌的数据。于是翻阅了官方自带的文件,临时学习了这个类似array又不是array的类。

 

思路如下,

一、首先需要“随机数”。按理说C#中直接可以实例化Random类的一个对象,再使用Next()方法来取一个区间内的随机数,可是当我在VScode里编写如下代码时,却出现了以下错误:

 

        Random r = new Random();

        int shenmegui = r.Next(0,100);

 

报错如下:

        Type `UnityEngine.Random’ does not contain a definition for `Next’ and no extension method `Next’ of type `UnityEngine.Random’ could be found. Are you missing an assembly reference?

        应该是命名空间的问题?我也using了system了呀。

 

但是我后来调用了另外一个方法,才得以实现这个随机数的创建:

 

        int shenmegui = UnityEngine.Random.Range(0, 100);

 

我们有了随机数,再把这个随机数扔进ArrayList的下标里就能获取到数组中的一个随机元素,再令这个元素与另一个随机的元素交换位置,基本就能实现洗牌这个功能:

 

public ArrayList Shuffle(ArrayList arr){

        ArrayList oldArr = new ArrayList(arr);

        //创建接收数组

        for(int j = 0; j < 2;j++){//多次洗牌

            for(int i = 0;i < oldArr.Count; i++){//洗牌操作:让两个随机下

            //标的元素交换位置,执行次数为数组中元素个数。

                    int r1 = UnityEngine.Random.Range(0, oldArr.Count);

                    int r2 = UnityEngine.Random.Range(0, oldArr.Count);

                    int temp = (int)oldArr[r1];

                    oldArr[r1] = oldArr[r2];

                    oldArr[r2] = temp;

            }

        }

 

        //使用新数组接收交换位置的数组。

        ArrayList newArr = new ArrayList(oldArr);

 

        //遍历ArrayList查看结果

        Debug.Log(“数组中都有:”);

         for(int i = 0; i < arr.Count; i++){

            Debug.Log(newArr[i]);

         }

        //返回数据

        return newArr;

    }

 

大功告成,虽然方法很笨。

希望我能坚持到《镜花战记·大冒险》完成的那天。

 

 

本文地址:https://blog.csdn.net/qq_30491609/article/details/107619724