2015-01-19 2 views
-1

У меня есть метод public static char myMethod (char [] [] board) в этом методе, я пытаюсь заставить его вставить плату массива символов 8x8, а пробелы - метки «-» , Мой подход к этому заключается в том, чтобы пройти через доску и найти кусок, как «p» для черной пешки, и проверить места, в которые он может двигаться. Если там есть белый король «K», тогда метод возвращает «p», чтобы сказать мне, что белый король находится под контролем черной пешки. для метода рыцаря ниже я пробовал все 8 комбинаций того, как он движется, но он не работает. ИШахматные движения в массиве 2d

for (int i = 0; i < 8; i++) { 
     for (int j = 0; j < board[0].length; j++) { 
      if (board[i][j] == 'N') { // where can i fix the boundaries? 

       // a = i; 
       // b = j; 

       whiteKnight = board[i + 1][j + 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 

я даже пробовал этот способ для границ, но никакой разницы

int a = 0; 
    int b = 0; 
    char whiteKnight = ' '; 

    for (int i = 0; i < 8; i++) { 
     for (int j = 0; j < board[0].length; j++) { 
      if (board[i][j] == 'N') { // where can i fix the boundaries? 

       a = i; 
       b = j; 
      if ((a + 1) < 7 && (b + 2) < 7) { 
       whiteKnight = board[a + 1][b + 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a + 1) < 7 && (b - 2) < 7) { 
       whiteKnight = board[a + 1][b - 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a - 1) < 7 && (b + 2) < 7) { 
       whiteKnight = board[a - 1][b + 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a - 1) < 7 && (b - 2) < 7) { 
       whiteKnight = board[a - 1][b - 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a + 2) < 7 && (b + 1) < 7) { 
       whiteKnight = board[a + 2][b + 1]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a + 2) < 7 && (b - 1) < 7) { 
       whiteKnight = board[a + 2][b - 1]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a - 2) < 7 && (b + 1) < 7) { 
       whiteKnight = board[a - 2][b + 1]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a - 2) < 7 && (b - 1) < 7) { 
       whiteKnight = board[a - 2][b - 1]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
+2

Я в замешательстве относительно того, что ваш вопрос –

+0

@austinwernli Мне просто интересно, если кто-то видит что-то не так с этим, что я не думаю, что это имеет для меня смысл. – user3511198

ответ

0

Ну конечно я вижу что-то не так с вашим кодом ... Для того, чтобы начать с я замечаю (a-1) < 7 когда я гарантирую вам, означало (a-1) >= 0 Опасайтесь копирования/вставки лол

int a = 0; 
int b = 0; 
char whiteKnight = ' '; 

for (int i = 0; i < 8; i++) { 
    for (int j = 0; j < board[0].length; j++) { 
     if (board[i][j] == 'N') { // where can i fix the boundaries? 

      a = i; 
      b = j; 
      if ((a + 1) < 7 && (b + 2) < 7) { 
       whiteKnight = board[a + 1][b + 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a + 1) < 7 && (b - 2) >= 0) { 
       whiteKnight = board[a + 1][b - 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a - 1) >= 0 && (b + 2) < 7) { 
       whiteKnight = board[a - 1][b + 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a - 1) >= 0 && (b - 2) >= 0) { 
       whiteKnight = board[a - 1][b - 2]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a + 2) < 7 && (b + 1) < 7) { 
       whiteKnight = board[a + 2][b + 1]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a + 2) < 7 && (b - 1) >= 0) { 
       whiteKnight = board[a + 2][b - 1]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a - 2) >= 0 && (b + 1) < 7) { 
       whiteKnight = board[a - 2][b + 1]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
      if ((a - 2) >= 0 && (b - 1) >= 0) { 
       whiteKnight = board[a - 2][b - 1]; 
       if (whiteKnight == 'k') { 
        return 'N'; 
       } 
      } 
+0

Это правда! Я думаю, что что-то не так с его чтением в значениях, потому что я не понимаю, почему это не работает. при отсутствии тестовых случаев – user3511198

0

Чтобы уменьшить многие, если заявления, вы можете использовать этот шаблон (который также возможно для других шахматах мужчины):

void move(){ 
    for(int r = 0; r < 8; ++r){ 
    for(int c = 0; c < 8; ++c){ 
     if(b[r][c] == 'N'){ 
     for(int y = Math.max(0, r-2); y <= Math.min(7,r+2);++y){ 
      for(int x = Math.max(0, c-2); x <= Math.min(7,c+2);++x){ 
      if(Math.abs(x-r)+Math.abs(x-c)==3){ 
       if(b[y][x] == 'k'){ 
       b[y][x] = 'N'; 
       b[r][c] = ' '; 
       return; 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Другой подход будет хранить

{-2,-1}, {-1,-2}, {1,-2}, {2,-1}, {2,1}, {1,2}, {-1,2}, {-2,1} 

в прыжке массива [8] [2] и итерацию над этими "прыгать расстояния", проверяя границы платы. Это также позволило бы избежать многих ifs ...

+0

Lol их закрывающие скобки, хотя! –

+0

@austinwernli На самом деле никто не перебирает доску, чтобы найти шахматов белых или черных; это должна быть единственная итерация над остальными мужчинами W или B. И второй вариант уменьшит внутренние петли до одного цикла. - В любом случае: значительно меньше копий-папок, которые вы правильно указали. – laune

+0

@laune это метод вне другого метода? или что? – user3511198

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