我正在为我的编程课制作一个掷骰子小程序,但似乎我所做的一切都不对?一旦我单击按钮掷骰子,骰子就会从屏幕上消失,小程序会卡住,不允许我单击任何内容。如果我第一次掷骰子赢了或输了,那么“掷骰子!”按钮被禁用(就像它应该的那样),但是当我单击“开始游戏!”时尽管我可以单击“开始游戏!”,但它不会重新激活。按钮。我不知道如何在整个游戏中保持分值相同。我很迷茫,不知道问题是什么,我所做的一切都不起作用。到目前为止,我对代码感到失望:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class Craps extends JApplet implements ActionListener {
Button button1 = new Button("Start game!");
Button button2 = new Button("Roll dice!");
Random gen = new Random();
int buttonPressed = 0;
int die1 = 0;
int die2 = 0;
int wins = 0;
int losses = 0;
int point = 0;
String result = "";
Image[] dice = new Image[6];
public void init() {
setLayout(null);
setSize(400, 500);
dice[0] = getImage(getCodeBase(), "dice1.gif");
dice[1] = getImage(getCodeBase(), "dice2.gif");
dice[2] = getImage(getCodeBase(), "dice3.gif");
dice[3] = getImage(getCodeBase(), "dice4.gif");
dice[4] = getImage(getCodeBase(), "dice5.gif");
dice[5] = getImage(getCodeBase(), "dice6.gif");
button1.setBounds(50,300,125,20);
button1.addActionListener(this);
add(button1);
button2.setBounds(250,300,125,20);
button2.addActionListener(this);
add(button2);
}
public void paint (Graphics g) {
super.paint(g);
//background
g.setColor(Color.black);
g.fillRect(0, 0, 400, 500);
//table
g.setColor(Color.cyan);
g.fillRoundRect(50, 50, 300, 200, 50, 50);
//dice
g.drawImage(dice[die1], 50+(int)(Math.random()*275), 50+(int)(Math.random()*175), 32, 32, this);
g.drawImage(dice[die2], 50+(int)(Math.random()*275), 50+(int)(Math.random()*175), 32, 32, this);
if (buttonPressed == 2) {
if (die1+die2==0||die1+die2==1||die1+die2==10) {
result = "Sorry, you lose.";
g.drawString(result, 50, 385);
button2.setEnabled(false);
if (buttonPressed == 1) {
add(button2);
}
} else if (die1+die2==5||die1+die2==9) {
result = "Congrats! You win!";
g.drawString(result, 50, 385);
button2.setEnabled(false);
if (buttonPressed == 2) {
add(button2);
}
} else {
while (die1+die2!=0||die1+die2!=1||die1+die2!=5||die1+die2!=9||die1+die2!=10) { //2,3,7,11,12
int point = die1 + die2;
int sum = (die1+die2)+2;
result = "You rolled "+sum+".";
g.drawString(result, 50, 385);
g.drawString("The point is "+((die1+die2)+2)+".", 50, 410);
}
if (die1+die2==5) {
result = "Sorry, you lose.";
g.drawString(result, 50, 385);
}
}
} else if (buttonPressed == 1) {
g.setColor(Color.white);
g.drawString("Roll 'em!", 50, 350);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button1) {
buttonPressed = 1;
}
if (e.getSource() == button2) {
buttonPressed = 2;
die1 = gen.nextInt(6);
die2 = gen.nextInt(6);
}
repaint();
}
}
最佳答案
这是一个无限循环:
while (die1+die2!=0||die1+die2!=1||die1+die2!=5||die1+die2!=9||die1+die2!=10) { //2,3,7,11,12
int point = die1 + die2;
int sum = (die1+die2)+2;
result = "You rolled "+sum+".";
g.drawString(result, 50, 385);
g.drawString("The point is "+((die1+die2)+2)+".", 50, 410);
}
有两个原因。首先,进入循环后永远不会更新 die1
和 die2
的值。
第二个是因为这样的情况:
while ( someValue != 0 || someValue != 1 ) {
永远都是真的。这是因为如果 someValue
是 0
那么它一定不是 1
,反之亦然。看看 while 循环之前的 if/else 结构,我怀疑您的意思是条件是 &&
而不是 ||
。
此外,您不应该在 paint
中执行任何程序逻辑。只会画画。这不仅会减慢绘制速度,而且还会从重绘请求外部调用 paint
。您无法控制代码何时运行。
关于Java Craps 小程序总是崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20415349/