JAVA。打印骰子卷的gui

时间:2012-03-05 02:12:24

标签: java swing user-interface random

我正在用骰子掷骰子。我得到了我想要的号码(随机int 1-6),但我想要显示的图像没有显示。它第一次显示正确的图像,但从不更改它。这是代码:

public void layoutComponents()
{
     Container container = frame.getContentPane();
     container.setLayout(new GridLayout(1, 1));
     diceRoll.setEditable(true);
     container.add(button);
     container.add(addPanel());
     //container.add(diceRoll);
     frame.setSize(200, 200);
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

class DiceActions implements ActionListener
{
     @Override
     public void actionPerformed(ActionEvent e)
     {
         layoutComponents();
         //diceRoll.append(Double.toString((int)numberRolled));
     }

}

public ImageIcon rollDice()
{
     double numberRolled = (int)(Math.random() * 10 + 1);
     ImageIcon image = dice1;
     if (numberRolled > 6)
     {
         numberRolled -= 4;
     }
     if(numberRolled == 1)
     {
         image = dice1;
         System.out.println("1");
         System.out.println(numberRolled);
         return image = dice1;
     }
     else if(numberRolled == 2)
     {
         image = dice2;
         System.out.println("2");
         return image = dice2;
     }
     else if(numberRolled == 3)
     {
         image = dice3;
         System.out.println("3");
         return image = dice3;
     }
     else if(numberRolled == 4)
     {
         image = dice4;
         System.out.println("4");
         return image = dice4;
     }
     else if(numberRolled == 5)
     {
         image = dice5;
         System.out.println("5");
         return image = dice5;
     }
     else if(numberRolled == 6)
     {
         image = dice6;
         System.out.println("6");
         return image = dice6;
     }
     else
         System.out.println("never reached");
     System.out.println(numberRolled);
     return image;
}

public JPanel addPanel()
{
     JPanel panel = new JPanel();
     panel.add(new JLabel(rollDice()));
     return panel;
}

public void addListeners()
{
     DiceActions action = new DiceActions();
     button.addActionListener(action);
}

2 个答案:

答案 0 :(得分:1)

  

double numberRolled = (int)(Math.random() * 10 + 1);

我不确定它(我的意思是,JVM如何处理它),但它可能会导致一些舍入问题,从而导致==运算符给出错误。你已经将它强制转换为int,那么为什么不将它存储为int呢?

  

return image = dice1;return image = dice2;等等......

为什么不简单地“返回diceX;”?无需拥有本地ImageIcon变量。它可以在Java中工作,因为它仍然带有C语义的=运算符,但是如果你不打算这样做会吐出意想不到的结果。

答案 1 :(得分:0)

double numberRolled = (int)(Math.random() * 10 + 1);
ImageIcon image = dice1;
if (numberRolled > 6)
{
    numberRolled -= 4;
}

此代码无法生成uniformly random numbers。 任何使用您的代码玩游戏的人都会很快了解到结果 不是随机的。

我通过Lindent运行此代码,以使其可以容忍阅读和拍摄 中间的一些代码;只需注意一般流程 事情:

ImageIcon image = dice1;

if (numberRolled > 6) {
    numberRolled -= 4;
}
if (numberRolled == 1) {
    image = dice1;
    System.out.println("1");
    System.out.println(numberRolled);
    return image = dice1;
}
/* ... */
else if (numberRolled == 6) {
    image = dice6;
    System.out.println("6");
    return image = dice6;
} else
    System.out.println("never reached");

System.out.println(numberRolled);
return image;

请注意,您已将image初始化为dice1。这可能是一个 糟糕的主意,因为它使查找错误更加困难。代替, 将其初始化为null,这样你的其他代码就会死得很惨 死亡(NullPointerException)如果其余代码没有设置 正确的价值。

但扔掉整件事;你想要做的是使用数组 存储模具图像和值之间的关系。这将是 代码的1/6,减少错误,更容易扩展到十,十二或 二十面死。