【发布时间】:2011-10-31 18:00:05
【问题描述】:
我有 2 个一维数组,包含完全相同的值:
public int[] start = new int[21] { 0, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14 };
public int[] end = new int[21] { 0, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14 };
下面是我用来生成随机索引的代码,并从具有所述索引的数组中获取元素,并将其粘贴到二维数组中,随机生成 X 和 Y 索引。
for (int i = 0; i < 21; i++)
{
Random ranNum = new Random();
int genX = 0;
int genY = 5;
int indx = 1;
while (gameBoard[genX, genY].rank > -1)
{
genX = ranNum.Next(0, 9);
genY = ranNum.Next(5, 8);
}
while (start[indx] == -1)
{
indx = ranNum.Next(0, 21);
}
if (gameBoard[genX, genY].rank == -1)
{
gameBoard[genX, genY].rank = start[indx];
start[indx] = -1;
}
while (gameBoard[genX, genY].rank > -1)
{
genX = ranNum.Next(0, 9);
genY = ranNum.Next(0, 3);
}
while (end[indx] == -1)
{
indx = ranNum.Next(0, 21);
}
if (gameBoard[genX, genY].rank == -1)
{
gameBoard[genX, genY].rank = end[indx];
end[indx] = -1;
}
}
基本上,它从“开始”和“结束”数组中获取一个值,将它们替换为“-1”(这样它们就不会再次被选中),扫描二维数组中的“-1s”(所以它不会将号码放在已经有号码的位置),并将其放在那里。
请注意,对于“开始”和“结束”数组,随机数的最小值和最大值是不同的。这是为了确保它们最终彼此远离,在二维数组的另一侧。
此代码有效。现在,我有一个代码可以将所有变量重置回之前的状态。一个同样有效的复位功能。看,如果用户对随机放置不满意,他们可以重置数组,然后再次随机化。
此时程序只是挂起/锁定。没有错误,没有消息,它只是停止工作。拜托,您能否分享一下有关如何/为什么会发生这种情况的任何想法?
注意:如果我删除有关“end”数组的整个 while 循环,程序可以随机化并重置它想要的一切。
不管怎样,重置的代码:
int resVal = 0;
for (int i = 0; i < 21; i++)
{
startBoard[i] = resVal;
enemyBoard[i] = resVal;
if (i == 0)
resVal++;
else if (i >= 6 && i < 19)
resVal++;
}
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 9; x++)
{
gameBoard[x, y] = new classPiece();
gameBoard[x, y].rank = -1;
}
}
【问题讨论】:
-
您应该重用
Random实例。 -
如果它在重置功能触发时挂起,也许您也应该发布它的代码以便我们可以看到它在做什么?
-
"为了提高性能,创建一个 Random 以随着时间的推移生成许多随机数,而不是重复创建一个新的 Random 以生成一个随机数。" - 引用自MSDN
-
您确定 end[] 在重置后不只包含 -1 或其他内容吗?
-
重写了代码以减少对 Random 语句的使用。感谢您的意见。