0

所以这段代码是我从网上复制过来的一个boggle游戏的基本大纲。来源: 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

The ? : block is just a strange looking if statement. It's an inline if, if you will.

Here's the format

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

Here's an example

1<2 ? "Hurray" : "boo"

Will evaluate to "Hurray" because 1<2 is true. However, if we switch it to 1>2 it will evaluate to "boo".

于 2012-11-08T23:00:36.823 回答
2

我确实知道它的简单部分,例如“?” 表示返回,“:”表示下一行

不。这根本不是它的意思。?:是一个具有三个操作数表达式的运算符,其中一个出现在?和之间:

placeY > 0 ? placeY-1 : placeY

是一个表达式,意思是:“如果placeY > 0然后评估placeY-1;否则评估placeY”。

代码的想法是,出于某种原因,我们希望遍历 (placeX,placeY) 旁边的所有棋盘位置。这些位置形成一个矩形,?:运算符用于计算该矩形的左、右、上和下限。例如,上面引用的表达式用于顶部坐标。通常是placeY-1,除非如果placeY已经是 0,则它上面的板上没有行,在这种情况下,placeY它本身就是顶行。

于 2012-11-08T23:01:45.513 回答