首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >象棋/ Java:“移出支票”在Java中签入

象棋/ Java:“移出支票”在Java中签入
EN

Stack Overflow用户
提问于 2017-03-23 23:30:20
回答 1查看 223关注 0票数 1

所以我已经用了大约一周的时间(每天几个小时)--我似乎遇到了麻烦。所有的棋子都会像他们应该的那样移动,与碰撞和一切-我有晋升和铸造工作,我可以成功地检查是否被控制。

然而,我似乎无法检查是否合法地离开了支票。我现在的方法是移动那块--检查这个人是否还在被控制,如果没有,那么这个移动是合法的。

但是,当我这样做的时候,它并没有正确地计算出假动作后的检查结果。

任何帮助都会很好。

代码语言:javascript
复制
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;
}

是件类,然后是check方法

代码语言:javascript
复制
public static void checkCheck() {
    for (Move m : player1.getLegalMoves()) {
        if (m.getX() == player2.getKing().getLocX()
                && m.getY() == player2.getKing().getLocY()) {
            player2.setCheck(true);
            System.out.println("IN CHECK PLAYER 2");
            break;
        }
    }

    for (Move m : player2.getLegalMoves()) {
        if (m.getX() == player1.getKing().getLocX()
                && m.getY() == player1.getKing().getLocY()) {
            player1.setCheck(true);
            System.out.println("IN CHECK PLAYER 1");
            break;
        }
    }
}

下面是一些有用的东西

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-23 23:55:55

看起来,一旦你设置了一个球员在检查,你不会设置他的状态以后,不受约束。

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42988834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档