【发布时间】:2023-03-13 18:12:01
【问题描述】:
我在设计国际象棋游戏时需要帮助。我已经开始了,但还没有走多远,因为我对 Java 还很陌生,实际上对编程完全不熟悉。
无论如何,我有我的抽象类 Piece 和各种片段作为子类。 我的抽象类中有一个方法 movePiece,我想为所有子类定义它。
它目前所做的只是将棋子从一个方格移动到另一个方格。我有一个可以容纳 Piece 对象的 Square 类,该板由一个 64x1 Square 数组组成。
我知道棋子是如何移动的,但实际上我该如何进行编程呢? 我想尝试应用 MVC 模式,但这真的是我第一次使用模式。
基本上,我正在考虑使用 Graphics2D 为每个 Square 创建一个框。然后,当玩家点击棋子时,移动后可用作目的地的方格将以某种颜色勾勒出来。在玩家点击其中一个方块后,我在 movePiece 方法中已有的代码将运行。
我想要做的是在 Piece 的每个子类中覆盖我的 movePiece 方法。问题是,代码如何以这些方法之一显示?以 Pawn 子类为例。
我不是要求复制/粘贴代码,只是一些有关如何执行此操作的指示,最后是一些示例代码。
谢谢!
public class Game {
@SuppressWarnings("unused")
public static void main(String[] args){
Board board = new Board();
} }
public class Board {
Square[] grid;
public Board(){
grid = new Square[64];
}
public Square getSquare(int i){
return grid[i];
}
public void setDefault(){
}
public Boolean isMoveValid(){
return null;
} }
public class Square {
private Piece piece;
public void addPiece(Piece pieceType, String pieceColour, String pieceOwner)
throws ClassNotFoundException, InstantiationException, IllegalAccessException{
PieceFactory factory = new PieceFactory();
Piece piece = factory.createPiece(pieceType);
piece.setColour(pieceColour);
piece.setOwner(pieceOwner);
this.piece = piece;
}
public void addPiece(Piece pieceType){
this.piece = pieceType;
}
public void removePiece(){
piece = null;
}
public Piece getPiece(){
return piece;
}
class PieceFactory {
@SuppressWarnings("rawtypes")
public Piece createPiece(Piece pieceType)
throws ClassNotFoundException, InstantiationException, IllegalAccessException{
Class pieceClass = Class.forName(pieceType.toString());
Piece piece = (Piece) pieceClass.newInstance();
return piece;
} }
public void setColour(String colour){
} }
public abstract class Piece {
Board board;
public void setColour(String pieceColour) {
}
public void setOwner(String pieceOwner) {
}
public String getColour() {
return "";
}
public String getOwner() {
return "";
}
public void movePiece(int oldIndex, int newIndex){
board.getSquare(oldIndex).removePiece();
board.getSquare(newIndex).addPiece(this);
}
public String toString(){
return this.getClass().getSimpleName();
} }
您想查看代码,我知道非常基本。我会将 [64] 更改为 [8][8]。 我试图不让它变得更难,那么它必须是。我可能可以将 Color 和 Owner 组合为一个属性,并使其成为一个枚举(黑色或白色)。
如果格式不好,请见谅。
【问题讨论】:
-
board consists of a 64x1 Square array.为什么?棋盘是 8x8,而不是 64x1。Basically I was thinking on using Graphics2D to create a box for each SquareGUI 排在第二位。别担心。在编写 GUI 之前让您的代码工作。您应该向我们展示您已经编写的内容,而不是询问代码的外观。看起来您已经具备设计的基础知识(实现抽象类方法)。就这样吧。 -
为什么要区分pieceColour和pieceOwner?他们是一样的
-
另外,stackoverflow 不是国际象棋问题的好地方。这里的人们对如何编写国际象棋游戏知之甚少或一无所知。试试 Talkchess.com,这是一个专业的国际象棋网站。
-
不知道,只是接受了一个我喜欢的答案!此外,这里的答案对我帮助很大。
-
@Falmarri 是一个物理棋盘。表示棋盘的数据结构不是必须的,使用单个数组而不是矩阵意味着有很多不需要发生的数组索引。