Перемещение объектов в многомерном массиве - PullRequest
0 голосов
/ 01 марта 2012

Я работаю над созданием настольной игры для шахмат и шашек (и нескольких вариаций, которые я хочу сделать). У меня есть класс 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();
  }
}

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

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

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

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]

Ответы [ 2 ]

1 голос
/ 01 марта 2012

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

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; Я просто подумал, что это будет легче понять.

0 голосов
/ 01 марта 2012

Перемещая фигуру, вы собираетесь заменить как минимум 2 элемента двумерной массивной платы [] [], которая находится внутри вашего класса Board. Лучше реализовать метод в классе Board, поскольку Piece может вносить изменения только в него самостоятельно. Если вы поместили move () в класс Piece, а Piece нужно сменить другой Piece, он должен поговорить с Правлением и попросить Правление передать ему ссылку на другой 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(){
}
...