当前位置: 首页 > 知识库问答 >
问题:

Java国际象棋游戏:检查一块棋子是否已经在棋盘上

翟高明
2023-03-14

我目前正在编写我的第一盘国际象棋,我的棋子有一个小问题。我将在下面添加一些代码,但通常我想检查玩家移动某个棋子(在本例中为国王)的棋盘是否已经被另一个棋子占据,因为在这种情况下,另一个棋子将被杀死(如果棋子属于另一个玩家),或者移动是错误的(棋子被自己的棋子占据)。如果你对如何做有任何想法,我将不胜感激。顺致敬意,

公共抽象类文章{

protected int x;
protected int y;
protected Tile finalTile;
protected Type type;
protected boolean killed;
protected boolean white;


public Piece(boolean white, int x, int y)
{
    
    this.setWhite(white);
    this.x = x;
    this.y = y;
    this.finalTile = finalTile;
            
}

public boolean isWhite() {
    return this.white;
}

public void setWhite (boolean white) {
    this.white = white;
}

public boolean isKilled() {
    return this.killed;
}

public void setKilled (boolean killed) {
    this.killed = killed;
}

// which type of Piece is being used
public abstract Type getType();

//is the chosen move valid?

  public abstract boolean canMovePiece (Chessboard chessboard, int finalX, int finalY);

//The validation of the move does not show in which direction the piece is being moved. To set 
  the piece at its new spot (tile), a determination of the direction is needed for the 
// calculation of the new spot on the chessboard

public abstract void setNewPieceLocation();

}

公共类国王延伸件{

public King(boolean white, int x, int y)
{
    
    super(white, x, y);
    type = Type.KING;
    
}



public Type getType() {
    return Type.KING;
}

@Override
public boolean canMovePiece(Chessboard chessboard, int finalX, int finalY) {
    
        
        int x_diff = Math.abs(finalX - this.x);
        int y_diff = Math.abs(finalY - this.y);
        
    //the king can only move one tile per round. The direction does not matter. Therefore, the 
      movements can be either one on the x-axis, the y-axis or one on both. 
    
    if ( x_diff == 1 && y_diff == 0 || x_diff == 0 && y_diff == 1 || x_diff == 1 && y_diff ==1) {
        return true;
    }
        
    }
    
@Override
public void setNewPieceLocation() {
    
    int finalX = this.x;
    int finalY = this.y;

}

}

共有1个答案

方夜洛
2023-03-14

在基于平铺的计算机游戏中,您必须始终做出一个非常重要的初始设计决策,即选择什么作为您的中心数据结构:

>

  • 字段本身,例如作为二维数组,其中字段中每个磁贴的状态表示其上或上的块

    带有坐标的碎片集合。

    如果你有一个小的区域,并且这些块只能直接放在瓷砖上,那么选项1是很好的。

    只有在备选案文2不可能的情况下,才应采用备选案文2,即:

    • 你的游戏世界是非常大和稀疏的,例如100万x100万,那么你将有一个数组与一万亿个条目或(包括或)
    • 您的作品可以在中间或以其他方式小数分别与瓷砖

    如果在同一时间任何一块瓷砖上最多有一块,则选项1最容易实现,但您可以解决这一问题,这取决于具体情况,哪一块最好。

    国际象棋有哪种情况?作为练习,您可以自己考虑,但我将给出以下解决方案:

    第一个选项非常适合下棋,因为你有一个非常小的区域(8x8),棋子正好在棋盘上(理论上,即使它们在实践中可能有几毫米的距离),每个棋盘最多只能有一个棋子。

    选项1的优点是它变得非常容易检查,哪一块在某个磁贴上:只需检查该点的字段数据结构!

    对于初学者来说,另一个非常重要的点是如何将你的坐标系映射到你的数据结构,尤其是在二维数组的情况下。数组的哪个维度是你的游戏世界的哪个轴,在哪个方向?然而,这里没有对错,只是清楚地记录下来并保持一致!

    例如,我个人喜欢把y从上到下作为数组的第一维,把x从左到右作为字段[y][x],因为计算机图形内存是这样对齐的(至少在旧的10h 320x200 8位调色板视频模式),但是数学老师可能更喜欢x优先,y从下到上作为字段[x][y],因为这就是你通常如何绘制二维图,并在数学符号中以x优先书写点。

    所以在我的心智模型中,检查左上角就是检查值字段[0][0],右上角是字段[0][7],左下角是字段[7][0],右下角是字段[7][7]。

    我们假设的数学老师可以使用字段[0][7]作为左上角,右上角是字段[7][7],左下是字段[0][0],右下是字段[7][0]。

    只要使用对你有用的东西(如果你有团队的话)。

    为了防止对象相等性与对象标识的问题,我不会为类型使用类,而是使用枚举,因为这非常适合这种情况。作为空字段,您可以使用null,但随后可能需要一系列检查来防止NullPointerExcION,或者为空字段创建一个特殊值。

    用选项2检查哪一块在某个位置也不难,但由于选项1在这里容易得多,而且在重要的情况下也更快,因此我不会在这里详细说明,因为这不是解决问题的最佳方法。

  •  类似资料:
    • 我已经有一个Board对象,包含一个碎片列表。Piece是一个抽象类,有一个位置(x,y)和一个颜色(黑色或白色)。然后是King、Queen、Knight这三个类,实现了Piece类。 谢谢

    • 本文向大家介绍c# 绘制中国象棋棋盘与棋子,包括了c# 绘制中国象棋棋盘与棋子的使用技巧和注意事项,需要的朋友参考一下 本文是利用C# 实现中国象棋的棋盘绘制,以及初始化布局,并不实现中国象棋的对弈逻辑。仅供学习参考使用。 思路: 绘制中国象棋棋盘,竖线九条,横线十条。再中间绘制‘楚河',‘汉界' 。 绘制棋子,然后将棋子布局在棋盘上即可。 涉及知识点: 用户控件:用于实现棋盘的绘制,重写 OnP

    • 我刚刚学习了Android和Java编程(里面非常noob),我想问一些关于Android编程和Socket服务器的问题。 我得到一个任务,创建一个简单的国际象棋应用程序(不包括AI),棋子的位置将从TCP套接字中检索: 服务器:xinuc.org 端口:7387 我被告知使用Socket Persistent,因为服务器会在每秒更新典当的位置,典当的位置将以这种格式发送 [卒典][横位][竖位]

    • 本文向大家介绍Javafx实现国际象棋游戏,包括了Javafx实现国际象棋游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Javafx实现国际象棋游戏的具体代码,供大家参考,具体内容如下 基本规则 棋子马设计“日”的移动方式 兵设计只能向前直走,每次只能走一格。但走第一步时,可以走一格或两格的移动方式 请为后设计横、直、斜都可以走,步数不受限制,但不能越子的移动方式。 车只能横向

    • 上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。

    • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。