0

我正在为一个大学项目编写二十一点(单线程),而庄家是计算机(例如,没有玩家动作)......

有人知道我如何用 Java 编写这样的程序:

while (dealerpoints < 17)
    open card and repaint frame
    wait 1 sec (to run again the condition test for while)

问题是,我不希望一次绘制所有的庄家牌...

提前致谢, 加布里埃尔·索特罗

更新:这是我的代码(不起作用)

        while (Dealer.getInstance().dealerPoints < 17){

            Dealer.getInstance().openCard();
            try {
                Thread.sleep(100);
            }
            catch (InterruptedException e){ }
        }

开卡声明:

    private void openCard(){

        Card temp;

        temp = Deck.getInstance().myPop();
        Dealer.getInstance().cards.add(temp);
        Dealer.getInstance().dealerPoints += temp.getValue(); 
        MainPanel.getInstance().updateDealerLabel(Dealer.getInstance().dealerPoints);
        MainPanel.getInstance().repaint();

    }
4

3 回答 3

2

您不能阻止事件调度线程,因为它负责(除其他外)处理重新绘制请求。因此,您一直在等待,UI 并没有开始更新。这包括使用循环和Thread#sleep.

一种解决方案是使用SwingWorker,但是,它在何时将更新回调到 UI 方面是不可靠的。

另一种解决方案是使用 a ,它将每n 个javax.swing.Timer周期触发一次回调,并在事件调度线程中执行......

就像是...

Timer dealerTimer= new Timer(1000, new ActionListener() {
    public void actionListener(ActionEvent evt) {
        if (Dealer.getInstance().dealerPoints < 17) {
            Dealer.getInstance().openCard();
        } else {
            ((Timer)evt.getSource()).stop();
        }
    }
});
dealerTimer.setRepeats(true);
dealerTimer.start();

我会做的是声明dealerTimer为一个类字段。需要时,我会简单地打电话dealerTimer.restart()让计时器重新启动。您可能还想检查dealerTimer.isRunning()以确保计时器尚未运行;)

您可能想阅读Swing 中的并发以获取更多信息

于 2012-11-29T03:01:38.673 回答
0

您可以使用:http ://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#sleep(long )。把它放在一个 try-except 块中。

// To wait 1 second:
try {
    Thread.sleep(1000);
} catch (Exception e) {}
于 2012-11-29T02:42:31.320 回答
0

睡一会儿

try {
    Thread.sleep(1000);
}catch (InterruptedException e){
   LOG.warning("unexpected interruption while sleeping");
}
于 2012-11-29T02:42:51.897 回答