我有一个纸牌游戏,它是使用ArrayLists在人们手中存储卡片而构建的。我有一个主要的方法来玩游戏并使用在主类中使用InvokeLater调用的线程来更新GUI类
目前我正在控制台上玩游戏并输入并进入扫描仪以从玩家手中选择卡片。我想要做的是运行一个线程,可能是调用和等待,当玩家必须进行选择时运行。然后等待玩家点击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()方法,以便在其余的计算中使用。我无法弄清楚如何做到这一点,特别是等待选择。我听说这可以做到,但我不确定如何在我的工作中实现这一点。如果有人能提供帮助那就太棒了。
答案 0 :(得分:2)
不,你不想在这里暂停线程或任何那种。相反,您将根据用户在程序中的位置更改程序的状态,并且根据他的响应和程序的行为将根据该状态而变化。
例如,如果用户需要等待用户播放卡片,则为主类提供一个currentPlayer变量,并在轮到他时将其分配给用户。然后对程序进行编码,使其不响应任何用户输入,除了适合轮到他人的有效输入。
然后主GameEngine类会将currentPlayer变量推进到下一个玩家并等待他们的回复。
编辑1
你说:
我不确定我真的明白。我已经实现了游戏及其所有规则和AI玩家的对战,我现在在控制台上做。我只需要使用扫描仪进行GUI选择,等待鼠标点击事件。
请理解您正在进行大规模转换,从基于控制台的线性程序转移到基于GUI 事件的程序,关键是新程序是基于事件的。如果您当前的代码是使用性能良好的OOPs类,使用最少的静态变量和方法,以及具有明确定义的类的类,那么转换应该顺利进行。另一方面,如果您当前的代码库只有很少的类,大多数以线性控制台用户界面为中心,您可能需要从头开始重新编写代码。
您可能希望向我们展示您当前的一些代码并描述其设计。
接下来你说:
我如何确保程序不响应除int之外的任何其他内容?
请通过让程序只响应int来澄清你的意思。一个int在哪里?在JTextField?别的地方?我认为这可能需要某种类型的输入验证。
答案 1 :(得分:0)
你想要的是自定义组件上的模态,而这在Swing中是不可能的(至少在没有很多努力实现你自己的模态的情况下)。您的程序应该具有状态并且基于事件,就像@Hovercraft的答案一样。