国际象棋游戏设计问题
我想用java实现一个国际象棋游戏。 到目前为止,我想到了这些类:
Piece
:抽象类。 所有的棋子类型都是从这个类继承而来的(比如Queen
, King
, Pawn
等等getMovePath(Cords source, Cords dest)
,类中的每个子类都有不同的getLegalMoves()
getMovePath(Cords source, Cords dest)
。
Board
:这个类将有一个8X8
阵列的Piece
。 NULL
ref是空方块的含义。
BoardAlgorithms
:这个类将包含所有“扫描”算法,例如检查是否有支票,将军,检查移动是否合法等等。
当然,这只是基本的课程,但在进入更困难的部分之前,我想解决一些问题:
我需要一个像Piece
类中的isKing()
这样的布尔方法来发现一个国王正在被攻击(将用于检查是否有支票或将军),但在我看来,它并不是OOP
方式中最好的解决方案。 有没有其他的方式来做到这一点?
白色棋子和黑色棋子的移动方式不同。 我应该将类Pawn
分成像WhitePawn
和BlackPawn
这样的2个子类,或者我应该添加一个像m_type
这样的enum
成员,它将保持BLACK
或WHITE
并根据它的值建立正确的移动?
在添加GUI和图形之前,我想实现一个非常简单的文本视图来调试游戏的逻辑。 再次,我将需要一个优雅的方式来知道,当我们扫描董事会时,我应该为每个子类打印不同的字符串。 另外:考虑我们希望将视图实现更改为未来使用图形的GUI。 这里最好的解决方案是什么?
我需要一个像Piece类中的isKing()这样的布尔方法来发现一个国王正在被攻击(将用于检查是否有支票或将军),但在我看来,它并不是OOP方式中最好的解决方案。 有没有其他的方式来做到这一点?
为此,也许最好也存储对每个特定国王对象的引用(除了你的列表或任何你有的东西),然后检查每一个国王是在检查还是将军。
白色棋子和黑色棋子的移动方式不同。 我应该将类Pawn分成像WhitePawn和BlackPawn这样的2个子类,或者我应该添加一个像m_type这样的枚举成员,它将保持BLACK或WHITE,并根据它的值建立正确的移动?
像第二种选择听起来更好。 将一些实例变量添加到Pawn类中,该类描述了它们可以移动到哪个方向,这个类只有一个字段(这也可能有助于确定在替换棋子时是否拥有正确的棋盘远端)。 你可以在构造函数中传递这个信息。 此外,这不会限制黑色或白色棋子仅被允许到棋盘的一个起始侧。
Piece对象可能有一个父Team对象,它可以存储他们尝试移动的颜色和方向以及他们可以查询的内容,从而不需要向Pawn添加单个的细节。
在添加GUI和图形之前,我想实现一个非常简单的文本视图来调试游戏的逻辑。 再次,我将需要一个优雅的方式来知道,当我们扫描董事会时,我应该为每个子类打印不同的字符串。 另外:考虑我们希望将视图实现更改为未来使用图形的GUI。 这里最好的解决方案是什么?
这是做这件事的好方法。 将您的逻辑与GUI代码分离开来,可以轻松修改和修改最佳设计。 我不确定你是在问什么可能是一种用文字打印纸板的优雅方式,但你可以使用由数字附加的字母,如Q1是白色的女王,Q2是黑色的女王。 当时间到了时,将视图实现更改为GUI应该很容易,但当前将视图与数据和逻辑分离的思维过程已经是一个很好的解决方案。
我之前已经写过几个国际象棋程序,而且你在正确的轨道上。 我会试着逐一解决你的问题:
我需要一个像Piece类中的isKing()这样的布尔方法来发现一个国王正在被攻击(将用于检查是否有支票或将军),但在我看来,它并不是OOP方式中最好的解决方案。 有没有其他的方式来做到这一点?
有几种方法可以做到这一点, isKing()
可以工作,但不是一个很好的设计。 Board
或Player
类可能最容易引用它的国王。 国王是唯一一直在棋盘上的棋子,因此可以专门提供参考。 还有一些你的检查和将军(甚至isValidMove())方法需要检查条件,看看国王是否被攻击,或者如果它已经移动等等,所以你的代码中的很多地方将需要继续指向国王
白色棋子和黑色棋子的移动方式不同。 我应该将类Pawn分成像WhitePawn和BlackPawn这样的2个子类,或者我应该添加一个像m_type这样的枚举成员,它将保持BLACK或WHITE,并根据它的值建立正确的移动?
你可以有某种布尔型或枚举来存储棋子移动的方向,或者如果你有一个Player
类,它可以在那里并且棋子委托给它们的棋手来确定哪个方向移动。当我们谈论特定的棋子时因为第一个棋子可以移动2个空格,所以您可能还需要跟踪棋子是否移动。 Rooks和Kings需要类似的旗帜来帮助看看他们是否可以进行城堡制作。
在添加GUI和图形之前,我想实现一个非常简单的文本视图来调试游戏的逻辑。 再次,我将需要一个优雅的方式来知道,当我们扫描董事会时,我应该为每个子类打印不同的字符串。 另外:考虑我们希望将视图实现更改为未来使用图形的GUI。 这里最好的解决方案是什么?
我发现最简单的文本是打印8x8电路板,黑色使用白色和小写字母的大写字母
P p = white and black pawns
B b = white and black bishops
N n = white and black knights (K's used by king)
R r = white and black Rooks
Q q = white and black queens
K K = white and black kings
当然,如果你想以其他方式使用,可以随意交换大写/小写。 通过使用单个字母,您可以轻松地以等宽字体看到棋盘的布局,而不同的棋盘可以让您轻松区分不同棋手的棋子。
特别注意设计模式“创造型模式”。 这会给你一个逻辑和用户界面的框架。 保持东西尽可能通用,并按照某人在评论中提出的建议,枚举通用对象的类型,颜色和方向。
链接地址: http://www.djcxy.com/p/84603.html