我正在研究一款适用于任何尺寸拼图的拼图游戏解算器。我的方法由于某种原因不断抛出index out of bounds exception
,我的方法总是说当我调用doesFit()
时这件作品不合适。
我已经检查了所有帮助方法,但它们工作正常,但我的解决方案拒绝工作。 (solve方法称为helper,有一个名为remove的辅助方法)
public class Puzzle {
private Board board;
private final Piece[] pieces = {new Piece(Side.DIAMOND_OUT, Side.CLUB_OUT, Side.CLUB_IN, Side.DIAMOND_IN), new Piece(Side.CLUB_OUT, Side.HEART_OUT, Side.DIAMOND_IN, Side.CLUB_IN), new Piece(Side.SPADE_OUT, Side.DIAMOND_OUT, Side.SPADE_IN, Side.HEART_IN), new Piece(Side.HEART_OUT, Side.SPADE_OUT, Side.SPADE_IN, Side.CLUB_IN), new Piece(Side.HEART_OUT, Side.DIAMOND_OUT, Side.CLUB_IN, Side.CLUB_IN), new Piece(Side.SPADE_OUT, Side.SPADE_OUT, Side.HEART_IN, Side.CLUB_IN), new Piece(Side.HEART_OUT, Side.DIAMOND_OUT, Side.DIAMOND_IN, Side.HEART_IN), new Piece(Side.SPADE_OUT, Side.DIAMOND_OUT, Side.HEART_IN, Side.DIAMOND_IN), new Piece(Side.CLUB_OUT, Side.HEART_OUT, Side.SPADE_IN, Side.HEART_IN) };
private ArrayList<Piece> unusedPieces;
// ____________________Constructors____________________
public Puzzle(Board board){
this.board = board;
}
public Puzzle(int width, int height, ArrayList<Piece> a){
this.board = new Board(height, width);
unusedPieces = arrayToArrayList(pieces);
for(int i = 0; i < a.size(); i++){
pieces[i] = a.get(i);
}
}
public ArrayList<Piece> arrayToArrayList(Piece[] a){
ArrayList<Piece> al = new ArrayList<Piece>();
for(int i=0;i<a.length;i++){
if(a[i] != null)
al.add(a[i]);
}
return al;
}
public Piece getPiece(int index){
return pieces[index];
}
public boolean isSolved(){
for(int i = 0; i < board.getHeight(); i++){
for(int j = 0; j < board.getWidth(); j++){
if(board.isOccupied(i,j) == false) return false;
}
}
return true;
}
public void solve(){
helper(0,0);
}
private Piece remove(int row, int col, int index){
Piece temp = null;
if(board.isValid(row,col)){
temp = board.getPiece(row, col);
board.placePiece(row, col, null);
}
unusedPieces.add(index, temp);
return temp;
}
public boolean helper(int row, int col){
if(this.isSolved() == true) return true;
int length = unusedPieces.size();
if(col >= board.getWidth()){
col = 0;
row++;
}
for(int i = 0; i < length; i++){
for(int j = 0; j < 4; j++){
unusedPieces.get(i).rotateClockwise();
if(this.doesFit(row,col, unusedPieces.get(i))){
placePiece(row,col, unusedPieces.get(i));
if(helper(row, col+1)){
return true;
}
remove(row, col, i);
}
}
}
return false;
}
public boolean doesFit(int row, int col, Piece piece){
if(board.isOccupied(row, col) == true) return false;
if(board.isOccupied(row, col-1) && piece.getSides()[Cardinal.WEST.getNumVal()].getNumVal() + board.getPiece(row, col-1).getSides()[Cardinal.EAST.getNumVal()].getNumVal() != 0)return false;
if(board.isOccupied(row, col+1) && piece.getSides()[Cardinal.EAST.getNumVal()].getNumVal() + board.getPiece(row, col+1).getSides()[Cardinal.WEST.getNumVal()].getNumVal() != 0)return false;
if(board.isOccupied(row-1, col) && piece.getSides()[Cardinal.NORTH.getNumVal()].getNumVal() + board.getPiece(row-1, col).getSides()[Cardinal.SOUTH.getNumVal()].getNumVal() != 0)return false;
if(board.isOccupied(row+1, col) && piece.getSides()[Cardinal.SOUTH.getNumVal()].getNumVal() + board.getPiece(row+1, col).getSides()[Cardinal.NORTH.getNumVal()].getNumVal() != 0)return false;
return true;
}
}