为Scrabble的游戏实施设计灵活且可扩展的奖励系统

dev*_*ium 6 c# java architecture oop software-design

假设我正在实现我自己的Scrabble版本.我目前有一个Board包含很多的类Squares.甲Square反过来由的IBonusPiece.奖金实施实际上是拼字游戏的常用奖励,但有可能我会尝试添加一些新的和扭曲的奖励以增加游戏的灵活性 - 这里的灵活性至关重要!

替代文字

经过一段时间的思考,我得出的结论是,为了IBonus实现工作,他们需要知道整体Board及其当前位置(在Board,所以它知道它在哪里,它可以检查同样的部分广场作为奖金是).这让我感觉很糟糕,基本上它需要知道很多信息.

所以,我的天真实现是将Boardas参数传递给IBonus.calculate()方法IBonus.calculate(Board board, Point position),即.

此外,它似乎创建一个循环引用.还是我错了? 替代文字

我并不特别喜欢这种方法,所以我正在寻找其他可能的方法.我知道我可以calculate接受一个接口而不是一个具体的类,即,calculate(IBoard board)但我的IMO并不比第一个案例更好.

我担心过于专注于我目前的实现,能够想到至少能够解决这个问题的完整不同的设计.也许我可以重新设计整个游戏并在其他地方获得奖金,这样会有助于计算吗?也许我太专注于他们了Board?我当然希望有其他方法解决这个问题!

谢谢

Ton*_*nis 4

我假设 Board 具有游戏的可见状态,并且还有其他对象,例如 Rack(每个玩家一个)和 DrawPile。

“如果单词包含真实(非空白)Z,则加倍得分” - 需要您输入单词或棋盘以及单词的位置。

“如果单词是板上最长的单词,则加倍分数”需要整个板。

“如果单词的第一个字母与从 DrawPile 中随机选择的字母匹配,则获得双倍分数”当然需要 DrawPile。

所以对我来说,这仅取决于您实施的规则。我很乐意将 Board 传递给 IBonus Score() 实现。

编辑-更多想法。

所以一块棋盘有 17x17 的方格,或者其他什么。我会将 IBonus 实现分配给棋盘的每个方块(会有一个名为 PlainEmptySquare 的惰性实现。)您只需要实例化 IBonus 的每个实现一次 - 它可以被引用多次。我可能会采取低级方式并显式实例化每一个,并传递所需的参数。如果一种类型需要 Board,则将其传入。如果另一种类型需要 DrawPile,则将其传入。在您的实现中,您可能会有 12 行丑陋的代码。/耸肩