这段代码是为我在unity中创建的游戏编写的。我有一个包含100个坐标元素的列表,我想实例化它们的框。盒子的数量应该是50%,并且是随机的。如果我运行脚本,我会得到50%的框,但按默认顺序。我的脚本不会打乱列表中的元素。谢谢你的帮助!
// List has 100 elements of coordinates ( x & y)
public List<Vector2> ListPosBoxes = new List<Vector2>();
// Start
void Start()
{
AmountOfBoxes(ListPosBoxes);
}
// Method to display 50% shuffled boxes
void AmountOfBoxes(List<Vector2> list)
{
// Take list -> shuffle -> new list
list = ShuffleList(list);
for (int i = 0; i < list.Count/2; i++)
{
// Create Box
BoxGenerator(list[i]);
}
}
// Method to suffle list
List<Vector2> ShuffleList(List<Vector2> list)
{
Vector2 tmp;
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
{
// Pick random Element
int j = Random.Range(0, list.Count);
// Swap Elements
tmp = list[j];
list[j] = list[i - 1];
list[i - 1] = tmp;
}
return list;
}
// Method to create Box
void BoxGenerator(Vector2 box)
{
CreateBox(box.x, box.y);
}
问题是:列表并不混杂
您正在从高数字运行for循环并减少i。
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
但是for循环中的测试是i smaller than 1
,所以它永远不会运行。在for循环中放置Debug.Log
以测试并翻转操作员
我认为问题在于您试图重新声明一个参数。
有关更多信息:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-parameters
也许从开始
void AmountOfBoxes(List<Vector2> list)
{
// Take list -> shuffle -> new list
shuffled_list = ShuffleList(list);
for (int i = 0; i < list.Count/2; i++)
{
// Create Box
BoxGenerator(shuffled_list[i]);
}
}
// Method to suffle list
List<Vector2> ShuffleList(List<Vector2> list)
{
Vector2 tmp;
list *= list;
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
{
// Pick random Element
int j = Random.Range(0, list.Count);
// Swap Elements
tmp = list[j];
list[j] = list[i - 1];
list[i - 1] = tmp;
}
return list;
}
我希望这能有所帮助。
同样可以帮助您进行调试的是,将变量记录在某个地方,这样您就可以知道哪里出了问题。
正如前面的答案中所提到的,您实际上有几个错误,但首先,Random.Range(0, list.Count);
实际上相当有偏见,请查看此链接以更好地了解原因。
这是更正后的代码:
// fisher–yates shuffle
for (int i = 0; i < list.Count; i++) {
// Pick random Element
int j = Random.Range(i, list.Count);
// Swap Elements
Vector2 tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}