程序无法正确识别二维数组值

时间:2017-08-28 18:22:59

标签: c arrays

大家好!

我正在编写一个程序来播放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;
}

代码的目的是什么?

  1. 它作为输入收到-via int tile = get_int(); - 用户想要移动的图块。
  2. 它在2D数组中找到输入值为int的{​​{1}}。
  3. 然后,它会检查是否有一个空白区域(游戏中唯一可以存在的空白区域)。
  4. 如果有空格,则会切换切片位置。 Etvoilà
  5. 出了什么问题?

    似乎无效的是识别该空白区域。

    请参见下面的初始化和绘制板。

    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再次感谢!

1 个答案:

答案 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中提问。

编码不是猜谜游戏,你不应该尝试数百种代码组合。如果您的代码没有按照您的想法执行,则有两件事要做

  1. 在脑海中执行它,您会注意到board[-1]立即出现问题。
  2. 使用调试器,您也会立即看到board[-1]