当前位置: 首页 > 知识库问答 >
问题:

国际象棋游戏设计与单人模式

司空俊悟
2023-03-14

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

  • ChessPiece-对于所有不同的棋子,由一个Movement行为实例变量组成
  • 移动行为-接口实现的当铺移动行为,KingMovement行为等类,以定义如何每个片类型移动
  • ChessBoard-由ChessPiece[][] 2D数组组成,具有addPiece()/RemvePiece()/replace ePiece()等功能
  • 玩家-小班帮助关联哪些棋子属于哪个人类玩家
  • 游戏-主要的类,它将开始询问玩家的名字和所需的棋子颜色,然后通过实例化棋盘运行游戏,让玩家依次移动,直到达到将死。

我想知道我是否应该使用单例模式(关于棋盘类)?目前我没有,我正在将棋盘的实例传递到棋子运动功能中,以便棋子能够理解其周围环境。这是因为,当然,根据棋盘上的空间在任何时候被占用/清空,移动被视为合法。

共有2个答案

关胜
2023-03-14

根据我的经验,在这种情况下,我宁愿使用观察者模式。ChessBoard类扮演观察者的角色,ChessPiece应该是一个抽象类,它应该是主题类。你可能想看看观察者模式和它的用法

当你拿着一个棋子移动时,这意味着该棋子的位置已经改变,棋子将通知棋盘检查移动是否有效。

农明辉
2023-03-14

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

我实现它的方式是将棋盘视为位置对象的集合,其中位置包含X-值、Y-值和对象。只有相关的地方被填写,而空的地方甚至没有被追踪。

您似乎在想,是否应该将单例用于验证的单一目的。当一个动作完成时,你需要验证很多很多事情:你能那样做吗?你检查了吗?是顺路的吗?是罗查德吗?等

你可以做的是创建一系列验证方法,这些方法将棋盘和起始和结束位置作为参数。这样你就有了检查移动是否有效所需的所有信息。这确实要求这些碎片知道它们自己的属性:我如何移动?我是什么颜色的?

当你有了所有这些,你可以实现不同的验证逻辑来采取行动。

当你只需要提取验证并传递棋盘时,使用单例将是相当糟糕的。测试也会困难得多(好的测试肯定是你在棋盘游戏中想要的东西)。

我的设置如下所示:

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

每个验证器将返回一个自定义枚举ValidationResult,以指示此特定验证器是否允许或禁止使用它。

你必须确保验证器是按照正确的顺序调用的(在检查它是否是有效的移动后返回false不是一个好主意:他可能已经被rochading或杀死了en-Passant)。或者你当然可以结合相关的验证器。

如果您希望看一看:我当前(远未完成)的实现。

 类似资料:
  • 本文向大家介绍Javafx实现国际象棋游戏,包括了Javafx实现国际象棋游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Javafx实现国际象棋游戏的具体代码,供大家参考,具体内容如下 基本规则 棋子马设计“日”的移动方式 兵设计只能向前直走,每次只能走一格。但走第一步时,可以走一格或两格的移动方式 请为后设计横、直、斜都可以走,步数不受限制,但不能越子的移动方式。 车只能横向

  • 我刚刚学习了Android和Java编程(里面非常noob),我想问一些关于Android编程和Socket服务器的问题。 我得到一个任务,创建一个简单的国际象棋应用程序(不包括AI),棋子的位置将从TCP套接字中检索: 服务器:xinuc.org 端口:7387 我被告知使用Socket Persistent,因为服务器会在每秒更新典当的位置,典当的位置将以这种格式发送 [卒典][横位][竖位]

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。

  • 我用Java编写国际象棋程序时,有一个GameLauncher类和一个包含所有其他类的Game类,因为所有这些类都需要访问表示棋盘上棋子的Game实例变量。这些内部类是Player、BoardPanel(一个JPanel)、Piece和所有其他Piece子类(Rook、Horse、Bishop、King等)。 我想知道实现这一点的标准方法是将类作为游戏的内部类(从而允许它们直接访问游戏的对象)还是

  • 我目前正在编写我的第一盘国际象棋,我的棋子有一个小问题。我将在下面添加一些代码,但通常我想检查玩家移动某个棋子(在本例中为国王)的棋盘是否已经被另一个棋子占据,因为在这种情况下,另一个棋子将被杀死(如果棋子属于另一个玩家),或者移动是错误的(棋子被自己的棋子占据)。如果你对如何做有任何想法,我将不胜感激。顺致敬意, 公共抽象类文章{ } 公共类国王延伸件{ }

  • 我已经有一个Board对象,包含一个碎片列表。Piece是一个抽象类,有一个位置(x,y)和一个颜色(黑色或白色)。然后是King、Queen、Knight这三个类,实现了Piece类。 谢谢