大家好!
我正在编写一个程序来播放Game of Fifteen。
所以,我正在编写在板内移动磁贴的代码。我将在此处复制并逐步解释。
bool move(int tile)
{
for (int i=0; i<d; i++)
{
for (int j=0; j<d; j++)
{
if (tile == board[i][j])
{
if (board[i-1][j] == 0)
{
int temporary = board[i][j];
board[i][j] = board[i-1][j];
board[i-1][j] = temporary;
return true;
}
else if (board[i][j-1] == 0)
{
int temporary = board[i][j];
board[i][j] = board[i][j-1];
board[i][j-1] = temporary;
return true;
}
else if (board[i+1][j] == 0)
{
int temporary = board[i][j];
board[i][j] = board[i+1][j];
board[i+1][j] = temporary;
return true;
}
else if (board[i][j+1] == 0)
{
int temporary = board[i][j];
board[i][j] = board[i][j+1];
board[i][j+1] = temporary;
return true;
}
return false;
}
}
}
return false;
}
int tile = get_int();
- 用户想要移动的图块。int
的{{1}}。
似乎无效的是识别该空白区域。
请参见下面的初始化和绘制板。
tile
如果我输入3,这就是发生的事情,应该总是发生什么: 它找到瓦片“3”,检查它周围是否有空白区域(向上,向下,向左,向右),并用该空白区域切换位置:
8| 7| 6
5| 4| 3
2| 1| _
Tile to move:
不是问题吧?嗯,它看起来效果不好。
见下文,它如何与未被空格包围的数字一起使用: 我输入了 8 ,虽然没有被空格包围,但它已将其转换为新的空白区域。
8| 7| 6
5| 4| _
2| 1| 3
Tile to move:
......我现在用 6 来做哦,惊喜!:
_| 7| 6
5| 4| _
2| 1| 3
Tile to move:
我已经包含了这段代码,在我看来写的很好,应该避免所有这些问题(内部评论):
_| 7| _
5| 4| _
2| 1| 3
Tile to move:
这段代码只是帖子开头的一段。在这里的一个中,可以看到它如何仅检查空白空间(或0)的for (int i=0; i<d; i++) //For every row and every column in the board,...
{
for (int j=0; j<d; j++) //check if the inputted tile is within the boards' values.
{
if (tile == board[i][j]) //If it is, check "up/down/left/right" for a 0 (blnk spc)
{
if (board[i-1][j] == 0) //If there is, switch the values of those tiles.
{
int temporary = board[i][j];
board[i][j] = board[i-1][j];
board[i-1][j] = temporary;
return true;
}
'位置(上方);开头的完整代码不仅包括i-1
',还包括i-1
'(下方),i+1
'(左)和j-1
' (右)职位。
所以,当我输入8时,代码应该转到位置[0] [0]并看到有一个具有该值的图块(它正确地执行)。
但之后,应检查位置“[-1] [0]”,“[0] [ - 1]”,[1] [0 ],或[0] [1](它错误地没有)。
此时我尝试了一百种不同的代码组合,其中没有一种可行,最后决定在Stackoverflow中提问。
非常感谢任何帮助!请继续提出任何澄清要求 - 我已经在这方面工作了很长时间并且理所当然许多事情,但它们可能没有完全清楚地解释(对不起,如果是这样的话) - !
整个代码要长得多,我只是不想吓唬任何人。如果您仍想看到它,请在此处获取:https://pastebin.com/FZPq1F7b再次感谢!
答案 0 :(得分:1)
您需要检查索引是否位于数组中,或者发生意外情况,例如发生的情况。
例如,
if (board[i-1][j] == 0)
将是:
if ((i > 0) && (board[i - 1][j] == 0))
同样
else if (board[i+1][j] == 0)
将是
else if ((i < d - 1) && (board[i + 1][j] == 0))
请,请勿使用d
作为变量名称。使用具有board_size
之类含义的东西,因为它显然是一个常数BOARD_SIZE
会更好。这似乎是一个不重要的细节,但相信我,这非常重要。
哦,关于这个评论
此时我尝试了一百种不同的代码组合,其中没有一种可行,最后决定在Stackoverflow中提问。
编码不是猜谜游戏,你不应该尝试数百种代码组合。如果您的代码没有按照您的想法执行,则有两件事要做
board[-1]
立即出现问题。board[-1]
。