2015-05-03 4 views
0

Я создаю настольную игру с двумя разными цветными частями, черными и красными.Настольная игра Capturing Pieces

Если игрок окружает фигуры противников своим, горизонтальным или вертикальным, части удаляются. Вот несколько фотографий, чтобы продемонстрировать это:

Моя доска - это простой 2-мерный целочисленный массив со значениями 0, 1 или 2 в зависимости от того, пустое ли пространство, красная часть или черная часть.

Это код, который я придумал до сих пор, однако я получаю проблемы с ошибками вне границ, а также не учитывает захват более одной части.

static final int EMPTY = 0, BLACK = 1, RED = 2, ROW = 9, COLUMN = 9; 
board = new int[ROW][COLUMN]; 

public void captureRedPieces() { 
    for(int i = 0; i < ROW; i++) { 
     for(int j = 0; j < COLUMN; j++) { 
      if(i <= ROW - 2) { 
       if(board[i][j] == 1 && board[i + 1][j] == 2 && board[i + 2][j] == 1) { 
        board[i + 1][j] = EMPTY; 
       } 
      } 
      if(i <= COLUMN - 2) { 
       if(board[i][j] == 1 && board[i][j + 1] == 2 && board[i][j + 2] == 1) { 
        board[i][j + 1] = EMPTY; 
       } 
      } 
     } 
    } 
} 

Может ли кто-нибудь помочь мне придумать лучшее решение для захвата предметов?

ответ

0

Возможно, вам необходимо заменить i <= COLUMN - 2 на номер j <= COLUMN - 2. Кажется, что захват происходит после нового хода. Если вы знаете точное положение нового произведения, то не нужно перебирать всю доску. Вам просто нужно проверить соседние части в том же ряду и в том же столбце, где была размещена новая часть.

1

Вы проверяете, есть ли i <= ROW - 2, но тогда вы используете i+2 в качестве индекса для вашей проверки. Это означает, что если i является 7, которая равна ROW - 2 и проходит ваш if тест, то i+2 будет 9, который находится вне границ, так как массив только идет от 0 до 8.

Таким образом, вы должны исправить это i < ROW - 2 а не <=.

Кроме того, у вас есть этот код:

 if(i <= COLUMN - 2) { 
      if(board[i][j] == 1 && board[i][j + 1] == 2 && board[i][j + 2] == 1) { 
       board[i][j + 1] = EMPTY; 
      } 
     } 

Это должно быть условие на j, а не на i - и он должен быть закреплен таким же образом, я рассказал вам о i - < вместо <= ,

Примечание: поскольку в ваших правилах указано, что «окружающее» состояние является захватом только после того, как окружающий цвет делает ход, возможно, вам следует изменить свой подход: вам нужно только проверить положение, в котором черные совершили движение, матч с позициями вокруг него. Конечно, вам все равно придется убедиться, что вы не выходите за пределы. Ваш текущий подход может обозначать места, которые «окружены» с предыдущих шагов, и это было бы неправильно в соответствии с правилами.

Таким образом, ваш метод должен быть объявлен следующим образом:

public void captureRedPieces(int blackMoveRow, int blackMoveCol)