2015-06-21 2 views
-1

У меня есть матрица размером 7x7, которая представляет игровое поле. Когда игрок совершает движение, программа должна проверять позиции вокруг координат, где находится кусок, чтобы обнаружить другую часть в сторону.C - контрольная матрица [x] [y] позиции около

Я использую эту функцию:

int check_position(COORDINATES coordinates, char board[7][7]) { 
    int result = -1; 

    if (board[coordinates.x][coordinates.y] != 'O' && board[coordinates.x-1][coordinates.y] != 'O' && board[coordinates.x][coordinates.y-1] != 'O' && board[coordinates.x+1][coordinates.y] != 'O' && board[coordinates.x][coordinates.y+1] != 'O' && board[coordinates.x-1][coordinates.y-1] != 'O' && board[coordinates.x+1][coordinates.y+1] != 'O' && board[coordinates.x-1][coordinates.y+1] != 'O' && board[coordinates.x+1][coordinates.y-1] != 'O') { 
    result = 1; 
    } 

    return result; 
} 

Первый параметр координата кусок игрока в качестве структуры, с членами х и у. Второй параметр - это массив платы.

Заявление if не работает, и я не знаю, какую альтернативу я могу взять.

Вы можете мне помочь? Благодаря!

+4

Вы, вероятно, нужно больше 'if' заявления (или, вернее,' еще if') и в них убедитесь, что вы не индексировать вне диапазона. Например, подумайте о том, что произойдет, если, например, 'coord.x' -' 0' или '6'. Вы * можете * к нему как к одному выражению, но его будет очень трудно читать и поддерживать. –

+0

Это для C или C++. Они разные языки, выбирайте один. На C++ могут быть разные ответы. – Olaf

ответ

1

Вы забыли о том, что ваши координаты переполнены на границах. Вы можете либо проверить это, либо:

Подсказка: сделайте массив двумя строками и столбцами больше, чем доска, и заполните границу «пустым» маркером. Активная доска будет иметь координаты 1...7 Таким образом, ваши координаты не могут обернуться (1 - 1 и 7 + 1 все еще находятся в массиве), и вам не нужно заботиться о границах.

Примечание: Если вы просто хотите вернуть логическое значение, было бы лучше использовать stdbool.h и вернуть bool результат. Таким образом, абонент может непосредственно использовать эту функцию в качестве условия:

#include <stdbool.h> 

... 

bool check_position(COORDINATES coordinates, const char board[9][9]) { 
    int x = coordinates.x - 1 
    for (int xc = 0 ; xc < 3 ; xc++) { 
     int y = coodinates.y - 1; 
     for (int yc = 0 ; yc < 3 ; yc++) { 
      if (board[x][y] != '0') 
       return true; 
      y++; 
     } 
     x++; 
    } 
    return false; 
} 

Примечание: как вам нужно только одно одно непустое поле, вы можете прекратить немедленно, если вы нашли один. Это идентично множественным условиям. Конечно, это также работает для вашего оригинального результата int.

Примечание2: Я изменил тип board на const, так как он не изменяется внутри функции.

-1

Вы также можете решить переполнение края, как это. Edit улучшилось после обсуждения с @Olaf

#define BOARD 7 

int check_position(COORDINATES coordinates, char board[BOARD][BOARD]) { 
    int result = -1; 
    int left = coordinates.x == 0 ? 0 : coordinates.x - 1; 
    int top = coordinates.y == 0 ? 0 : coordinates.y - 1; 
    int right = coordinates.x == BOARD-1 ? coordinates.x : coordinates.x + 1; 
    int bottom = coordinates.y == BOARD-1 ? coordinates.y : coordinates.y + 1; 

    if (board[left]   [top] != 'O' && 
     board[coordinates.x][top] != 'O' && 
     board[right]  [top] != 'O' && 
     board[left]   [coordinates.y] != 'O' && 
     board[coordinates.x][coordinates.y] != 'O' && 
     board[right]  [coordinates.y] != 'O' && 
     board[left]   [bottom] != 'O' && 
     board[coordinates.x][bottom] != 'O' && 
     board[right]  [bottom] != 'O' &&) 
    { 
     result = 1; 
    } 

    return result; 
} 
+1

Это не будет работать с неподписанными координатами. Мы не знаем их скалярных типов. – Olaf

+0

@Olaf он действительно работает. Когда 'unsigned x = 0' и' int left = x - 1', значение 'left' равно' -1'. –

+1

Просто возьмите первое условие: (предположим 'x == 0') =>' (int) left = UINT_MAX' является UB, так как 'int' не может удерживать это значение (тот же ранг). – Olaf

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