【问题标题】:Provoke an interruption in a main logic loop在主逻辑循环中引发中断
【发布时间】:2015-04-01 10:16:54
【问题描述】:

我正在制作这个益智游戏,它使用 Scanner(System.in) 接收来自键盘的字母并改变拼图状态。

现在,我正在为游戏制作 GUI。我有一个带有 JLabels 的 JPanel 显示拼图,另一个带有 2 个 JButton 的 JLabel,一个是已实现的退出按钮,另一个必须是重播按钮。这个重播按钮必须模拟整个游戏的重新开始。我的问题是如何在按下重放按钮后立即停止主循环?

当我单击按钮时,我可以使用任何系统调用,从而在主循环上产生中断吗?

这里是主逻辑循环:

    public static void main(String args[]){

    Cliente i=new Cliente();

    int labSize;
    labSize=i.func1();

    boolean b1;
    b1=i.func2();
    boolean b2;
    b2=i.func3();

    int nDarts;
    nDarts=i.func4();

    int nDrags;
    nDrags=i.func5();

    Game g=new Game(labSize,nDarts,nDrags);

    g.boolInit(b1, b2);

    g.initGame();

    i.setTab(g.getLab(), g.getLabSize());

    do{
        g.updateGame();

        i.setTab(g.getLab(), g.getLabSize());
        i.showTab();

        g.moveHeroObj(i);

        g.firingDartsLogic(i);

        g.weaponCaught();
        g.shieldCaught();
        g.dartLogic();

        g.flamesLogic();
        if(!g.didGameEnd()){
            g.dragonKillLogic();
            g.dragonLogic();
        }

        g.updateHeroSymbol();
        g.updateDragonSymbol();

        if(g.finishedGame())
            g.changeEndBool();

    }while(!g.didGameEnd());

    g.updateGame();

    i.setTab(g.getLab(), g.getLabSize());
    i.showTab();

    i.exitFunc();
    return;
}

这是图形用户界面:

public GameGUI(int n) {
    labSize=n;

    mainFrame = new JFrame("Maze Game");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
    mainFrame.setVisible(false);
    
    choicesPanel=new JPanel();
    choicesPanel.setLayout(new GridLayout(0, 1));

    labPanel=new JPanel(new GridLayout(labSize,labSize));
    
    replayButton=new JButton("Replay");
    replayButton.setAlignmentY(Component.TOP_ALIGNMENT);
    replayButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    replayButton.addActionListener(new ReplayHandler());
    
    exitButton=new JButton("Exit");
    exitButton.setAlignmentY(Component.TOP_ALIGNMENT);
    exitButton.setAlignmentX(Component.LEFT_ALIGNMENT);
    exitButton.addActionListener(new ExitHandler());
    
    choicesPanel.add(replayButton);
    choicesPanel.add(exitButton);
    
    mainFrame.getContentPane().add(choicesPanel);
    mainFrame.getContentPane().add(labPanel);
}

private class ExitHandler implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        String[] holder={"Yes","Cancel"};
        if(JOptionPane.showOptionDialog(null, "Are you sure you want to exit?", "", 0, 0, null, holder, 0)==0){
            System.exit(0);
        }
    }
    
}

private class ReplayHandler implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        String[] holder={"Yes","No"};
        if(JOptionPane.showOptionDialog(null, "Start a new game?", "", 0, 0, null, holder, 0)==0){
        }
    }
    
}

【问题讨论】:

  • 最简单的方法是在您的 ReplayHandler 中引用您的游戏和一个特定的方法,例如game.restartGame()

标签: java swing do-loops


【解决方案1】:

我的问题是如何在按下重放按钮后立即停止主循环?当我单击按钮时我可以使用任何系统调用,以便在主循环上产生中断?

你没有。您不会使用用于线性控制台程序的相同类型的“游戏循环”程序结构作为事件驱动的 GUI,就像您不会使用带有 Swing GUI 的 new Scanner(System.in)。相反,您会在按下按钮时更改游戏的状态。只有在需要某种动画时才会使用游戏循环,但这里似乎并非如此。

作为附带建议,请避免使用 func1()、func2() 之类的方法名称。当你 6 个月后回来调试这段代码时,你会想知道这些到底是做什么的。取而代之的是,给你的变量和方法起一个有意义的名字,让代码自我注释的名字。

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 2014-12-14
    • 2021-12-30
    • 2017-05-05
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多