如何在国际象棋中移动棋子?

时间:2013-07-14 13:03:29

标签: java chess

我目前正在为可能的国际象棋游戏设计抽象类。 我需要有关如何移动不同部分的帮助(例如女王,骑士)

public class MyPiece extends Piece {

@Override
public boolean canMove(int x, int y) {
    return (this.x != x && Math.abs(this.y - y) == 1);
}
}

上面的代码显示了一些可以上下移动的样本。这不是一个有效的国际象棋动作。所以,如果我要移动一个女王我将如何去做?简单地说,我们只是假设我们已经有一个矩阵(x,y)8乘8的板。

3 个答案:

答案 0 :(得分:3)

特别是国际象棋女王并不那么简单。你必须:

  1. 确定直线移动,即水平,垂直或对角线。
  2. 途中没有其他部分。
  3. 所以,

    • 确定该移动是水平检查this.x == x && this.y != y
    • 确定该移动是纵向检查this.y == y && this.x != x
    • 确定对角线检查Math.abs(this.x - x) == Math.abs(this.y - y)

    现在选择方向,迭代过程并检查您的matrix是否包含在此移动期间将由女王传递的单元格中的元素。

答案 1 :(得分:1)

您需要考虑“在板上的位置(x,y)上给定P,该块可以移动到哪个坐标?”。即(1,1)你可以转到(1,2)..(1,8)和(2,1)..(8,1)。

不幸的是还有其他限制,例如:

  • 大多数作品都不能通过其他作品。因此,您需要知道棋盘上棋子的坐标。
  • 国王不能进入支票。因此,你需要知道对手棋子可以移动到的位置。
  • 如果他们没有移动,国王可以城堡(它不足以处于原始位置)。因此,您需要了解游戏的历史。

对国际象棋游戏进行建模是一项有趣的练习,但也许您应该首先尝试使用棋子来习惯使用物理游戏的抽象表示,然后再下棋?

答案 2 :(得分:1)

快点:

介绍一个名为“Moveable”的界面。你的图形类(你称之为“碎片”)将被定义为这样。将canMove()方法解压缩到此接口中,并添加move()方法,如果失败则返回一些未经检查的异常。

 public class MyPiece extends Piece implements Moveable{
//your code goes here
 }

创建名为MovementPossibilities的枚举。在这里你应该存储所有可能的动作。每个运动可能性包括可能的方向(二进制状态,只是开/关,真/假,可以在那个方向上移动/不能)。对于每个方向,引入三个整数 - > minStep,maxStep,stride。显然,他们会告诉你你的身材可以向指定的方向移动多少。

这种尝试在一件事情上是好的 - 它首先让你测试你的身材是否可以向那个方向移动。如果不是,则不需要其他测试。