0

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

public class MyPiece extends Piece {

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

上面的代码显示了一些可以上下移动的样本。这不是一个有效的棋步。那么如果我要移动一个皇后,我会怎么做?简单来说,我们只是假设我们已经有一个 8 x 8 的矩阵 (x,y) 板。

4

3 回答 3

2

尤其是对于国际象棋皇后来说,这并不是那么简单。你必须:

  1. 确定直线移动,即水平、垂直或对角线。
  2. 路上没有其他作品。

所以,

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

现在选择方向,遍历路径并检查您matrix的单元格中是否不包含在此移动期间将由女王通过的单元格中的元素。

于 2013-07-14T13:11:13.303 回答
1

您需要考虑“给定棋子 P 在棋盘上的位置 (x,y) 上,棋子可以移动到哪个坐标?”。即对于 (1,1) 上的车,您可以移动到 (1,2)..(1,8) 和 (2,1)..(8,1)。

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

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

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

于 2013-07-14T13:14:53.680 回答
1

不过很快:

引入一个名为“Moveable”的接口。您的图形类(您称它们为“片段”)将像这样定义。将您的 canMove() 方法提取到此接口中,并添加 move() 方法,如果它失败则返回一些未经检查的异常。

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

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

这种尝试有一个好处——它首先让你测试你的身材是否可以朝那个方向移动。如果否,则不需要其他测试。

于 2013-07-14T13:23:10.487 回答