Граница шахматной доски Java?

#java #loops #chess

#java #циклы #шахматы

Вопрос:

Я вроде как застрял, пытаясь создать границу для моей шахматной доски, бегая сверху вниз 8-1 и слева направо a-h. Я не совсем уверен, как это сделать. Советы и помощь очень ценятся! Приветствия 🙂

Вывод в настоящее время:

BR BKn BB BK BQ BB BKn BR
BP BP BP BP BP BP BP BP BP BP

WP WP WP WP WP WP WP WP WP
WR WKn WB WK WQ WB WKn WR

Ниже приведен код Java:

 public class ex5 {
public enum Chessmen {
    WHITE_KING,
    WHITE_QUEEN,
    WHITE_ROOK,
    WHITE_BISHOP,
    WHITE_KNIGHT,
    WHITE_PAWN,
    BLACK_KING,
    BLACK_QUEEN,
    BLACK_ROOK,
    BLACK_BISHOP,
    BLACK_KNIGHT,
    BLACK_PAWN,
    EMPTY
}
public static void printBoard (Chessmen [][] chessboard){
    for (int i=0; i<chessboard.length;i  ){
        for (int j = 0; j<chessboard.length;j  ){
            switch (chessboard [i][j]){
            case WHITE_KING:
                System.out.print("WKt");
                break;
            case WHITE_QUEEN:
                System.out.print("WQt");
                break;
            case WHITE_ROOK:
                System.out.print("WRt");
                break;
            case WHITE_BISHOP:
                System.out.print("WBt");
                break;
            case WHITE_KNIGHT:
                System.out.print("WKnt");
                break;
            case WHITE_PAWN:
                System.out.print("WPt");
                break;
            case BLACK_KING:
                System.out.print("BKt");
                break;
            case BLACK_QUEEN:
                System.out.print("BQt");
                break;
            case BLACK_ROOK:
                System.out.print("BRt");
                break;
            case BLACK_BISHOP:
                System.out.print("BBt");
                break;
            case BLACK_KNIGHT:
                System.out.print("BKnt");
                break;
            case BLACK_PAWN:
                System.out.print("BPt");
                break;
            default:
                System.out.print(" "   "t");
                break;
            }
        }
        System.out.println("");
    }
}



public static void main(String[] args) {
    int Rows = 8;
    int Columns = 8;
    Chessmen [][] chessboard = new Chessmen [Rows][Columns];
    for (int i=0;i<chessboard.length; i  ){
        for (int j=0;j<chessboard[0].length;j  ){
            if (i==1){
                chessboard [i][j]= Chessmen.BLACK_PAWN;
            }else if (i==6){
                chessboard [i][j]= Chessmen.WHITE_PAWN;
            }else if ((i==0amp;amp;j==7)||(i==0amp;amp;j==0)){
                chessboard [i][j]= Chessmen.BLACK_ROOK;
            }else if ((i==0amp;amp;j==1)||(i==0amp;amp;j==6)){
                chessboard [i][j] = Chessmen.BLACK_KNIGHT;
            }else if ((i==0amp;amp;j==2)||(i==0amp;amp;j==5)){
                chessboard [i][j] = Chessmen.BLACK_BISHOP;
            }else if (i==0amp;amp;j==3){
                chessboard [i][j] = Chessmen.BLACK_KING;
            }else if (i==0amp;amp;j==4){
                chessboard [i][j] = Chessmen.BLACK_QUEEN;
            }else if ((i==7amp;amp;j==0)||(i==7amp;amp;j==7)){
                chessboard [i][j]= Chessmen.WHITE_ROOK;
            }else if ((i==7amp;amp;j==1)||(i==7amp;amp;j==6)){
                chessboard [i][j] = Chessmen.WHITE_KNIGHT;
            }else if ((i==7amp;amp;j==2)||(i==7amp;amp;j==5)){
                chessboard [i][j] = Chessmen.WHITE_BISHOP;
            }else if (i==7amp;amp;j==3){
                chessboard [i][j] = Chessmen.WHITE_KING;
            }else if (i==7amp;amp;j==4){
                chessboard [i][j] = Chessmen.WHITE_QUEEN;
        }else {
                chessboard [i][j]= Chessmen.EMPTY;
            }

        }   

    }
        printBoard (chessboard);

}
}
  

Комментарии:

1. вы хотите сказать, что ваш вывод должен включать все пустые квадраты между противоположными сторонами?

Ответ №1:

вызывайте System.out.println(" -------------------------------- ") до и после вашего внешнего цикла рендеринга.

вызовите System.out.print("|") до и после внутреннего цикла рендеринга.

Вам нужно будет немного подправить его.

Комментарии:

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

Ответ №2:

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

Поскольку я уже решаю эту проблему на C , я опубликую свой код ниже. Вы могли бы использовать это как алгоритм для перевода на Java. Он будет отображать доску следующим образом :

   (Coups reversibles : 0)
   -X- --- --- --- --- --- --- -X- 
8 |=R=|=N=|=B=|=Q=|=K=|=B=|=N=|=R=|
   --- --- --- --- --- --- --- --- 
7 |=P=|=P=|=P=|=P=|=P=|=P=|=P=|=P=|
   --- --- --- --- --- --- --- --- 
6 |   | . |   | . |   | . |   | . |
   --- --- --- --- --- --- --- --- 
5 | . |   | . |   | . |   | . |   |
   --- --- --- --- --- --- --- --- 
4 |   | . |   | . |   | . |   | . |
   --- --- --- --- --- --- --- --- 
3 | . |   | . |   | . |   | . |   |
   --- --- --- --- --- --- --- --- 
2 | P | P | P | P | P | P | P | P |
   --- --- --- --- --- --- --- --- 
1 | R | N | B | Q | K | B | N | R |
=> -X- --- --- --- --- --- --- -X- 
    a   b   c   d   e   f   g   h
  

Я думаю, у него есть некоторые интересные функции. Черный квадрат без фигуры имеет точку в центре. Стрелка внизу на доске или сверху указывает пользователю, какая сторона должна двигаться дальше. «X» или его отсутствие говорит вам, может ли ладья сделать замок. Стрелка ‘^’ под столбцом указывает, что пешка в указанном столбце может быть взята «проходом».

Итак, вот код (могут быть ошибки, я просто перевел идентификаторы и комментарии с французского без повторной компиляции) :

 ///////////////////////////////////////////////////////////////////////////
   std::ostreamamp; operator << (std::ostreamamp; out, const CPlancheamp; planche)
   {
      static const string piecesNames[] = {"   ","   ",
                                            " P ","=P=",
                                            " N ","=N=",
                                            " K ","=K=",
                                            "   ","   ",
                                            " B ","=B=",
                                            " R ","=R=",
                                            " Q ","=Q="};

      // We display how many revirsable moves have been playes
      out <<"  (Coups reversibles : " <<board.RecersiblesMoves() <<")n";

      // If it's black to move we display an arrow
      if (board.ColorToMove() == BLACK)
      {
         out <<"=>";
      }
      else
      {
         out <<"  ";
      }

      // We display the top line
      out <<" -" <<(Board.Castling(Black, QueenSideCastling)?'X':'-') <<"- --- --- --- --- --- --- -" <<(board.Castling(Black, LingSideCastling)?'X':'-') <<"- n";

      // We display all 8 lines
      for (int line = 0; line < 8; line  )
      {
        out <<(char)('8' - line) <<' ';

        // for each column
        for (int column = 0; column < 8; column  )
        {
          out <<'|';

          if (board[56 - 8 * line   column] != EMPTY)
          {
             out <<piecesNames[board[56 - 8 * iLigne   column]];
          }
          else
          {
            // If both the line and column are even OR if both are odds
            if (!((line | column) amp; 1) || (line amp; column amp; 1))
            {
               out <<"   ";
            }
            else
            {
               out <<" . ";
            }
          }
        }

        out <<"|n";

        if (line != 7)
        {
          out <<"   --- --- --- --- --- --- --- --- n";
        }
      }

      // If it's white to move we display an arrow
      if (board.ColorToMove() == WHITE)
      {
         out <<"=>";
      }
      else
      {
         out <<"  ";
      }

      // We display the bottom line
      out <<" -" <<(planche.Castling(WHITE, CastlingQueenSide)?'X':'-') <<"- --- --- --- --- --- --- -" <<(Board.Castling(WHITE, CastlingKingSide)?'X':'-') <<"- n";

      // Whe display the arrow for the prise en passant if there is one.
      if (board.ColumnPriseEnPassant() != NO_PRISE_EN_PASSANT)
      {
         for (int i = 0; i < (board.ColumnPriseEnPassant()   1); i  )
         {
            out <<"    ";
         }
         out <<"^n";
      }

      // We display the columns letters
      out <<"    a   b   c   d   e   f   g   hn";

      return out;
   }
  

Надеюсь, это поможет.

mp

Ответ №3:

[РЕДАКТИРОВАТЬ] В ответ на ваш комментарий…

Я думаю, что на самом деле вам нужна сетка размером 10×10, и вам нужно настроить свою логику, чтобы печатать игровую область только как 8×8 внутри 10×10 и использовать внешние квадраты (не включая углы) для печати ваших букв и цифр. [ПРАВКА КОНЦА]

ваше значение по умолчанию не ПУСТОЕ, это просто ничто. найдите ПУСТОЙ регистр в своем коммутаторе и распечатайте вкладку, и вы увидите все свои пустые места

другими словами, вместо

 case BLACK_PAWN:
            System.out.print("BPt");
            break;
        default:
            System.out.print(" "   "t");
            break;
        }
  

вы хотите сделать:

 case BLACK_PAWN:
            System.out.print("BPt");
            break;
        case EMPTY:
            System.out.print(" "   "t");
            break;
        }
  

Комментарии:

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

2. ах … хорошо, смотрите мою правку выше. Но вам все равно нужно исправить свой ПУСТОЙ регистр, как я подробно описал выше.

Ответ №4:

Я сделал это для задачи с N ферзями в Java. Итак, если вы пытаетесь напечатать другие фигуры, кроме ферзя, соответствующим образом настройте свой код. Если вы не знакомы с этой проблемой, это задача размещения N ферзей на шахматной доске N x N таким образом, чтобы никакие два ферзя не проверяли друг друга. Я знаю, что прошло много лет после того, как вы опубликовали вопрос, но я решил, что добавлю сюда фрагменты кода, чтобы кто-то мог использовать их в будущем.

В любом случае, первым шагом является создание нашего массива N x N, представляющего пробелы на шахматной доске и значение фигур, находящихся в данный момент на доске. Стоит отметить, что, поскольку это Java, наша доска основана на 0 (так как пробелы в каждой строке нумеруются от 0 до 7, а не от 1 до 8):

 public static final int N = 8;
public static char [][] board = new char[N][N];
//initialize every space to a space
for(int i = 0; i < N; i  ){
    for(int j = 0; j < N; j  ){
        board[i][j] = ' ';
    }
}
  

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

Вот пример вектора решения : [1 6 2 5 7 4 0 3] . Давайте предположим, что этот вектор представлен int[] vector = new int[N] .Количество элементов равно количеству строк на доске. Его индекс в векторе соответствует строке, а само значение соответствует номеру столбца, в котором находится королева в этой строке. Итак, мы просто перебираем их и соответствующим образом обновляем массив доски:

 for(int j = 0; j < N; j  ){
    board[j][vector[j]] = 'Q';
}
  

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

Прежде чем я объясню, как сделать эту доску, позвольте мне показать вам доску, соответствующую вектору, упомянутому ранее. Кроме того, обратите внимание, что ни один ферзь не проверяет! Я решил эту проблему, используя генетические алгоритмы.

  --- --- --- --- --- --- --- --- 
|   | Q |   |   |   |   |   |   | 
 --- --- --- --- --- --- --- --- 
|   |   |   |   |   |   | Q |   | 
 --- --- --- --- --- --- --- --- 
|   |   | Q |   |   |   |   |   | 
 --- --- --- --- --- --- --- --- 
|   |   |   |   |   | Q |   |   | 
 --- --- --- --- --- --- --- --- 
|   |   |   |   |   |   |   | Q | 
 --- --- --- --- --- --- --- --- 
|   |   |   |   | Q |   |   |   | 
 --- --- --- --- --- --- --- --- 
| Q |   |   |   |   |   |   |   | 
 --- --- --- --- --- --- --- --- 
|   |   |   | Q |   |   |   |   | 
 --- --- --- --- --- --- --- --- 
  

Наш следующий шаг — создать границы между строками (а также сверху и снизу). Я обрабатываю каждую строку как форматированную строку. Поскольку у нас есть строки пробелов и строки границ, наш массив строк имеет размер 2 * N 1.

 String[] row = new String[2*N   1];
String border = "";
//must be the length of board
for(int i = 0; i < N; i  ){
    border  = " ---";
}
border  = " ";
//every other row is a border row
for(int i = 0; i < 2*N  1; i =2){
    row[i] = border;
}
//must include the bottom
row[2*N] = border;
  

Затем мы создаем строки для самих пространств доски. Поскольку у нас уже есть это на нашей доске [] [], нам нужно только отформатировать.

 for(int i = 0; i < N; i  ){
    //left bar
    String spaces = "| ";
    //place enclosing right bar and spaces so next char goes in middle of next space
    for(int j = 0; j < N; j  ){
        spaces  = board[i][j];
        spaces  = " | ";
    }
    //add the spaces string to the rows at the odd indices
    row[2*k  1 ] = spaces;

}
  

Все, что осталось, это распечатать эту доску.

 for(int i = 0; i < 2*N  1; i  ){
    System.out.println(row[i]);
}
  

Надеюсь, это кому-нибудь поможет!