0

mBlocksは、Blockオブジェクトの2次元配列です。アプリケーションを実行するたびに、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

そもそも、、、checkColumn方法が間違っていますgetColumngetRow行を取得するには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;
}

現在の行と列に存在しない数値をチェックしているようです。詳細が分からないとなんとも言えませんが、それが不可能なシナリオを考えてみてください。

たとえば、4 つの列と 5 つの行がある場合、tempNumは常に 1 ~ 4 になります。行数が 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 に答える