C ++ Может кто-нибудь объяснить, что говорят эти циклы for?

Таким образом, этот код является базовой схемой для непростой онлайн-игры, которую я скопировал.
ИСТОЧНИК: 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;

Где я ошибся?

0

Решение

? : блок просто странно выглядящий оператор if. Это в соответствии если, если вы будете.

Вот формат

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

Вот пример

1<2 ? "Hurray" : "boo"

Будет оценивать "Hurray" потому что 1<2 верно. Однако, если мы переключим его на 1>2 это будет оценивать "boo",

2

Другие решения

Я знаю простые части этого, такие как «?» означает возврат, а «:» означает следующую строку

Нет Это совсем не то, что значит. ?: один оператор с тремя выражениями операндов, одно из которых появляется между ? и :,

placeY > 0 ? placeY-1 : placeY

это выражение, которое означает: «Если placeY > 0 затем оцените placeY-1; иначе оцените placeY».

Идея кода заключается в том, что мы хотим по какой-то причине перебирать все позиции доски рядом с (placeX, placeY). Эти позиции образуют прямоугольник, и ?: операторы используются для вычисления левого, правого, верхнего и нижнего пределов этого прямоугольника. Например, приведенное выше выражение предназначено для верхней координаты. Это обычно placeY-1кроме того, что если placeY уже 0, на доске нет ни одной строки над ней, и в этом случае placeY Сам верхний ряд.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector