Actionscript 3 为什么我的Actionscript 3程序会随机陷入无限循环?
mBlocks是块对象的二维数组。每次我的应用程序运行时,它都会运行InitGridNumbers函数。有时,它会陷入无限循环。其他时候,它构建和运行时不会出现问题Actionscript 3 为什么我的Actionscript 3程序会随机陷入无限循环?,actionscript-3,debugging,adobe,infinite-loop,flashdevelop,Actionscript 3,Debugging,Adobe,Infinite Loop,Flashdevelop,mBlocks是块对象的二维数组。每次我的应用程序运行时,它都会运行InitGridNumbers函数。有时,它会陷入无限循环。其他时候,它构建和运行时不会出现问题 public function InitGridNumbers():void { var tempRow:Array; var tempColumn:Array; var tempNum:int; for (var i:int = 0; i < mNumRows; i++) { t
public function InitGridNumbers():void
{
var tempRow:Array;
var tempColumn:Array;
var tempNum:int;
for (var i:int = 0; i < mNumRows; i++)
{
tempRow = GetRow(i);
for (var j:int = 0; j < mNumColumns; j++)
{
// if number is unassigned
if (tempRow[j] == 0)
{
var cantMoveOn:Boolean = true;
while (cantMoveOn)
{
tempNum = Math.random() * mNumColumns + 1;
if (!CheckRow(i, tempNum) && !CheckColumn(j, tempNum))
cantMoveOn = false;
}
mBlocks[i][j].SetNumber(tempNum);
}
}
}
}
公共函数InitGridNumbers():void
{
var-tempRow:数组;
列:数组;
var-tempNum:int;
对于(变量i:int=0;i
公共函数CheckRow(rowNum:int,checkNum:int):布尔值
{
var tempRow:Array=GetRow(rowNum);
对于(变量i:int=0;i
公共函数GetRow(rowNum:int):数组 { var rowArray:Array=新数组(mNumRows); 对于(变量i:int=0;i
checkColumn
、getColumn
和getRow
方法是错误的。要获取行,您应该复制numColumns
项;要获取列,您应该复制numRows
项。换句话说,如果有r
行和c
列,则每行和每列将分别有c
项和r
项
public function checkColumn(columnNum:int, checkNum:int):Boolean
{
var tempColumn:Array = getColumn(columnNum);
for (var i:int = 0; i < mNumRows; i++)
{
if (checkNum == tempColumn[i])
return true;
}
return false;
}
public function getRow(rowNum:int):Array
{
var rowArray:Array = new Array();//needn't specify length in advance.
for (var i:int = 0; i < mNumColumns; i++)
rowArray[i] = mBlocks[rowNum][i].mNumber;
return rowArray;
}
public function getColumn(columnNum:int):Array
{
var columnArray:Array = new Array();
for (var i:int = 0; i < mNumRows; i++)
columnArray[i] = mBlocks[i][columnNum].mNumber;
return columnArray;
}
看起来您正在检查当前行和列中不存在的数字。不知道更多细节很难说,但你能想出一个不可能做到这一点的场景吗
例如,如果有四列五行,tempNum
将始终在一到四之间。现在,如果行的数量是5,并且对应的列已经有了最多4个的所有数字,那么if语句的计算结果将永远不会为true,因此您将进入一个无限循环
0 1 2 3
1
2
3
4
如果网格是正方形,那么这样如何:
0 1 2 3
4
0
0
我知道你在说什么,你是对的,但在这个特殊情况下,它不会改变任何事情。网格是正方形,所以numRows和numColumns的值总是相等的。我想不出有哪种情况不可能分配一个不在当前行或列中的数字。正如我所说,它总是一个正方形,所以第一个实例不可能发生。网格上的每个数字都初始化为0。该函数迭代网格上的每个位置,并随机选择一个数字。如果该数字已经在同一行或列中,它将随机选择另一个数字。当它找到一个不在行或列中的数字时,它将其放置,然后对下一个位置重复该过程,直到网格被完全填充。@VGambit如果您从一个新的网格开始,我不认为这会导致无限循环-尝试在每次调用
setNumber
后打印网格。顺便说一句,你应该在随机数*范围内调用Math.floor()
;否则,您将最终存储浮点数。@VGambit-我没有注意到这一点。你试过印刷吗?那是个好主意。我以1234结束,然后是321,然后是0。它不得不放下一个4,但这是不可能的。我将通过添加一个“重置”函数来解决这个问题,如果所有的数字都尝试了,并且都失败了,这个函数将重新开始随机化过程。我刚刚尝试的一个修复是更新FlashDevelop、FlexSDK和Flash调试器。突然,我可以使用断点了。
while (cantMoveOn)
{
//call Math.floor
tempNum = Math.floor(Math.random() * mNumColumns) + 1;
if (!checkRow(i, tempNum) && !checkColumn(j, tempNum))
cantMoveOn = false;
}
0 1 2 3
1
2
3
4
0 1 2 3
4
0
0