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

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

public class MyPiece extends Piece {

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

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


尤其对于国际象棋女王来说,它并不那么简单。 你必须:

  • 确定直线移动,即水平,垂直或对角线。
  • 在途中没有其他作品。
  • 所以,

  • 要确定移动是水平的,请检查this.x == x && this.y != y
  • 要确定移动是垂直的,请检查this.y == y && this.x != x
  • 要确定对角线检查Math.abs(this.x - x) == Math.abs(this.y - y)
  • 现在选择方向,迭代该方法并检查matrix是否不包含在此移动过程中要由皇后传递的单元格中的元素。


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

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

  • 大多数作品无法通过其他作品。 因此,你需要知道棋盘上棋子的坐标。
  • 国王不能进入支票。 因此,你需要知道对手棋子可以移动到的位置。
  • 国王可以在没有移动的情况下进入城堡(这还不足以处于原始位置)。 因此你需要知道游戏的历史。
  • 建立一个国际象棋游戏是一个有趣的练习,但是也许你应该首先尝试棋子习惯于用一个抽象的物理游戏表示来工作,然后再下一个棋子呢?


    尽管如此:

    引入一个名为“可移动”的界面。 你的图形类(你称之为“件”)将被定义为这样。 将你的canMove()方法提取到这个接口中,并添加move()方法,如果它失败,返回一些未经检查的异常。

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

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

    这个尝试有一点很好 - 它首先让你测试你的数字是否可以朝这个方向移动。 如果否,则不需要其他测试。

    链接地址: http://www.djcxy.com/p/84617.html

    上一篇: How to move pieces in chess?

    下一篇: ASCII representation of chess board