gpt4 book ai didi

java - 如果我有一个单独的棋子类和一个单独的棋盘类,当它们彼此分离时,我如何告诉棋子移动?

转载 作者:行者123 更新时间:2023-12-01 17:29:11 24 4
gpt4 key购买 nike

Board 类有一个 8x8 2D 数组 Piece s,所以我显然可以通过执行 board.move(piece1, 3, left) 来移动 Board 类中的一 block 。例如,但我无法简单地告诉棋子移动,例如 piece1.move(3, left) ,因为它无法了解有关棋盘的任何信息(除了将其作为参数传递之外),因此它无法将自己移动到特定索引,或者知道棋子是否已经占用了该索引,或者是否正在被占用告诉移动到数组边界之外。

最佳答案

您还有其他尚未建模的对象,例如 GamePlayer。让我们退一步思考一下每个模型的职责:

  • Piece:Piece 非常小。它知道它是什么,它是什么颜色,大概就是这样。
  • 董事会:也相当小。它知道它的方格是什么。
  • 游戏:这可能是最复杂的组件。它知道游戏规则。 (毕竟,如果您想更改游戏规则,那么您不必同时更改 BoardPiece,对吧?)它知道哪个棋子组成了一套完整的游戏。它知道每个Piece可以进行哪些 Action 。它知道任何给定时间任何给定棋子棋盘上的位置。
  • 玩家:玩家游戏交互。它将告诉游戏它想要在棋子上执行给定的操作。 游戏将允许或拒绝该操作,并修改游戏的状态(检查、配对、僵持、其他玩家的回合,等)基于该操作。 (同样,PiecesBoard 并不关心这些状态。)

如果Game对象变得臃肿且笨重,它可能会被分解成碎片并主要作为复合对象存在。例如,您可以有一个 MoveList,其中包含给定规则集的可能移动。 Game 由它组成,但不需要在内部包含它。

我想得越多,我就越认为 BoardPiece 在这个领域中被视为真正的“愚蠢”对象。它们甚至不是真正的实体,只是值(value)对象。与另一件具有完全相同属性的一件基本上可以与另一件互换。 (如果您丢失了一个 Black Bishop,您可以用另一个 Black Bishop 替换它,并且不会对体验产生任何不利影响。)如果这两个被视为不可变的数据结构而不是模型,则域可能会更流畅地工作。

(还值得注意的是,相同的Board可以由具有完全不同的Piece集的其他游戏重复使用。)

作为练习,我建议遵循 Robert Martin's Bowling Game Kata 。当您考虑验证域的实际测试时,您会惊讶地发现,您在游戏域建模上投入了多少精力,结果却变得简单很多。我们可以整天从学术角度思考这些国际象棋模型,但通过一些测试来验证游戏可以得出更简单的设计。

关于java - 如果我有一个单独的棋子类和一个单独的棋盘类,当它们彼此分离时,我如何告诉棋子移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com