/** size of a tile in pixel (for one dimension)*/
int TILE_SIZE_IN_PIXEL = 4;
/** size of a piece in tiles (for one dimension)*/
int PIECE_SIZE_IN_TILE = 5;
public int tileToPixel(int positionInTiles){
return TILE_SIZE_IN_PIXEL * positionInTiles;
}
/** returns the tile coordinate to which the given tile coordinate belongs
Note: tileToPixel(pixelToTile(x)) only returns x if x is the upper or left edge of a tile
*/
public int pixelToTile(int positionInPixel){
return positionInPixel / TILE_SIZE_IN_PIXEL;
}
Возможно, вам также понадобятся методы, работающие с двумя аргументами (x и y at).
Для преобразования ID-> piece и наоборот доступны различные подходы. Какой из них выбрать, зависит от точных требований (скорость, размер игры ...). Поэтому убедитесь, что вы скрываете детали реализации, чтобы вы могли изменить их позже.
Я бы начал с очень простого решения:
public class Piece{
/** x position measured in tiles */
private int x;
/** y position measured in tiles */
private int y;
/** I don't think you need this, but you asked for it. I'd pass around Piece instances instead */
private final Long id;
public void getX(){
return x;
}
public void getY(){
return y;
}
public void getID(){
return id;
}
}
public class Board(){
private Set<Long,Piece> pieces = new HashMap<Piece>(pieces);
public Piece getPieceOnTile(int tileX, int tileY){
for(Piece piece:pieces){
if (isPieceOnTile(piece, tileX, tileY)) return piece;
}
}
private boolean isPieceOnTile(piece, tileX, tileY){
if (piece.getX() < tileX) return false;
if (piece.getX() > tileX + PIECE_SIZE_IN_TILE) return false;
if (piece.getY() < tileY) return false;
if (piece.getY() > tileY + PIECE_SIZE_IN_TILE) return false;
return true;
}
}
Надеюсь, что вы начали. Весь код написан без компилятора поблизости, поэтому он будет содержать опечатки и, конечно, ошибки, которые могут распространяться по лицензии Creative Commons.
Подход к хранению фигур в наборе должен хорошо работать, если их не так много. Он должен работать лучше, чем двумерный массив, если большая часть области доски не содержит фигуры. Все это в настоящее время предполагает, что нет перекрывающихся частей. Если вам нужны те, getPieceOnTile должен вернуть коллекцию частей. Набор, если порядок не имеет значения, список, если это имеет значение.