0

mBlocks 是 Block 对象的二维数组。每次我的应用程序运行时,它都会运行 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);     
     }
    }
   }
  } 

  public function CheckRow(rowNum:int, checkNum:int):Boolean
  {
   var tempRow:Array = GetRow(rowNum);
   for (var i:int = 0; i < mNumColumns; i++)
   {
    if (checkNum == tempRow[i])
     return true;
   }
   return false;
  }

  public function CheckColumn(columnNum:int, checkNum:int):Boolean
  {
   var tempColumn:Array = GetColumn(columnNum);
   for (var i:int = 0; i < mNumColumns; i++)
   {
    if (checkNum == tempColumn[i])
     return true;
   }
   return false;
  }

  public function GetRow(rowNum:int):Array
  {
   var rowArray:Array = new Array(mNumRows);
   for (var i:int = 0; i < mNumRows; i++)
    rowArray[i] = mBlocks[rowNum][i].mNumber;

   return rowArray;
  }

  public function GetColumn(columnNum:int):Array
  {
   var columnArray:Array = new Array(mNumColumns);
   for (var i:int = 0; i < mNumColumns; i++)
    columnArray[i] = mBlocks[i][columnNum].mNumber;
   return columnArray;
  }
4

1 回答 1

2

首先checkColumngetColumngetRow方法是错误的。要获得一行,您应该复制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;
}

while (cantMoveOn)
{
  //call Math.floor
  tempNum = Math.floor(Math.random() * mNumColumns) + 1;
  if (!checkRow(i, tempNum) && !checkColumn(j, tempNum))
    cantMoveOn = false;
}

看起来您正在检查当前行和列中不存在的数字。不知道更多细节很难说,但你能想到一个不可能的场景吗?

例如,如果有四列五行,则tempNum总是在一到四之间。现在,如果行数为 5 并且对应的列已经包含最多为 4 的所有数字,则 if 语句永远不会计算为 true,因此您最终会陷入无限循环

0 1 2 3
1
2
3
4

如果网格是正方形,这个怎么样:

0 1 2 3
4
0
0
于 2010-06-25T05:10:04.510 回答