【发布时间】:2020-05-06 02:30:43
【问题描述】:
所以基本上,我有一个每个数字有 2 个的列表,我想将其中一个数字随机分配给每张实例化的卡片。这是一个益智记忆游戏,您可以在其中找到匹配项。
当我有 2 个 gridRows 和 4 个 gridCols 时,游戏运行良好,但如果我更改行数或列数,我会得到:ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。参数名:index,阻止我扩展游戏。我尝试在当前列表中添加额外的数字,但这似乎不起作用,而且如果我想要有很多行和列,这种方式似乎也不是很有效
我想要做的是获取一个列表,然后在每次开始比赛时对其内容进行洗牌,然后在我实例化时按顺序循环索引(内容已经洗牌),这是我的逻辑,但无法做到它出于某种原因工作....
有人可以帮我扩展它并找到存储索引的更好方法吗?
代码如下:
public const int gridRows = 2;
public const int gridCols = 4;
public const float offsetX = 4f;
public const float offsetY = 5f;
public MainCard originalCard;
public Sprite[] images;
private void Start()
{
Vector3 startPos = originalCard.transform.position;
List<int> numbers = new List<int> { 0, 0, 1, 1, 2, 2, 3, 3 };
numbers = Shuffle(numbers);
for (int i = 0; i < gridCols; i++)
{
for (int x = 0; x < gridRows; x++)
{
MainCard card;
if (i == 0 && x == 0)
{
card = originalCard;
}
else
{
card = Instantiate(originalCard) as MainCard;
}
int index = x * gridCols + i;
int id = numbers[index];
card.ChangeSprite(id, images[id]);
float posX = (offsetX * i) + startPos.x;
float posY = (offsetX * x) + startPos.y;
card.transform.position = new Vector3(posX, posY, startPos.z);
}
}
List<T> Shuffle<T>(List<T> cards)
{
for (int i = 0; i < cards.Count; i++)
{
T temp = cards[i];
int randomIndex = Random.Range(i, cards.Count);
cards[i] = cards[randomIndex];
cards[randomIndex] = temp;
}
return cards;
}
}
}
【问题讨论】:
-
当有人回答时,您不应该删除您的问题。 Stack Overflow 被设计成一个可搜索的存储库;如果您删除您的问题,人们不太可能找到您的问题或理解答案。