我目前正在使用Java进行面向对象编程的课程,我们需要为上一个实验室创建一个游戏,因此我的实验室合作伙伴a我选择了不使用AI并使用模型视图控制器方法制作2人象棋游戏。

我们从哪里开始以及在哪里开始有点迷茫,所以我们需要一个简单的UML图,以便我们知道从哪里开始。

我们提出了以下类,但是不确定它们是否足够或所有数据字段和方法是否有意义:

java - 如何使用GUI构建简单的国际象棋游戏的UML图?-LMLPHP


ChessBoard(模型)类和ChessLogic类(?)
View类以显示来自模型类的数据
根据用户输入更新模型数据的Controller类和View
6个片段中的每一个都继承或实现的抽象Piece类或接口。

最佳答案

该图是一个不错的开始,但仍有许多工作要做。我将在需要改进的一些方面引起您的注意,但又不能阻止您边做边学。

首先是一些手续:


使用箭头表示关系仅表示navigability。如果链接是双向的,请使用2个箭头或不使用。例如,在这里我们可以理解View知道ChessBoard,但是不清楚ChessBoard是否知道ViewsChessBoard怎样才能通知Views电路板的状态已更改搬完以后?
表示multiplicity:例如,我想知道一个ChessBoard是一个View还是同一Views可以有多个Chessboard
避免关联和属性之间的歧义。例如,在View中,您具有ChessBoard类型的model属性。但是您也与ChessBoard有关联。那都是一样的ChessBoard吗?还是我们有两个ChessBoard,一个关联并且一个嵌入?从属性中删除model并在end of the association处将model表示为关联对象的名称会更加清楚。
Controller突然分裂为两个的关联并不是很实际,特别是如果您要告诉我们关联结束和多重性的话。视觉上偏爱两条截然不同的线条。


现在到核心:


您的模型不应只是ChessBoard。该模型应为具有两个元素的GameChessBoard只是其中之一:Piece的当前位置。但是layers呢?他们在哪 ?我怎么知道是两个?管制员如何知道该轮到我了?
通过调用比棋盘更多的ChessBoard东西,可能会造成混乱。例如,董事会能否仅凭棋子位置信息确定isGameOver()是否正确?玩家决定放弃吗?因此,请根据类的实际名称来命名。
我如何找出哪个Pieces在板上?
我怎么知道Piececolor
我如何确定电路板上的单元是空闲的还是占用的?
如果因为一块被拿走而从木板上拿走一块会怎样?


您的UML图必须进行演变以阐明所有这些情况。因此,我认为要完成ChessBoardPiece,您至少要缺少GamePlayerBoardCell(也称为“ Square”),也许还有一些Pieces容器仍在每个球员的董事会。

完成后,您还需要考虑模型,视图和控件之间的关系,以确保控制器足够了解向模型发出命令的知识,并且还可以确保模型可以在某些情况下通知视图已经改变。

附注:我已经为Chess Programming Wiki添加了一些链接,因为该网站很好地描述了一些编程游戏的基本概念,一些usual questions以及大量参考资料。但是请注意,尽管该资源非常有用,但它并不是非常面向对象的。

10-07 13:41