我目前正在使用Java进行面向对象编程的课程,我们需要为上一个实验室创建一个游戏,因此我的实验室合作伙伴a我选择了不使用AI并使用模型视图控制器方法制作2人象棋游戏。
我们从哪里开始以及在哪里开始有点迷茫,所以我们需要一个简单的UML图,以便我们知道从哪里开始。
我们提出了以下类,但是不确定它们是否足够或所有数据字段和方法是否有意义:ChessBoard
(模型)类和ChessLogic
类(?)View
类以显示来自模型类的数据
根据用户输入更新模型数据的Controller
类和View
类
6个片段中的每一个都继承或实现的抽象Piece
类或接口。
最佳答案
该图是一个不错的开始,但仍有许多工作要做。我将在需要改进的一些方面引起您的注意,但又不能阻止您边做边学。
首先是一些手续:
使用箭头表示关系仅表示navigability。如果链接是双向的,请使用2个箭头或不使用。例如,在这里我们可以理解View
知道ChessBoard
,但是不清楚ChessBoard
是否知道Views
:ChessBoard
怎样才能通知Views
电路板的状态已更改搬完以后?
表示multiplicity:例如,我想知道一个ChessBoard
是一个View
还是同一Views
可以有多个Chessboard
?
避免关联和属性之间的歧义。例如,在View
中,您具有ChessBoard类型的model
属性。但是您也与ChessBoard
有关联。那都是一样的ChessBoard
吗?还是我们有两个ChessBoard
,一个关联并且一个嵌入?从属性中删除model
并在end of the association处将model
表示为关联对象的名称会更加清楚。
从Controller
突然分裂为两个的关联并不是很实际,特别是如果您要告诉我们关联结束和多重性的话。视觉上偏爱两条截然不同的线条。
现在到核心:
您的模型不应只是ChessBoard
。该模型应为具有两个元素的Game
。 ChessBoard
只是其中之一:Piece
的当前位置。但是layers
呢?他们在哪 ?我怎么知道是两个?管制员如何知道该轮到我了?
通过调用比棋盘更多的ChessBoard
东西,可能会造成混乱。例如,董事会能否仅凭棋子位置信息确定isGameOver()
是否正确?玩家决定放弃吗?因此,请根据类的实际名称来命名。
我如何找出哪个Pieces
在板上?
我怎么知道Piece
的color?
我如何确定电路板上的单元是空闲的还是占用的?
如果因为一块被拿走而从木板上拿走一块会怎样?
您的UML图必须进行演变以阐明所有这些情况。因此,我认为要完成ChessBoard
和Piece
,您至少要缺少Game
,Player
,BoardCell
(也称为“ Square”),也许还有一些Pieces
容器仍在每个球员的董事会。
完成后,您还需要考虑模型,视图和控件之间的关系,以确保控制器足够了解向模型发出命令的知识,并且还可以确保模型可以在某些情况下通知视图已经改变。
附注:我已经为Chess Programming Wiki添加了一些链接,因为该网站很好地描述了一些编程游戏的基本概念,一些usual questions以及大量参考资料。但是请注意,尽管该资源非常有用,但它并不是非常面向对象的。