使用Java';s Swing UI可以制作石头、布、剪刀、蜥蜴、斯波克

使用Java';s Swing UI可以制作石头、布、剪刀、蜥蜴、斯波克,java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,我正在尝试使用Java的Swing UI开发一个版本的rock、paper、Scissor、lizard和spock。我已经成功地创建了一个框架来选择玩家1和玩家2,以及游戏的赢家(三分之二,玩到退出,单轮),并运行实际的游戏。但是如果用户想玩游戏,我在循环游戏屏幕时遇到了麻烦,比如说三取二。我最初只使用控制台输出(Scanner)编写程序,但现在我正在尝试实现JavaSwingUI。我似乎不知道如何在不同时生成所有游戏屏幕的情况下循环一轮又一轮 例如,这里有一个我称之为playRound()的

我正在尝试使用Java的Swing UI开发一个版本的rock、paper、Scissor、lizard和spock。我已经成功地创建了一个框架来选择玩家1和玩家2,以及游戏的赢家(三分之二,玩到退出,单轮),并运行实际的游戏。但是如果用户想玩游戏,我在循环游戏屏幕时遇到了麻烦,比如说三取二。我最初只使用控制台输出(Scanner)编写程序,但现在我正在尝试实现JavaSwingUI。我似乎不知道如何在不同时生成所有游戏屏幕的情况下循环一轮又一轮

例如,这里有一个我称之为playRound()的方法。将1添加到圆形计数器后,此方法构造
类GameWindow扩展JFrame实现ActionListener

public static void playRound() {
     ++round; //Simple int counter to keep track of round
     GameWindow oneRound = new GameWindow();
     oneRound.setSize(400, 150);
     oneRound.setLocationRelativeTo(null);
     oneRound.setVisible(true);
在GameWindow类中,我在用户可以决定玩的5个按钮(石头、布、剪刀、蜥蜴或斯波克)上有5个ActionListeners。ActionListeners识别按下了哪个按钮,然后触发游戏逻辑的其余部分,如下所示

    @Override
    public void actionPerformed(ActionEvent e) {
        String move1 = "";
        Object source = e.getSource();
        if (source == rockBtn) {
            move1 = "rock";
        } else if (source == paperBtn) {
            move1 = "paper";
        } else if (source == scissorsBtn) {
            move1 = "scissors";
        } else if (source == lizardBtn) {
            move1 = "lizard";
        } else {
            move1 = "spock";
        }
        String move2 = Game.p2.move();
        Game.p1.learn(move1, move2);
        Game.p2.learn(move2, move1);
        this.dispose();
        Game.score(move1, move2);
    }
我完全知道,如果我沿着

while (round < 3)
    playRound();
while(四舍五入<3)
playRound();
我将同时弹出三个游戏窗口。我是不是很笨,或者有没有办法关闭窗口,然后再
this.dispose()
,然后启动/打开一个新窗口,以便用户可以再次播放


抱歉,如果这是非常大二,但我一直在搜索JavaDocs试图了解答案。我能找到的最接近的事情是,我正在寻找一个
WindowEvent
,但我不确定将侦听器放在哪里,或者需要它触发什么操作。如果你只是告诉我我是个白痴,我会去把我的头埋在沙子里,完蛋了,但是任何建议都将不胜感激

如果我理解您的问题,您希望进行三轮,每次都重复相同的逻辑,但将分数作为三轮的“全局变量”,让用户有机会在三轮完成后重新启动或关闭整个应用程序

我将给你一个实际的想法,我将如何实现这一点:

我建议您在一个main方法中移动主要的协调逻辑,并在发布时保留其余的逻辑,只需稍作修改

您可以让playRound()方法返回ResultTo对象,而不是void;此DTO可以是一个简单的POJO对象,包含表示要全局维护的数据的所有变量(例如,在包含3个元素的
ResultDTO[]
数组中,每轮填充一个位置),将其填充到playMethod()的逻辑中,并在外部调用方主方法中管理返回。三轮之后,您只需在main方法中检查结果,打印出一个显示您想要显示的结果的对话框,然后使用JOptionChooser向用户询问是或否选项。如果用户想再次播放,只需重复整个逻辑,在另一种情况下,您可以调用System.exit(0)关闭应用程序或先做任何您想做的事情(使用内存数据保存文件、打印再见消息等,这取决于您的想象力以及您想如何实现这一点,请发挥创意)


为了确保应用程序不会在一轮结束时关闭,您可以使用
oneRound.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u close)
以避免在框架上调用DISPOSE()时退出应用程序。

您面临的一个问题是使用多个框架,这不仅会让您感到烦恼,还有球员。一个更好的解决方案是,首先为每个主视图单独设置
JPanel
,然后使用
CardLayout
在它们之间切换。您的
游戏窗口
需要知道要玩多少回合,并且只在游戏结束后切换回上一个/下一个面板achieved@MadProgrammer几个小时前我开始考虑这个办法。但无论是新画面还是同一画面,用户仍然需要与游戏窗口“交互”相同的次数。谢谢你的建议,我会再仔细看一看是的,所以你需要知道玩家想尝试多少次(即3局2胜)。然后每次“回合”你增加一个计数器并检查它,根据回合数和获胜数,你决定做什么。但这是作为
ActionListener
的一部分来完成的,它将成为您的虚拟“循环”sorts@MadProgrammer所以你的意思是,一旦我知道用户想要玩多少回合,我就会把那么多的牌添加到容器中,然后“砰”的一声,同一帧会重复指定的次数?我个人,我将使用单个框架/面板,并在同一实例上简单重复