【问题标题】:Keeping track of chess pieces跟踪棋子
【发布时间】:2015-06-29 02:28:42
【问题描述】:

我正在构建一个国际象棋 gui;我有一个制作棋盘的按钮网格,我将每个棋子的图像设置为按钮图标。它的工作方式是每个棋子都有自己的类,它扩展了 Piece 超类。这些类中的每一个都有一个 getImage() 方法,该方法返回相应的图像。然后我将该图像设置为按钮图标。

现在我正在实施国际象棋规则,我意识到我需要知道每个棋子的位置。我想出了两个解决这个问题的方法

  1. 跟踪实例变量中的坐标。将整个对象放在按钮上,以便轻松检索。
  2. 每次单击按钮时获取坐标。基本上,点击板上的一个按钮,我得到那个按钮的坐标,然后我通过一些我必须编写的标识符方法传递那个按钮的图标来得到那个按钮上的块。然后我可以使用这些信息来使用我的逻辑方法,例如 getLegalMoves() 等。

我开始编写代码时考虑了选项 2,但它很快就变得过于复杂。如果我选择选项 1,我认为可以编写更简洁的代码。

我的问题是我不知道如何将一个完整的对象放在按钮上,这样不仅可以在按钮上显示对象的图像,而且可以轻松访问对象本身。这样我就可以简单地将对象传递到我的逻辑方法中。

这样的解决方案可能吗?我在 JPanel 上为我的棋盘使用带有 JButton 的 gridlayout。我不知道您可能还需要什么,所以请询问更多详细信息。

【问题讨论】:

  • 您应该从模型开始。模型决定了它可以改变的规则并维护所有部分的状态。 UI 然后根据模型的状态更新它的状态

标签: java swing


【解决方案1】:

在这种情况下,绝对必须将 GUI、View 从程序逻辑或 Model 中分离出来。零件的位置是模型的一部分,因此不应由 GUI 跟踪。 GUI 的唯一工作是显示模型的状态,并在用户尝试更改其状态时通过控件向模型报告。所以我建议你创建你的模型,它可能是一个由多个或更多类组成的复杂野兽。它将具有代表棋盘、ChessSquare、ChessPieces、走法、棋子的合法走法、用户以及任何 AI 引擎的逻辑类。

一个好的经验法则是编写模型,使其与 GUI 库无关,这意味着它应该与 Swing GUI、控制台程序、在线程序甚至可能是 Android 程序一起工作。

【讨论】:

  • 最后一句话是我认为我对 MVC 的理解欠缺的地方。牢记这一点,我能够从 gui 中分离出各个部分,这将使我的程序变得更简单。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2021-11-27
  • 2019-04-22
  • 2011-06-30
相关资源
最近更新 更多