此代码用于我统一创建的游戏。我有一个包含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);
}
问题是:列表没有混合。
答案 0 :(得分:1)
我认为问题在于您正在尝试重新声明参数。
也许始于:
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;
}
我希望这会有所帮助。
还可以帮助您进行调试的是,将变量记录到某个位置,以便您知道哪里出错了。
答案 1 :(得分:1)
您正在从大数字开始运行for循环并减少i。
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
但是for循环中的测试是i smaller than 1
,因此它永远不会运行。将Debug.Log
放入for循环中以测试并翻转运算符
答案 2 :(得分:0)
您实际上有几个错误,如前面的答案中所述,但首先,Random.Range(0, list.Count);
实际上有偏见,请检查this link以更好地了解原因。
这是更正的代码:
// 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;
}