国际象棋/爪哇:;“已从支票中移出”;签入Java
所以我已经在这个国际象棋应用程序上工作了大约一周了(一天几个小时)——我似乎遇到了一个障碍。所有的棋子都按它们应该的方式移动,碰撞等等——我有提升和投掷的工作,我可以成功地检查是否处于检查状态 然而,我似乎无法检查一个举动是否在法律上不受约束。我目前的做法是移动这件物品——检查此人是否仍在检查中,如果没有,则移动是合法的 然而,当我这样做的时候,它似乎没有正确地计算假动作后的支票 任何帮助都会很好国际象棋/爪哇:;“已从支票中移出”;签入Java,java,chess,Java,Chess,所以我已经在这个国际象棋应用程序上工作了大约一周了(一天几个小时)——我似乎遇到了一个障碍。所有的棋子都按它们应该的方式移动,碰撞等等——我有提升和投掷的工作,我可以成功地检查是否处于检查状态 然而,我似乎无法检查一个举动是否在法律上不受约束。我目前的做法是移动这件物品——检查此人是否仍在检查中,如果没有,则移动是合法的 然而,当我这样做的时候,它似乎没有正确地计算假动作后的支票 任何帮助都会很好 public abstract class Piece { private Type type =
public abstract class Piece {
private Type type = Type.BLANK;
private int locX, locY, preX, preY;
private Player player;
private boolean moved = false;
Piece(Type type, int locX, int locY, Player player) {
this.locX = locX;
this.locY = locY;
this.player = player;
this.type = type;
}
public void movePiece(int x, int y) {
if (player.isTurn()) {
if (isLegalMove(x, y)) {
if (checkCollision(x, y)) {
if (clearsCheck(x, y)) {
preX = locX;
preY = locY;
setLoc(x, y);
specialPreMove(x, y);
moved = true;
Chess.chessBoard.bitBoard[preX][preY] = null;
if (Chess.chessBoard.bitBoard[x][y] != null) {
Chess.chessBoard.bitBoard[x][y].getPlayer().pieces.remove(Chess.chessBoard.bitBoard[x][y]);
}
Chess.chessBoard.bitBoard[x][y] = this;
specialPostMove(x, y);
Chess.chessBoard.getGui().repaint();
Chess.changeTurns();
}
}
}
}
}
protected void specialPreMove(int x, int y) {}
protected void specialPostMove(int x, int y) {}
protected abstract boolean checkCollision(int x, int y);
protected abstract boolean isLegalMove(int x, int y);
private boolean clearsCheck(int x, int y) {
boolean checkCk = false;
preX = locX;
preY = locY;
setLoc(x, y);
Piece locPiece = null;
Chess.chessBoard.bitBoard[preX][preY] = null;
if (Chess.chessBoard.bitBoard[x][y] != null) {
locPiece = Chess.chessBoard.bitBoard[x][y];
Chess.chessBoard.bitBoard[x][y].getPlayer().pieces.remove(Chess.chessBoard.bitBoard[x][y]);
System.out.println("Piece there: " + locPiece);
}
Chess.chessBoard.bitBoard[x][y] = this;
System.out.println(Chess.chessBoard.bitBoard[x][y]);
Chess.chessBoard.getGui().repaint();
Chess.checkCheck();
checkCk = !player.inCheck();
setLoc(preX, preY);
Chess.chessBoard.bitBoard[preX][preY] = this;
if (locPiece != null) {
Chess.chessBoard.bitBoard[x][y] = locPiece;
Chess.chessBoard.bitBoard[x][y].getPlayer().pieces.add(Chess.chessBoard.bitBoard[x][y]);
} else {
Chess.chessBoard.bitBoard[x][y] = null;
}
System.out.println(checkCk);
return checkCk;
}
public ArrayList<Move> getLegalMoves() {
ArrayList<Move> moves = new ArrayList<Move>();
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
if (isLegalMove(row, col) && checkCollision(row, col)) {
moves.add(new Move(row, col));
}
}
}
return moves;
}
还有一些其他有用的东西
public class Player {
private Color color;
private Direction direction;
private boolean turn;
private boolean check = false;
public ArrayList<Piece> pieces = new ArrayList<>();
public Player(Color color, Direction direction) {
this.color = color;
this.turn = false;
this.direction = direction;
}
public ArrayList<Move> getLegalMoves() {
ArrayList<Move> moves = new ArrayList<>();
for (Piece p : pieces) {
for (Move m : p.getLegalMoves()) {
moves.add(m);
}
}
return moves;
}
public Piece getKing() {
for (Piece p : pieces) {
if (p.getType() == Type.KING) {
return p;
}
}
return null;
}
公共类播放器{
私人色彩;
私人指导;
私有布尔转向;
私有布尔检查=false;
公共ArrayList片段=新ArrayList();
公共播放器(颜色、方向){
这个颜色=颜色;
this.turn=false;
这个方向=方向;
}
公共阵列列表getLegalMoves(){
ArrayList移动=新建ArrayList();
用于(件号p:件号){
对于(移动m:p.getLegalMoves()){
增加(m);
}
}
回击动作;
}
公共物品{
用于(件号p:件号){
if(p.getType()==Type.KING){
返回p;
}
}
返回null;
}
看起来,一旦你将玩家设置为选中状态,你就不会在以后将其状态设置为未选中状态
public static void checkCheck() {
boolean isInCheck = false;
for (Move m : player1.getLegalMoves()) {
if (m.getX() == player2.getKing().getLocX()
&& m.getY() == player2.getKing().getLocY()) {
isInCheck = true;
System.out.println("IN CHECK PLAYER 2");
break;
}
}
player2.setCheck(isInCheck);
isInCheck = false;
for (Move m : player2.getLegalMoves()) {
if (m.getX() == player1.getKing().getLocX()
&& m.getY() == player1.getKing().getLocY()) {
isInCheck = true;
System.out.println("IN CHECK PLAYER 1");
break;
}
}
player1.setCheck(isInCheck);
}
啊!克拉罗!非常感谢!我真傻哈哈。但是,现在当我在getLegalMoves()中使用我的ClearCheck()方法时,我得到了一个stackOverflow错误,因为我调用了同时运行getLegalMoves()的CheckCheckCheck()。有什么办法可以绕过这个问题吗?否则非常感谢!我不确定,发布ClearCheck()代码以及与此新问题相关的任何其他代码。另一种方法可能是编写if-else语句来代替player2.setCheck(isInCheck);类似于if(isInCheck)then player2.setCheck(isInCheck);else-clearcheck()?
public static void checkCheck() {
boolean isInCheck = false;
for (Move m : player1.getLegalMoves()) {
if (m.getX() == player2.getKing().getLocX()
&& m.getY() == player2.getKing().getLocY()) {
isInCheck = true;
System.out.println("IN CHECK PLAYER 2");
break;
}
}
player2.setCheck(isInCheck);
isInCheck = false;
for (Move m : player2.getLegalMoves()) {
if (m.getX() == player1.getKing().getLocX()
&& m.getY() == player1.getKing().getLocY()) {
isInCheck = true;
System.out.println("IN CHECK PLAYER 1");
break;
}
}
player1.setCheck(isInCheck);
}