Перемещение объектов в многомерном массиве

Я работаю над настольной игрой в шахматы и шашки (и несколько вариантов, которые я хочу сделать). У меня есть класс Board, который расширяет JPanel и настраивает двумерный массив JPanel, который действует как моя доска. Вот часть кода для моего класса платы:

public class Board extends JPanel {

  private static final int COLS = 8;
  private static final int ROWS = 8;

  private JPanel[][] board = new JPanel[COLS][ROWS];
  private JPanel chessBoard;

  public Board() {
    super();
    super.setLayout(new BorderLayout());

    chessBoard = new JPanel();
    chessBoard.setLayout(new GridLayout(COLS,ROWS));

    // Set up JPanels on bottom and right to display letters and numbers for the board
    // JPanels are called south and west
    super.add(chessBoard, BorderLayout.CENTER);
    super.add(south, BorderLayout.SOUTH);
    super.add(west, BorderLayout.WEST);

    for (int i=0; i<COLS; i++) {
      for (int j=0; j<ROWS; j++) {
        // Set up the grid
        board[i][j] = new JPanel();
        board[i][j].setBackground(getColor(i,j));
        chessBoard.add(board[i][j]);
      }
    }
    super.validate();
  }

  private Color getColor(int x, int y) {
    if ((x + y) % 2 == 0) {
      return Constants.GOLD;
    } else {
      return Constants.PURPLE;
    }
  }

  public void addPiece(Piece piece) {
    JLabel p = piece.getImage();

    board[piece.getX()][piece.getY()].add(p);
    chessBoard.validate();
  }
}

Piece — это интерфейс, который я буду использовать для всех своих частей. Я настроил интерфейс и настроил один класс, реализующий интерфейс (класс Checker). У меня все это настроено. Части - это JLabels с ImageIcons в них. Единственная проблема, с которой я пока сталкиваюсь, это написание метода перемещения. Я могу понять логику, чтобы убедиться, что ход правильный, я просто не знаю, как на самом деле сделать ход.

РЕДАКТИРОВАТЬ: я даже не спрашиваю о слушателях мыши или что-то в этом роде, я просто хочу, чтобы какой-то псевдокод объяснял перемещение части из одного места в массиве в другое.

РЕДАКТИРОВАТЬ 2: Вот код для моего класса Checkers.

public class Checker implements Piece {
  private int side,xPos,yPos; 
  private JLabel img;

  public Checker(int team, int x, int y) {
    BufferedImage image;

    try {
      if (team == 0)
        image = ImageIO.read(new File("img/RedPiece.png"));
      else
        image = ImageIO.read(new File("img/BlackPiece.png"));
    } catch(IOException e) {
      image = null;
      System.out.printf("Image file wasn't found!!!");
      System.exit(1);
    }

    img = new JLabel(new ImageIcon(image), SwingConstants.CENTER);
    img.setVerticalAlignment(SwingConstants.CENTER);

    xPos = x;
    yPos = y;
  }

  // TODO Figure out move method
  public void move(int dx, int dy) {

  }

  // Also typical gets and sets for instance variables

Итак, я подумал, что я вызываю метод перемещения для шашечной фигуры, и, предполагая, что я перемещаюсь из нижней части экрана в верхнюю, это будет piece.move(-1,1);, и мне нужно удалить piece из его текущей позиции, тогда это новая позиция в массив [x + dx][y + dy]


person CaldwellYSR    schedule 01.03.2012    source источник


Ответы (2)


Можете ли вы использовать что-то вроде этого:

public void movePiece(Piece piece, int dx, int dy) {
  // Save current position, so we can erase the piece.
  int oldX = piece.getX();
  int oldY = piece.getY();

  // Update the location.
  piece.setX(oldX + dx);
  piece.setY(oldY + dy);

  // Remove piece from old position
  board[oldX][oldY].clear();

  // Add it to the new position.
  addPiece(piece);
}

Вы, вероятно, захотите использовать Point вместо отдельных координат x и y; Я просто подумал, что это будет легче понять.

person Adam Liss    schedule 01.03.2012
comment
Так что это происходит в классе доски, а не в отдельных фигурах! Это имеет больше смысла. - person CaldwellYSR; 01.03.2012

Перемещая Кусок, вы измените как минимум 2 элемента 2-мерного массива board[][], который находится внутри вашего класса Board. Метод лучше реализовать в классе Board, так как Piece может вносить изменения только в себя. Если вы поместите метод move() в класс Piece, и объекту нужно изменить другой объект, он должен обратиться к Правлению и попросить Совет передать ему ссылку на другой объект. Что вы собираетесь изменить в каждой части, полностью зависит от вашего дизайна, такого как цвет, изображение. Вот мое предложение:

Доска:

move(Piece from, Piece to){
   ... // validation
   from.remove();
   to.put(team);
   // over is the one you jump over, optional, some if statements here
   Piece over = Board.getOver(Piece from, Piece to);
   over.remove();
   // check for further move is also optional
   if(board.isFurthermoveAvailable(to)){
      from = to;
      to = board.getFurthermoveLocation(from);
      board.move(from, to);
   }
}
getOver(Piece from, Piece to){
   return board[(from.getX()+to.getX())/2][(from.getY()+to.getY())/2];
}
isFurthermoveAvailable(Piece from){
   int team = from.getTeam();
   ... // your logic
}
// depends on what you return by isFurthermoveAvailable(Piece from)
// if you return boolean, then you also need the method below
// or, you can let the above method return null or a Piece
getFurthermoveLocation(Piece from){
   ... // your logic
}

Кусок:

remove(){
   ... // changes such as the picture, colour
}
put(int Team){ // this method is obviously depends on team
   ... 
}
// other methods may assist to the process
getTeam(){
}
getX(){
}
getY(){
}
person safarisoul    schedule 01.03.2012