Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在国际象棋比赛中,棋子应该移动还是棋盘应该移动棋子_Java - Fatal编程技术网

Java 在国际象棋比赛中,棋子应该移动还是棋盘应该移动棋子

Java 在国际象棋比赛中,棋子应该移动还是棋盘应该移动棋子,java,Java,我正在使用java构建一个国际象棋游戏,可能不会使用任何gui或任何简单的控制台游戏,但我有ChessBoard类,如下所示: public class ChessBoard { private BasePiece[][] board = new BasePiece[8][8]; private int charToInt(char input){ return (int)input - 97; } p

我正在使用java构建一个国际象棋游戏,可能不会使用任何gui或任何简单的控制台游戏,但我有ChessBoard类,如下所示:

public class ChessBoard {

        private BasePiece[][] board = new BasePiece[8][8];

        private int charToInt(char input){
            return (int)input - 97;
        }

        public void setPiece(String colour, String type, char x, int y){
            board[charToInt(x)][y-1] = new BasePiece(colour, type);
        }

        public void setPiece(String piece, char x, int y){
            board[charToInt(x)][y-1] = new BasePiece(piece);
        }

        public String getPiece(char x, int y){
            return board[charToInt(x)][y-1].getPiece();
        }

    }
public class ChessPiece {
    private String colour;
    private String type;

    ChessPiece(String colour, String type){
        setColour(colour);
        setType(type);
    }

    ChessPiece(String piece){
        setColour(piece.toCharArray()[0]);
        setType(piece.toCharArray()[1]);
    }

    private void setColour(String colour){
        this.colour = colour.toLowerCase();
    }

    private void setColour(char colour){
        switch (colour) {
            case 'w':
                setColour("white");
                break;
            case 'b':
                setColour("black");
                break;
            default:
                setColour("invalid colour");
                break;
        }
    }

    private void setType(String type){
        this.type = type.toLowerCase();
    }

    private void setType(char type){
        switch (type) {
            case 'K':
                setType("king");
                break;
            case 'q':
                setType("queen");
                break;
            case 'r':
                setType("rook");
                break;
            case 'b':
                setType("bishop");
                break;
            case 'k':
                setType("knight");
                break;
            case 'p':
                setType("pawn");
                break;
            default:
                setType("invalid type");
                break;
        }
    }

    public String getColour(){
        return colour;
    }

    public String getType(){
        return type;
    }

    public String getPiece(){
        return getColour() + " " + getType();
    }
}
这是一段非常简单的代码,可以将棋子添加到棋盘上,然后打印出任何给定位置的棋子,但我还有一个ChessPiece类,如下所示:

public class ChessBoard {

        private BasePiece[][] board = new BasePiece[8][8];

        private int charToInt(char input){
            return (int)input - 97;
        }

        public void setPiece(String colour, String type, char x, int y){
            board[charToInt(x)][y-1] = new BasePiece(colour, type);
        }

        public void setPiece(String piece, char x, int y){
            board[charToInt(x)][y-1] = new BasePiece(piece);
        }

        public String getPiece(char x, int y){
            return board[charToInt(x)][y-1].getPiece();
        }

    }
public class ChessPiece {
    private String colour;
    private String type;

    ChessPiece(String colour, String type){
        setColour(colour);
        setType(type);
    }

    ChessPiece(String piece){
        setColour(piece.toCharArray()[0]);
        setType(piece.toCharArray()[1]);
    }

    private void setColour(String colour){
        this.colour = colour.toLowerCase();
    }

    private void setColour(char colour){
        switch (colour) {
            case 'w':
                setColour("white");
                break;
            case 'b':
                setColour("black");
                break;
            default:
                setColour("invalid colour");
                break;
        }
    }

    private void setType(String type){
        this.type = type.toLowerCase();
    }

    private void setType(char type){
        switch (type) {
            case 'K':
                setType("king");
                break;
            case 'q':
                setType("queen");
                break;
            case 'r':
                setType("rook");
                break;
            case 'b':
                setType("bishop");
                break;
            case 'k':
                setType("knight");
                break;
            case 'p':
                setType("pawn");
                break;
            default:
                setType("invalid type");
                break;
        }
    }

    public String getColour(){
        return colour;
    }

    public String getType(){
        return type;
    }

    public String getPiece(){
        return getColour() + " " + getType();
    }
}
到目前为止,所有这些都是有效的,但我想知道,让棋子在棋子类中移动,还是让棋子在棋子类中移动,然后让棋子在棋盘类中移动,这样会更好
谢谢

正如我在评论中提到的,我认为您的OOP结构可能有点过于简单。我建议您考虑创建:

枚举颜色:白色、黑色。最好使用枚举而不是字符串,因为后者容易出错,并且不允许方法参数和其他编译时类型检查 抽象类AbstractChessPiece:碎片从中扩展的抽象类。它有一个ChessColor字段,以及所有片段都需要的任何其他抽象方法。实际上可能不需要这个。 enum ChessPiece扩展了AbstractChessPiece:最好对此进行枚举,因为它们将是常量。将有几个方法,包括公共布尔moveAllowedChessSquare,如果允许此工件移动,则返回true。 类ChessSquare:它知道自己的带有getter和setter的rank和file int字段,并且有一个ChessPiece字段,如果正方形为空,则该字段为null;如果正方形为空,则该字段包含一个ChessPiece。 类棋盘:容纳棋盘格 类棋手:代表两个棋手中的一个。它有一个ChessColor字段,一个捕获片段的列表,移动的方法,提出平局的方法,投降的方法。。。 类棋类游戏:启动一切并控制游戏流程的程序。移动的玩家将向游戏对象提议移动,该移动将检查有效性,如果有效,则进行移动并检查移动的游戏结果,包括捕获、检查、将死,。。。 您应该使用计算机风格的国际象棋符号来帮助您回答这个问题,这是由正则表达式表示的四个字符^[a-h][1-8][a-h][1-8]$:例如,e1g1表示白色城堡王侧,e8c8表示黑色城堡皇后侧

我们使用这种计算机风格的国际象棋符号,因为它很容易从一个数字来回转换


还要注意,中途移动需要一个不寻常的捕获。

我认为您的OOP结构需要加强。可能代表人类或计算机玩家的玩家对象应在查询棋盘状态后,提出游戏对象验证合法的移动。如果合法,则游戏对象应允许移动,执行与移动相关的任何操作捕获一个棋子,检查并宣布检查,检查并宣布将死,并将当前玩家切换到游戏中的下一个玩家。我会让棋盘处理移动。碎片不需要知道它们的位置,是吗?我认为让他们参与这个过程只会让事情变得复杂。我完全同意@hovercraftfullofels,玩家应该移动棋子。我还强烈建议您使用枚举来处理颜色和棋子类型不仅棋子不知道其当前位置,也不知道其他棋子的位置,因此它无法检查移动是否合法。游戏对象应该知道棋盘、棋子位置、捕获的棋子以及它的移动。。。。