gpt4 book ai didi

java - 棋局设计与单例模式

转载 作者:行者123 更新时间:2023-11-30 07:12:34 26 4
gpt4 key购买 nike

我目前正在创建一个包含以下类的国际象棋游戏:

  • ChessPiece - 对于所有不同的棋子,由一个 MovementBehaviour 实例变量组成
  • MovementBehaviour - 由 PawnMovementBehaviour 实现的接口(interface),KingMovementBehaviour 等类来定义每种棋子的移动方式
  • ChessBoard - 由 ChessPiece[][] 二维数组组成,具有 addPiece()/removePiece()/replacePiece() 等功能
  • 玩家 - 小类有助于关联哪些棋子属于哪个人类玩家
  • 游戏 - 主要类,首先询问玩家的姓名和想要的棋子颜色,然后运行通过实例化棋盘并让玩家轮流移动来进行游戏转弯直到将死。

我想知道我是否应该使用单例模式(关于 ChessBoard 类)?目前我没有,我正在将 ChessBoard 的实例传递到棋子移动功能中,所以这件作品可以理解周围的环境。这是因为移动当然被认为是合法的,具体取决于棋盘上随时占用/空出的空间。

最佳答案

单例很少是个好主意。我碰巧最近开始了一个类似的项目,所以我会根据我目前的经验来回答这个问题。

我实现它的方式是将棋盘视为 Location 对象的集合,其中一个位置包含一个 X 值,Y-value 和一个 Piece 对象。仅填充相关位置,甚至不跟踪空位置。

您似乎想知道是否应该将单例用于验证的单一目的。移动完成后,您必须验证很多很多事情:您可以那样移动吗?你检查了吗?是过路人吗?是罗夏德吗?等等

您可以做的是创建一堆验证方法,这些方法将棋盘以及开始和结束位置作为参数。通过这种方式,您可以获得检查移动是否有效所需的所有信息。这确实需要棋子知道它们自己的属性:我怎样才能移动?我的颜色是什么?

当您拥有所有这些后,您可以实现不同的验证逻辑来​​采取行动。

当您可以提取验证并四处传递棋盘时,使用单例将相当讨厌。测试也会困难得多(在国际象棋游戏中,好的测试绝对是你想要的)。

我的设置是这样的:

Chessboard.CanMoveToLocation(int startX, int startY, int endX, int endY) {
// Call validators with local field chessboard and given location objects
}

每个 validator 将返回一个自定义枚举 ValidationResult 以指示是否允许或禁止此特定 validator 。

您必须确保以正确的顺序调用 validator (在检查它是否有效后返回 false 不是一个好主意:他可能一直在 rochading 或杀死 en-passant)。或者您当然可以组合相关的 validator 。

如果您想看一看:my current (far from finished) implementation .

关于java - 棋局设计与单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20268062/

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