0

我有一个纸牌游戏,它是建立在使用 ArrayLists 将纸牌存储在人们手中的基础上的。我有一个 main 方法,它通过游戏播放并使用主类中的 InvokeLater 调用的线程更新 GUI 类

目前我正在控制台上玩游戏,并输入和 int 到扫描仪中以从玩家手中选择卡片。我想要做的是运行一个线程,可能带有调用和等待,当玩家必须做出选择时运行。然后等待玩家在 GUI 中点击对应的卡片,并返回卡片所在位置的相应 int。然后这个选择由我的游戏处理。

我现在如何更新我的 GUI。

      public static void Play(ArrayList<Card> ...){
        UpdateHand(player1, deck, deckused);

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUI.getInstance().UpdateHand();

            }
        });

将侦听器附加到卡片并将其名称设置为他们手中相应位置的 int。

   public void PlayerSelection()
    {
        selection = -1;
        Information = new JLabel("Please Select Your Card");
        ButtonDisplay.add(Information);
        ButtonDisplay.updateUI();
        for (int i = 0; i < (HumanHand.size()); i++)
           {
               Card card = HumanHand.get(i);

               BufferedImage cardImage = null;

                try {

                    cardImage = ImageIO.read(new File("card/" + card + ".jpg"));
                    } catch (IOException e) {
            // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    JLabel picLabel = new JLabel(new ImageIcon( cardImage ));
                    String name = "" + i;
                    picLabel.setName(name);
                    picLabel.addMouseListener((MouseListener) this);
                    HumanHandDisplay.add(picLabel);
           }
    }   

单击鼠标时存储 int 以供选择。

    public void mouseClicked(MouseEvent e) {
        String name = ((JLabel)e.getSource()).getName();
        System.out.println("Working " + name);
        selection = Integer.parseInt(name);         
    }

我想将此 int 返回到我的主类 Play() 方法以用于其余的计算。我无法弄清楚如何做到这一点,特别是等待做出选择。我听说可以做到这一点,但我不确定如何在我的工作中实现这一点。如果有人可以提供帮助,那就太好了。

4

2 回答 2

2

不,您不想在这里暂停线程或任何此类。相反,您将根据用户在程序中的位置更改程序的状态,并根据他的响应和程序的行为将根据该状态而有所不同。

例如,如果用户需要等待用户出牌,则给主类一个 currentPlayer 变量,并在轮到用户时将其分配给用户。然后对程序进行编码,使其不响应任何用户输入,除了适合轮到他的有效输入。

然后主 GameEngine 类将 currentPlayer 变量推进到下一个玩家并等待他们的响应。

编辑 1
您声明:

我不确定我是否真的明白。我已经实现了游戏以及它的所有规则和 AI 玩家进行对抗,我现在在控制台上这样做。我只需要将使用扫描仪进行选择的位置扩展到 GUI 以等待 Mouse Clicked 事件。

请理解,您正在进行大规模的转换,从基于控制台的线性程序转移到基于 GUI事件的程序,关键是新程序是基于事件的。如果您当前的代码是使用行为良好的符合 OOP 的类编写的,具有最少的静态变量和方法,以及具有良好定义状态的类,那么转换应该会顺利进行。另一方面,如果您当前的代码库只有几个类,大部分集中在线性控制台用户界面上,您可能需要从头开始重新编写代码。

您可能希望向我们展示您当前的一些代码并描述其设计。

接下来你说:

我将如何确保程序不响应除 int 以外的任何内容?

请通过让程序仅响应 int 来澄清您的意思。一个 int 在哪里?在 JTextField 中?别的地方?我认为这可能需要某种类型的输入验证。

于 2012-04-16T01:39:14.503 回答
0

您想要的是自定义组件上的模态,而这在 Swing 中是不可能的(至少在没有大量努力实现您自己的模态的情况下是不可能的)。您的程序应该有状态并且是基于事件的,就像@Hovercraft 的回答一样。

于 2012-04-16T08:11:38.803 回答