Я сейчас пытаюсь реализовать игру в шахматы. Я структурировал его так, чтобы возможные ходы генерировались для каждого типа фигуры и сохранялись в списке массивов. Моя доска - это двумерный массив. Я задавался вопросом, как написать, что если xTo yTo (координаты точки хотели переместиться) было возможным движением, то это движение могло быть сделано, но оно не позволило бы мне использовать массив list.contains()
, любые предложения очень ценятся! Вот пример того, что у меня есть. (Пользователь вводит координаты xFrom, yFrom, затем xTo yTo через терминал)
Теперь мне интересно, было бы проще преобразовать это в логическое значение? и избавиться от списка массивов?
public Board() {
this.boardsize = DEFAULT_SIZE;
board = new char[boardsize][boardsize];
// Clear all playable fields
for (int x = 0; x < boardsize; x++)
for (int y = 0; y < boardsize; y++)
board[x][y] = FREE;
board[0][7] = BLACKROOK;
board[2][7] = BLACKBISHOP;
board[5][7] = BLACKBISHOP;
board[7][7] = BLACKROOK;
board[0][0] = WHITEROOK;
board[2][0] = WHITEBISHOP;
board[5][0] = WHITEBISHOP;
board[7][0] = WHITEROOK;
Для Ладьи ....
public ArrayList<int[]> possibleMoves = new ArrayList<int[]>();
public ArrayList<int[]> generatePossibleMoves(char[][] gameBoard, int xFrom, int yFrom) {
for (int i = 1; xFrom + i < gameBoard.length; i++) {
if (getPieceColour(gameBoard, xFrom + i, yFrom) != getPieceColour(gameBoard, xFrom, yFrom)) {
if (gameBoard[xFrom + i][yFrom] != FREE) {
int[] move = {xFrom + i, yFrom};
possibleMoves.add(move);
break; //stops iterating here since a rook is not allowed to jump over other pieces
} else
{
int[] move = {xFrom + i, yFrom};
possibleMoves.add(move);
}
}
}
for (int i = 1; xFrom - i < gameBoard.length; i++) {
if (getPieceColour(gameBoard, xFrom - i, yFrom) != getPieceColour(gameBoard, xFrom, yFrom)) {
if (gameBoard[xFrom - i][yFrom] != FREE) {
int[] move = {xFrom - i, yFrom};
possibleMoves.add(move);
break;
}
else
{
int[] move = {xFrom - i, yFrom};
possibleMoves.add(move);
}
}
}
for (int i = 1; yFrom + i < gameBoard.length+1; i++) { //makes sure the place to be moved is on the board
if (getPieceColour(gameBoard, xFrom + i, yFrom) != getPieceColour(gameBoard, xFrom, yFrom)) {
if (gameBoard[xFrom][yFrom+i] != FREE) {
int[] move = {xFrom, yFrom+i};
possibleMoves.add(move);
break;
}
else
{
int[] move = {xFrom, yFrom+i};
possibleMoves.add(move);
}
}
}
for (int i = 1; yFrom- i < gameBoard.length+1; i++)
if (getPieceColour(gameBoard, xFrom, yFrom - 1) != getPieceColour(gameBoard, xFrom, yFrom)) {
if (gameBoard[xFrom][yFrom - 1] != FREE) {
int[] move = {xFrom, yFrom - 1};
possibleMoves.add(move);
break;
} else {
int[] move = {xFrom, yFrom - 1};
possibleMoves.add(move);
}
}
return possibleMoves;
}
public boolean moveLegal(char[][] gameBoard, int xFrom, int yFrom, int xTo, int yTo){
generatePossibleMoves(gameBoard, xFrom,yFrom);
if(possibleMoves.contains(xTo,yTo){
//this is where I'm stuck
}
}