【Unity2017】如何将ArrayList中的元素打乱顺序。
前两天突发奇想,想搞一个类似巫师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