2016-09-08 2 views
-2

Когда я пытаюсь переместить левую плиту (например, рядом с «пустой» плиточкой 0), ничего не происходит. Если плитка является незаконной, программа функционирует так, как должна. Вот функция ход:Функция для замены двух смежных элементов не работает

bool move(int tile) 
{ 
    for (int i = 0; i < d; i++) 
    { 
     for (int j = 0; j < d; j++) 
     { 
      if (board[i][j] == tile) 
      { 
       // stops program from going out of bounds 
       if (j < d) 
       { 
        if (board[i][j + 1] == 0) 
         { 
          swap(board[i][j], board[i][j + 1]); 
          return true; 
         } 
       } 

       if (j > 0) 
       { 
        if (board[i][j - 1] == 0) 
         { 
          swap(board[i][j], board[i][j - 1]); 
          return true; 
         } 
       } 

       if (i > 0) 
       { 
        if (board[i - 1][j] == 0) 
         { 
          swap(board[i][j], board[i - 1][j]); 
          return true; 
         } 
       } 

       if (i < d) 
       { 
        if (board[i + 1][j] == 0) 
         { 
          swap(board[i][j], board[i + 1][j]); 
          return true; 
         } 
       } 
      } 
     } 
    } 

    return false; 
} 

и функция подкачки:

void swap(int i, int j) 
{ 
    int temp = i; 
    i = j; 
    j = temp; 
} 

Что происходит, доска остается ищет то же самое, без изменений.

+1

можно передать '' i' и j' по значению к 'функции swap'. Если вы хотите поменять местами переменные в контексте вызывающего, передайте их с помощью указателя. –

+1

См. Http://stackoverflow.com/questions/1501217/c-function-to-swap-values-in-2d-array –

+1

Помните, когда вы передаете * значение * функции, функция получает * копию оригинал * с его собственным, и * очень другим * адресом. –

ответ

5

Вам необходимо использовать указатели для изменения памяти на плате [i] [j].
Попробуйте что-то вроде этого

void swap(int *i, int *j) 
{ 
    int temp = *i; 
    *i = *j; 
    *j = temp; 
} 

, а затем в вашем вызывающему код

swap(&board[i][j], &board[i][j - 1]); 
+0

Вы должны написать 'int * i, int * j' для удобочитаемости, иначе при объявлении (например,' int * i, j, k; ') некоторые могут предположить, что' j & k' являются 'int *' - которые они не. 'int * i, j, k;' менее подвержен неправильной интерпретации. –

+0

Хорошая точка, я обычно пишу int * i. Я исправлю ответ. – cleblanc

Смежные вопросы