下面是十五的游戏中的一个功能,它应该搜索“0”图块,一旦找到,允许相邻图块移动到其位置。它适用于前几个移动,但是当零瓦片位于顶行时(它从右下角开始),它不允许移动。请注意下面的“0”磁贴绘制为下划线。例如:
8 7 6
5 4 3
2 1 _
Tile to move: 3
8 7 6
5 4 _
2 1 3
Tile to move: 6
8 7 _
5 4 6
2 1 3
Tile to move: 7
Illegal move.
以下是代码:
bool move(int tile)
{
int blankrow;
int blankcol;
for (int i = 0; i < d; i++)
{
for (int j = 0; j < d; j++)
{
if (board[i][j] == 0)
{
blankrow = i;
blankcol = j;
}
}
}
for (int i = 0; i < d; i++)
{
for (int j = 0; j < d; j++)
{
if ((board[i][j] == tile) && ((board[i+1][j] == 0 || board[i-1][j] == 0) &&
(board[i][j+1] == 0 || board[i][j-1] == 0)))
{
int swapped = board[i][j];
board[blankrow][blankcol] = swapped;
board[i][j] = 0;
return true;
}
}
}
return false;
}
答案 0 :(得分:4)
只是通过观察,我很确定你需要改变:
((board[i+1][j] == 0 || board[i-1][j] == 0) &&
(board[i][j+1] == 0 || board[i][j-1] == 0))
要:
(board[i+1][j] == 0 || board[i-1][j] == 0 ||
board[i][j+1] == 0 || board[i][j-1] == 0)
编辑:我同意以下用户评论。更好的代码看起来像:
bool move(int tile)
{
int blankrow, blankcol, tilerow, tilecol;
for (int i = 0; i < d; i++) {
for (int j = 0; j < d; j++) {
if (board[i][j] == 0) {
blankrow = i;
blankcol = j;
}
else if (board[i][j] == tile) {
tilerow = i;
tilecol = j;
}
}
}
if( (blankrow == tilerow && abs(blankcol - tilecol) == 1) ||
(blankcol == tilecol && abs(blankrow - tilerow) == 1) ) {
board[blankrow][blankcol] = board[tilerow][tilecol];
board[tilerow][tilecol] = 0;
return true;
}
return false;
}
答案 1 :(得分:0)
您找到了blankrow
和blankcol
。找同样的事情找tilerow
和tilecol
。然后验证
((blankrow == tilerow) && (abs(blankcol - tilecol) == 1))
或
((blankcol == tilecol) && (abs(blankrow - tilerow) == 1))
如果满足其中任何一个条件,则交换。现有代码的问题是您可以使数组访问超出范围。例如,如果i
为0
,则board[i-1][j]
是一个越界访问。
答案 2 :(得分:0)
我认为您应该从
更改第二个循环中的if
语句
if ((board[i][j] == tile) &&
((board[i+1][j] == 0 || board[i-1][j] == 0) &&
(board[i][j+1] == 0 || board[i][j-1] == 0)))
到
if ((board[i][j] == tile) &&
((i+1==blankrow && j==blankcol) ||
(i-1==blankrow && j==blankcol) ||
(i==blankrow && j+1==blankcol) ||
(i==blankrow && j-1==blankcol)))
在原始版本中,您需要行偏移为1,列偏移为零,行偏移为零,列偏移为同时。此外,您可能会对数组中的负索引或读取结束。