我正在做一个练习,在这个练习中,我必须编写一个"瓷砖"游戏。此函数应该在多维数组中查找空白图块。然后,用户通过传入称为"tile"的整数来选择磁贴。如果用户输入的"磁贴"与空白磁贴相邻,则需要交换
然而,现在,这并没有发生。有人告诉我,"问题是你正在用可变图块交换板上单个项目的价值。可变磁贴可能与看板中的项目具有相同的值,但它不是看板中的项目。你需要交换板上的两个项目。
另外,显然:"但是我if
语句的第二部分只检查该磁贴是否不在棋盘右下角后面。你不是更想知道blankCol - 1
是否小于零吗?
"d"是用户先前在程序开始时选择的电路板的大小。如果他们选择 3,d = 3,因此多维数组将等于 3x3 (d * d)。然而,我无法弄清楚这意味着什么:
bool move(int tile)
{
int temp;
int didSwap;
int blankRow;
int blankCol;
// search for blank tile
for (int row = 0; row < d; row++) {
for (int col = 0; col < d; col++) {
if (board[row][col] == 0) {
blankRow = row;
blankCol = col;
}
}
}
// check that tile is not too big or too small
if (tile > d * d - 1 || tile < 1) {
return false;
}
// search for blank tile
for (int row = 0; row < d; row++) {
didSwap = 0;
for (int col = 0; col < d; col++) {
if (tile == board[blankRow + 1][blankCol] &&
tile != board[d + 1][d]) {
temp = board[blankRow][blankCol];
board[blankRow][blankCol] = tile;
tile = temp;
didSwap = 1;
return true;
}
else if (tile == board[blankRow - 1][blankCol] &&
tile != board[d - 1][d]) {
temp = board[blankRow][blankCol];
board[blankRow][blankCol] = tile;
tile = temp;
didSwap = 1;
return true;
}
else if (tile == board[blankRow][blankCol + 1] &&
tile != board[d][d + 1]) {
temp = board[blankRow][blankCol];
board[blankRow][blankCol] = tile;
tile = temp;
didSwap = 1;
return true;
}
else if (tile == board[blankRow][blankCol - 1] &&
tile != board[d][d + 1]) {
temp = board[blankRow][blankCol];
board[blankRow][blankCol] = tile;
tile = temp;
didSwap = 1;
return true;
}
else {
return false;
}
}
}
return false;
}
你能就我应该从这里去哪里提出一些建议吗?
谢谢
本质上,问题在于您只设置了一个板图的值:在您的函数中只执行一个board[(row)][(col)] = (value)
语句。
例如:
if (tile == board[blankRow + 1][blankCol] &&
tile != board[d + 1][d]) {
temp = board[blankRow][blankCol];
board[blankRow][blankCol] = tile;
tile = temp;
didSwap = 1;
return true;
}
注意到只有一个 board[...][...] =
- 类型语句?因此,它只在板上设置一个图块值。
tile = temp;
语句(您似乎认为它应该更改第一个磁贴并因此完成交换操作)只是分配给局部变量。它不会更改 board
数组中记录的值。
但是,我相信您的代码中还有其他问题。您有两个注释说"搜索空白磁贴",但显然第一个注释是正确的,第二个注释是复制粘贴的,但现在不准确:代码改为搜索要移动的磁贴。但是,在整个板上搜索必须位于特定磁贴旁边的磁贴(充其量)效率低下。为什么不只搜索空白磁贴周围的方块?您还需要确保不会超出数组范围,请考虑:
else if (tile == board[blankRow - 1][blankCol] &&
tile != board[d - 1][d]) {
。如果blankRow
为 0 怎么办?- 然后您正在访问board[-1][blankCol]
这将调用未定义的行为,并可能导致您的程序失败或表现出奇怪的行为。
问题太多:
- 假设
d=5
,检查磁贴超出范围,用户输入25
,就会显示超出范围。
将代码更改为 :
if Tile>d*d
还可以尝试以下步骤:
- 查找空白磁贴
- 查看用户是否输入了相邻的磁贴。这不需要循环,只有
4
如果 stmta 表示向上、向下、向左右。 - 如果确实相邻,则交换值。