0

したがって、このコードは、私がコピーしたオンラインのボグルゲームの基本的なアウトラインです。出典:http ://www.codingfriends.com/index.php/2010/06/10/boggle/

bool findUsersWord(string findThis, Grid<char> &theBoard, Vector<cell> &theRoute, string alreadyFound, int placeY, int placeX)
{  
  // need to find the findThis  base case
  if (findThis == alreadyFound)
    return true;
  // need to find the first letter within the board and then progress around that.
  if (alreadyFound.empty())
  {
    for (int rows = 0; rows < theBoard.numRows(); rows++)
      for (int cols = 0; cols < theBoard.numCols(); cols++)
        // find the each character within the 
        if (theBoard[rows][cols] == findThis[0])
        {
          alreadyFound = findThis[0];
          cell newR;
          newR.row = rows;
          newR.col = cols;
          theRoute.add(newR);
          if (findUsersWord(findThis, theBoard, theRoute, alreadyFound, rows, cols))
            return true;
          else
            // clear out the found Board 
            theRoute.clear();
        }
  }
  else
  {
    // try and find the next letters within the area around the base letter
    // spin around the letter 3 * 3 grid
    for (int y= (placeY > 0 ? placeY-1: placeY); y <=(placeY == (theBoard.numRows()-1) ? placeY : placeY+1);y++)
      for (int x=(placeX > 0 ? placeX-1: placeX); x<=(placeX == (theBoard.numCols()-1) ? placeX : placeX+1); x++)
        if ((theBoard[y][x] == findThis[alreadyFound.length()]) && (!(y==placeY && x ==placeX)))
          // already used letter
          if (!placeAlreadyUsed(y,x,theRoute))
          {
            alreadyFound += findThis[alreadyFound.length()];
            cell newR;
            newR.row = y;
            newR.col = x;
            theRoute.add(newR);
            if (findUsersWord(findThis, theBoard,theRoute, alreadyFound, y, x))
              return true;
            else
            {
              if (alreadyFound.length() > 1)
                alreadyFound = alreadyFound.substr(0, alreadyFound.length()-1);
              theRoute.removeAt(theRoute.size()-1);
            }
          }
    return false;
  }
  return false;
}

以下のコードは、上記のコードの一部である問題のコードです。

for (int y= (placeY > 0 ? placeY-1: placeY); y <=(placeY == (theBoard.numRows()-1) ? placeY : placeY+1);y++)
  for (int x=(placeX > 0 ? placeX-1: placeX); x<=(placeX == (theBoard.numCols()-1) ? placeX : placeX+1)

誰かがこのコードを、?の使用を伴わないより単純なコードに変えることができるかどうか疑問に思っています。そしてそれ。「?」などの簡単な部分は知っています。はリターンを意味し、「:」は次の行を意味しますが、forループで使用されているという事実と、次のように見えるという事実に迷っています。

if(placeY > 0)
 return playceY-1
placeY;

どこが間違っているのですか?

4

2 に答える 2

2

ブロックは? :奇妙に見えるifステートメントです。もしそうなら、それはインラインです。

これがフォーマットです

argument ? result evaluated to if true : result evaluated to if false

これが例です

1<2 ? "Hurray" : "boo"

"Hurray"1 <2が真であるため、に評価されます。ただし、これに切り替えると、1>2に評価され"boo"ます。

于 2012-11-08T23:00:36.823 に答える
2

「?」などの簡単な部分は知っています。戻るを意味し、「:」は次の行を意味します

いいえ。それはまったく意味がありません。?:は、3つのオペランド式を持つ1つの演算子であり、そのうちの1つはと?の間に表示され:ます。

placeY > 0 ? placeY-1 : placeY

placeY > 0は、「もしそうなら評価しplaceY-1、そうでなければ評価する」という意味の表現ですplaceY

このコードの考え方は、何らかの理由で、(placeX、placeY)の隣にあるボードのすべての位置を反復処理することです。これらの位置は長方形を形成し、?:演算子はその長方形の左、右、上、下の限界を計算するために使用されます。たとえば、上で引用した式は、最上位の座標を表します。がすでに0の場合、その上のボードに行がないことplaceY-1を除いて、通常はです。その場合、それ自体が一番上の行になります。placeYplaceY

于 2012-11-08T23:01:45.513 に答える