如果控制器没有对模型的引用,您能否为 MVC 风格的游戏构建 Swing GUI?

Can you build a Swing GUI for an MVC-style game if the Controller doesn't have a reference to the Model?

我在这里找不到任何类似的答案,但如果这对我自己的问题来说太具体了,我深表歉意。

我正在使用 Java 构建一个简单的游戏,它有命令行界面和 GUI(使用命令行标志激活)。游戏的编写方式是游戏逻辑 (Model) 具有对输入 (Controller) 和输出 (View) 的引用,但输入或输出都没有对模型的引用(这是一项要求)。因此,游戏流程由应用程序模型中的循环控制,类似于:

while (!gameFinished) {
    InputType in = input.getUserInput(); //1
    performAction(in);
}

既然我正在尝试为此构建一个 Swing GUI(我没有这方面的经验),我正在努力了解它如何与事件监听一起工作。理想情况下,当按下按钮(新游戏、保存游戏、退出游戏等)时,InputType 将被发送到模型(本质上与注释行执行相同的操作)以进行相应处理。但是,如果它不包含对模型的引用,则它不能 'send' InputType。我想我正在寻找构建一个 GUI,该 GUI 可以使用模型 'asking' 作为输入,而不是 'listening'。

这可能吗?如果是这样,任何人都可以为我提供任何有用的资源来解决这个问题吗?如果没有,将不胜感激解释或潜在的替代解决方案建议。

我不会去讨论你的流程是对还是错。

  • 在输入中创建一个事件队列。然后,侦听器可以将事件添加到队列中。然后模型可以询问输入队列中是否有未处理的事件,并根据发生的事件执行操作。让模型持有对视图接口的引用,在 performAction 方法中调用适当的视图方法。

伪代码:

    class Controller{
    Queue<UIEvent> events;

    void setupUI(){
        button.addEventListener( new EventListener(){
             Model.this.events.add(new TappedButtonEvent());
        });
    }

    UIEvent dequeueEvent(){
        if(events.size() > 0){
            return events.pop()
        }
        return null;
    }

    }

    class Model{

    public void loop(){
        while (!gameFinished) {
             UIEvent in = input.dequeueEvent();
             if(in != null){
                  performAction(in);
             }
        }
    }
    }
  • 不要封装模型中的显示方式,让视图处理。

    interface View{
    void displayExitMessage()
    }
    
    class CommandLineView implements View{
    
    void displayExitMessage(){
        this.commandLine.append("Are you sure you want to exit(Y/N)?");
    }
    }
    
    class CommandLineView implements View{
    
    void displayExitMessage(){
        this.window.showDialog("Are you sure you want to exit?", Button.YES, Button.NO);
    }
    }