【发布时间】:2010-07-14 14:23:11
【问题描述】:
我正在尝试设计Bejeweled 游戏。我基本上有3节课。 Game 类,这是玩家将要使用的,Board 类代表棋盘,SwitchController 类负责检查棋盘上想要的开关是否有效,进行切换,计算可用切换的数量(这样我就可以知道游戏何时结束等)。
我目前的设计是这样的:
Game:
isGameOver()
isSwitchValid(coord1, coord2)
makeSwitch(coord1, coord2)
getPieceAt(coord)
getBoardLength()
IBoard:
getPieceAt(coord)
setPieceAt(coord, piece)
getLength()
我的想法是有一个ISwitchController:
ISwitchController:
isSwitchValid(coord1, coord2)
makeSwitch(coord1, coord2)
getAllValidSwitches()
下面是如何组织类的小图:
我将有 2 个不同的具体类 IBoard 可供使用(对于每一个,我都必须有一个 ISwitchController 实现)。
问题:
我的程序是有 2 个 IBoard 实现:
第一个,ArrayBoard,将所有棋盘棋子存储在一个二维数组中。它没有什么特别之处。我将定义一个ArrayBoardSwitchController 来管理这个类。
第二个,ListBoard,对于每种颜色的棋子都有一个 List/Set,其中包含该颜色棋子的所有坐标。我将定义一个ListBoardSwitchController 来管理这个类。
这里的主要问题是SwitchController 的实现将在ArrayBoard 和ListBoard 上完全不同。例如,虽然要实现getAllValidSwitches() ArrayBoardSwitchController 只需要getPieceAt() 方法,但使用ListBoardSwitchController(在那个类中我使用内部列表,因为它更容易检查移动是否是以这种方式有效)。
据我所知,有两种不同的可能解决方案:
我可以将
ISwitchController和IBoard接口。这样我就只有 两个班,游戏和棋盘(而 基本上游戏只是一个 董事会的控制器,因为它 将是拥有所有 游戏逻辑)。不会那么美好 因为课程不会 如果我有,他们会尽可能地有凝聚力 3 个不同的类。让接口保持原样并放置 我需要与公共合作的所有方法 在具体的课程中。例如,如果我需要
getYellowPiecesList()方法,我会把它公开 在ListBoard所以ListBoardSwitchController可以 用它。ListBoardSwitchController只会 知道它,因为它知道它只有效 反对ListBoards。
您对此事有何看法? 这里的重点不是如何设计 Bejeweled 游戏,而是如何解决这个问题,当你尝试实现算法时会反复出现:一方面你希望有一个清晰良好的 OOP 设计,以及另一方面,有时这会妨碍健全有效的算法实现。
【问题讨论】:
-
不相关:你用什么软件来创建那个图表?
-
@Adam:对图像 URL 的检查发现 yuml.me 是根。这是一个在线 UML 图表工具,我刚刚添加了书签并打算经常使用它。
-
@Randolpho - 很酷,你也可以购买和下载它:-)
-
@Adam:我从 Meta 上的评论中发现了那个网站,它非常酷。 :-)