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

Работя върху създаването на настолна игра за шах и дама (и няколко варианта, които искам да направя). Имам клас Board, който разширява JPanel и настройва двуразмерен масив от JPanels, който да действа като моя дъска. Ето част от кода за моя клас на дъска:

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: Ето кода за моя клас по дама.

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 елемента от двумерния масив board[][], който е във вашия клас Board. По-добре е да внедрите метода в класа Board, тъй като Piece може да прави промени само в себе си. Ако поставите move() в клас 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(){
}
person safarisoul    schedule 01.03.2012