6

假设我正在实现我自己的 Scrabble 版本。我目前有一个Board包含大量Squares. ASquare又由 aIBonus和 a组成Piece。奖金实现实际上是 Scrabble 的通常奖金,但我可能会尝试添加一些新的和扭曲的奖金来为游戏增添趣味——这里的灵活性是最重要的!

替代文字

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

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

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

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

我担心过于专注于我当前的实现,以至于无法想到至少可以适应这个问题的完全不同的设计以及解决方案。也许我可以重新设计整个游戏并将奖金放在其他地方,这样可以方便计算?也许我太专注于让他们上Board?我当然希望有其他方法可以解决这个问题!

谢谢

4

4 回答 4

4

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

“如果单词包含真实(非空白)Z,则双分” - 要求您输入单词,或董事会和单词的位置。

“如果黑板上的单词最长,则双分”需要整个黑板。

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

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

编辑 - 更多的想法。

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

于 2010-10-25T22:24:43.137 回答
1

董事会本身可能必须推动给定回合的得分。放置每块瓷砖时,董事会都会记录下来。当最后一张牌(一回合)被放置时,棋盘必须获得所有有新添加的牌的方格(将计算​​这些方格的奖励)以及所有先前放置的当前回合的牌“复用”。

例如,玩 CAT

C 落在双字母分数上。因此,转牌的得分为 C.Value*2 + A.Value + T.Value。

下一位玩家放置一个 S 来制作 CATS。S 落在三重词得分上。因此,转弯的得分为 (C.Value + A.Value + T.Value + S.Value)*3。当应用了瓷砖的奖励时,它必须“停用”,以便该瓷砖的未来“重复使用”不会也获得奖励。

这意味着一些奖金适用于放置在广场上的瓷砖,而另一些则适用于在计算单个字母的奖金后组成新单词的瓷砖集合。

给定一个或多个在一个回合中已被瓷砖填充的方格,棋盘可以找到通过向左移动直到棋盘边缘(或直到一个空方格)创建的单词的开头并遍历直到相同的条件。Board 可以找到通过类似的向右和向下遍历创建的单词的结尾。每次新放置的 Tile 与现有 Tile 相邻时,您还必须遍历单词的开头和结尾(您可以在一个回合中创建许多单词)。

给定一组单词(每个单词由一个包含可能的 LetterBonus 的 Square 和一个带有值的 Tile 组成),Board(或每个 Word 本身)计算 BaseValue(Tiles 的值之和 - 应用任何 LetterBonuses),然后应用 WordBonus (如果有的话)获得Word的最终价值。

于 2010-10-25T22:54:29.243 回答
1

像下面这样的东西可能会起作用:

CurrentGameBoard,其中有 的集合Squares。ASquare可以有一个 IBonus,但是在 a 上没有Calculate()方法Square。ASquare可能有a Piece,aPiece可能有a Square(即一个正方形可能是空的,也可能不是空的,棋子可能已经或可能没有放在棋盘上)。

Board还有一个calculateScoreForTurn()方法可以接受Pieces代表该回合刚刚放在棋盘上的棋子的集合。Board知道有关刚刚放置的棋子和方格的所有信息,以及周围或相交的棋子和方格(如果适用),因此拥有计算分数所需的所有信息。

于 2010-10-25T22:28:22.880 回答
1

这让我感到很糟糕,因为它基本上需要知道很多信息

我认为这是必要的。您只是传递了对板的引用,实际上并没有导致大量数据被移动。

于 2010-10-25T22:31:18.023 回答