这段代码是为我在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
所以它永远不会运行。放置一个 Debug.Log
在for-loop中测试并翻转运算符。
我认为问题在于你试图重新声明一个参数。
如需了解更多信息。https:/docs.microsoft.comen-usdotnetcsharpprogramming-guideclasses-and-structspassing-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;
}