Actionscript 3 为什么我的Actionscript 3程序会随机陷入无限循环?

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

mBlocks是块对象的二维数组。每次我的应用程序运行时,它都会运行InitGridNumbers函数。有时,它会陷入无限循环。其他时候,它构建和运行时不会出现问题

  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