3

我正在制作的游戏有 2 个课程,

gui 类和 logic 类,用于三分球游戏。GUI 类有一个使用 JButtons 数组的方法,并使用相同的匿名内部类动作侦听器将它们全部返回

问题是这样的,当我单击按钮时,我希望文本更改为取决于播放器 1 或 2 的 x 或 ao,但是这段代码应该在逻辑类中,不应该这样,所以我应该在逻辑类并从 make 按钮方法的匿名内部类动作侦听器调用它。但是,逻辑类不应该有对 gui 的引用,因为 gui 有对逻辑类的引用,

我想不出一个体面的解决方案

谢谢

4

8 回答 8

3

考虑下面的类草图:

public class Game{
    public void switchPlayer(){
        // among other things calls all GameListeners
    }
    public void setMarker(int x, int y);

    public Player getCurrentPlayer();
    public Player getPlayerOwningField(int x, int y);

    public void registerGameListener(GameListener l);
}

public interface GameListener(){
    void gameChanged(Game g)
}

public class GUI implements GameListener(){
    private Game game;
}

单击字段时,将调用 game.setMarker(x,y)。游戏知道当前玩家是谁,因此它可以适当地标记该字段。它还将触发 GameChanged 事件。在应用程序设置期间,gui 必须注册/注册为游戏的 GameListener。所以它也会得到通知。它使用游戏的 getter 来更新 gui。完毕。

当然还有很大的改进空间,例如在大型游戏中,仅仅因为一个字段发生变化而更新完整的 UI 并不是一个好主意,但它应该能让你开始

于 2009-03-16T11:09:53.783 回答
1

也许使用一个事件。因此,您可以在逻辑计算的 GUI 方面做出反应,并按照命令进行操作;)

于 2009-03-16T10:44:36.637 回答
0

使用同一个实例作为多个按钮的动作监听器几乎肯定是个坏主意。使用按钮位置参数化的同一实现类的单独实例。然后,侦听器可以使用适合模型的接口调用模型。

于 2009-03-16T11:04:49.630 回答
0

如果您的重点是设计(这听起来像是家庭作业),您可以尝试MVC (Model-View-Controller)

在这种情况下,

model = game logic, rules (fire events when things change)
  gui = (in this case and many swing apps) is both view and controller. Manipulates the model (control) and the model fires events back to update the widgets (view)
于 2009-03-16T11:07:14.103 回答
0

我不认为双向引用(GUI 有模型的引用,反之亦然)应该是一个问题。我认为您正在寻找的是 MVC(模型-视图-控制器)方法。我不知道您使用哪种编程语言来编写该游戏以及是否应用这种方法在这种情况下可能是一种开销。我用 Java 编写了一个 MVC 方法的小演示:http: //blog.js-development.com/2008/03/logical-separation-with-mvc.html

也许它对你有帮助,让我知道。

于 2009-03-16T11:09:12.087 回答
0

当按钮点击发生时,您的 GUI 调用逻辑通知它当前玩家(逻辑知道当前玩家)在某处点击了网格。然后逻辑更新状态(更新网格,更新当前播放器,...)并将事件发送回 GUI 以通知 GUI 它必须更新自身。

GUI“知道”调用操作的逻辑。为了避免逻辑不知道 GUI 并有良好的关注点分离,逻辑应该通过观​​察者模式耦合到 GUI,而不是直接调用 GUI 的逻辑。GUI 监听来自逻辑的事件。然后逻辑仅动态耦合到 GUI,这不是问题。

于 2009-03-16T11:09:47.373 回答
0

您可以应用MVC模式。

UI 类(Controller)将消息发送到 Logic 类(Model),后者将更新 View(Class)。你需要定义这个。它可以像一个布尔值数组一样简单。

UI 代码必须读取 View 类才能更改按钮中的文本。因此,当 View 发生变化时,您需要向 UI 类发送“无效”消息,以便更新按钮文本。

这里的关键点是 UI 代码参考 View 对象来呈现按钮。UI 类读取这个对象,逻辑类编写它是完全正确的。

于 2009-03-16T11:12:35.183 回答
-2

将事件标志保存在数据库或某事中。像这样在你的 gui 中查询这个标志就像异步一样工作。事件

于 2009-03-16T11:10:07.293 回答