java - 如何将此方法转换为布尔值
问题描述
我目前正在尝试实施国际象棋游戏。我已经对其进行了结构化,以便为每种类型生成可能的移动并将其存储在数组列表中。我的板是一个二维数组。我想知道如何写如果 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
}
}
解决方案
要检查移动是否可行,一种方法是将夫妇 { xTo, yTo } 与您通过 generatePossibleMoves 函数计算的所有合法移动进行比较:
public boolean moveLegal(char[][] gameBoard, int xFrom, int yFrom, int xTo, int
yTo){
int[] wantedMove = new int[] {xTo, yTo};
ArrayList<int[]> possibleMoves = generatePossibleMoves(gameBoard, xFrom,yFrom);
boolean isMoveLegal = possibleMoves.stream().anyMatch(possibleMove ->
Arrays.equals(wantedMove, possibleMove));
return isMoveLegal;
}
推荐阅读
- javascript - 如何使用 xpath 自动单击链接
- android - 在 count.ly 上推送通知
- javascript - 画布没有在 safari 上的另一个 svg 中读取 svg 视口
- android-studio - 在 Android Studio 中,在 Design Preview 中按 D 有什么作用?
- vue.js - 如何在生产中将环境变量传递给 nuxt?
- spring - 在具有 bean 范围原型的 Runnable 实现中使用 Setter 方法设置的值在 run 方法中不可访问
- postgresql - Oracle 存储过程迁移到 Postgresql
- php - 通过查询 Laravel 中的关系过滤记录
- reactjs - 通过 React.createElement 中的 Props 创建子元素
- c++ - 跟踪对 std::cout 的调用