Сначала просто кратко опишу мою программу, это шахматная доска. 8 на 8, начиная с нижнего ряда до верхнего ряда и от левого столбца до правого столбца, от A до H.

ОБРАЗЕЦ ВХОДА: ИСПЫТАНИЕ 1

============
Test.
Qh8 is attacking the target on Xb2
. . . . . . . Q 
. . . . . . . . 
. . . . . . . . 
N . . . . . . . 
. . B . K . . R 
. . . . . . . . 
. X . . . . . . 
. . . . . . . .

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

ОБРАЗЕЦ ВХОДА: ИСПЫТАНИЕ 2

============
Test.
. . . . . . . Q 
. . . . . . . . 
. . . . . . . . 
. . . . . . . . 
N . B . K . . R 
. . . . . . . . 
. . . . . . . . 
X . . . . . . . 

Это то, что я имел в виду, как я сказал выше, Queen не могут достичь значения X

ЭТО ТОЛЬКО ОБЪЯСНИТЬ, ЧТО Я ЗНАЧУ

ДЕЛО 1:

============
Test.
Qa8 is attacking the target on Xh1
Q . . . . . . . 
. . . . . . . . 
. . . . . . . . 
. . . . . . . . 
. . B . K . . R 
. . . . . . . . 
. . . . . . . . 
N . . . . . . X 

Работает! Королева способна атаковать Х

ВНИМАНИЕ: только в этом случае он работает в моем алгоритме, не знаю почему, а другие нет.

СЛУЧАЙ 2 .

============
Test.
. . . . . . . X 
. . . . . . . . 
. . . . . . . . 
. . . . . . . . 
N . B . K . . R 
. . . . . . . . 
. . . . . . . . 
Q . . . . . . . 

Не работает, королева не может атаковать X

ДЕЛО 3:

Test.
X . . . . . . . 
. . . . . . . . 
. . . . . . . . 
. . . . . . . . 
. . B . K . . R 
. . . . . . . . 
. . . . . . . . 
N . . . . . . Q 

Это тоже не работает, Королева не может атаковать X?

КОД ИСТОЧНИКА

 public void ableToAttack(){



        for(int row = 0; row < grid.length; row++){
          for(int column = 0; column < grid[row].length; column++){

             grid[row][column] = ".";
             grid[7-queen.charAt(2)+49][(int)queen.charAt(1)-97] = "Q";
             grid[7-rook.charAt(2)+49][(int)rook.charAt(1)-97] = "R";
             grid[7-bishop.charAt(2)+49][(int)bishop.charAt(1)-97] = "B"; 
             grid[7-king.charAt(2)+49][(int)king.charAt(1)-97] = "K";
             grid[7-knight.charAt(2)+49][(int)knight.charAt(1)-97] = "N";
             grid[7-target.charAt(2)+49][(int)target.charAt(1)-97] = "X";

             }
        }

            //HELLO FRIENDS THIS IS WHERE IM STUCK ON THIS METHOD
            int moveRow = 0;
            int moveColumn = 0;
        for( int takeSteps = 0; takeSteps < 8; takeSteps++){
            moveRow++;
             moveColumn++;
           //South east Diaognal Algorithm
          if (inBoard(convRow(target),convCol(target))) {
                if ((convRow(target) == convRow(queen)+moveRow) && (convCol(target) == convCol(queen)+moveColumn))  {
                    System.out.println(queen + " is attacking the target on "+target);
                }

            }
          //North West diagonal Algorithm
          if (inBoard(convRow(target),convCol(target))) {
                if ((convRow(target) == convRow(queen)-moveRow) && (convCol(target) == convCol(queen)-moveColumn))  {
                    System.out.println(queen + " is attacking the target on "+target);
                }

            }

         // North East diaognal Algorithm
           if (inBoard(convRow(target),convCol(target))) {
                if ((convRow(target) == convRow(queen)-moveRow) && (convCol(target) == convCol(queen)+moveColumn))  {
                    System.out.println(queen + " is attacking the target on "+target);
                }

            }
          // South West diagonal Algorithm
           if (inBoard(convRow(target),convCol(target))) {
                if ((convRow(target) == convRow(queen)+moveRow) && (convCol(target) == convCol(queen)-moveColumn))  {
                    System.out.println(queen + " is attacking the target on "+target);
                }

            }

        }

        for(int row = 0; row <grid.length; row++){
          for(int column = 0; column <grid[row].length; column++){
        System.out.printf("%2s",grid[row][column] + " ");
          }
          System.out.println();
        }



        }

        private boolean inBoard(int row, int col) {
            return (row <= 8)
                    && (row >= 1)
                    && (col <= 8)
                    && (col >= 1);
        }

        private int convRow(String rowz) {
            return 7-rowz.charAt(2)+49;
        }

        private int convCol(String columnz) {
            return columnz.charAt(1)-97;
        }
0
Ibrahim Ayyoub 4 Май 2017 в 18:14

3 ответа

Лучший ответ

https://stackoverflow.com/questions/43740616/how-can-i-check-if-queen-is-able-to-attack-the-x-position-but-not-moving-it-t/43740955#43740955

Сколько аккаунтов у вас есть и сколько раз вы собираетесь задавать одни и те же вопросы?

    private boolean inBoard(int row, int col) {
        return (row <= 8)
                && (row >= 1)
                && (col <= 8)
                && (col >= 1);
    }

Я почти уверен, что эта функция неверна, в массивах Java значение начинается с 0, а длина таблицы равна 8, поэтому она включает от 0 до 7.

Должно быть :

private boolean inBoard(int row, int col) {
            return (row <= 7)
                    && (row >= 0)
                    && (col <= 7)
                    && (col >= 0);
        }
2
Community 23 Май 2017 в 12:26

У меня нет времени, чтобы понять ваш алгоритм, но я бы сделал это так:

if(Dame_row == Q_row){
   //now go through the distance in a loop, if nothing is in the way, return true
}else if(Dame_col == Q_col){
  //now go through the distance in a loop, if nothing is in the way, return true    
}else if(Math.abs(Dame_row - Q_row) == Math.abs(Dame_col - Q_col)){
  //now go through the distance in a loop, if nothing is in the way, return true  
}
return false;
0
qry 4 Май 2017 в 15:26

Ваш алгоритм inBoard выключен одним. Ваш массив досок 0-7, а не 1-8

1
Breandán Dalton 4 Май 2017 в 15:34