Java崩溃Applet GUI故障



我很难理解在Craps游戏中repaint()的位置和时间。我知道,在每次事件发生后,比如选择"开始游戏"或"掷骰子"时,我都需要放入repaint()。然而,当我在每种情况下都将字符串输出从"更改为"You have Won。任何批评当然都是受欢迎的,我能应付得住。。

到目前为止我所拥有的:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.*;
import java.util.Random;
public class Craps extends JApplet implements ActionListener {
Random gen = new Random();
// constant variables for game status
final int WON = 0, loss = 1, CONTINUE = 2;
// other variables used
boolean firstRoll = true; // true if first roll of dice
int diceSum = 1; // sum of the dice
int aPoint = 1; // point if no win/loss on first roll
int stillGame = CONTINUE; // game not over yet
int dice1 = gen.nextInt(6) + 1;
int dice2 = gen.nextInt(6) + 1;
int diceSec, dice2Sec;
int Horizon = gen.nextInt(260) + 25;
int secHorizon = gen.nextInt(260) + 25;
int Vertical = gen.nextInt(150) + 40;
int SecVerto = gen.nextInt(150) + 40;
Image[] dice = new Image[6];
int Low = 35, High = 335;
int Up = 50, Down = 250;
int wins = 0;
String s1 = "";
// GUI
JButton rollButton, startButton;
public void init() {
    Button rollButton = new Button("Roll Dice");
    Button startButton = new Button("Start Game");
    setSize(400, 400);
    setLayout(null);
    for (int i = 0; i < 6; i++) {
        dice[i] = getImage(getCodeBase(), "dice" + (i + 1) + ".gif");
    }
    // create button to start the game
    startButton.setBounds(40, 300, 100, 20);
    add(startButton);
    startButton.addActionListener(this);
    startButton.setEnabled(true);
    // create button to roll dice
    rollButton.setBounds(230, 300, 100, 20);
    add(rollButton);
    rollButton.addActionListener(this);
    rollButton.setEnabled(true);
} // end of init
public void paint(Graphics g) {
    super.paint(g);
    // draw craps table
    g.setColor(Color.red);
    g.fillRect(1, 1, 400, 400);
    // draw playing field
    g.setColor(Color.green);
    g.fillRoundRect(25, 40, 310, 210, 75, 75);
    // paint the images of the dice
    g.drawImage(dice[dice1 - 1], Horizon, Vertical, 32, 32, this);
    g.drawImage(dice[dice2 - 1], secHorizon, SecVerto, 32, 32, this);
    g.setColor(Color.black);
    g.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 22));
    g.drawString(s1, 33, 280);
}
public void actionPerformed(ActionEvent e) {
    // first roll of dice
    Horizon = gen.nextInt(260) + 25;
    secHorizon = gen.nextInt(260) + 25;
    Vertical = gen.nextInt(150) + 40;
    SecVerto = gen.nextInt(150) + 40;
    if (e.getSource() == rollButton) {
//          while (stillGame == CONTINUE) {
            if (firstRoll) {
                diceSum = diceRoller(); // roll dice
                // repaint();
                switch (diceSum) {
                // user victory on first roll
                case 7:
                case 11:
                    stillGame = WON;
                    s1 = "You Win";
                    wins++;
                    break;
                // user loss on first roll
                case 2:
                case 3:
                case 12:
                    stillGame = loss;
                    s1 = "You Lose";
                    break;
                default:
                    stillGame = CONTINUE;
                    aPoint = diceSum;
                    firstRoll = false;
                    s1 = "The Point is " + aPoint + "";
                    break;
                } // end switch
             // end if (firstRoll) statement
            repaint();
            }
            else {
                diceSum = diceRoller(); // roll dice
                // determine game status
                if (diceSum == aPoint) // win by making point
                    s1 = "You Win!!";
                else if (diceSum == 7) // lose by rolling seven
                    s1 = "Suck It";
            }
         // end while loop
    } // end if structure body
    // subsequent roll of dice
    else {
        diceSum = diceRoller(); // roll dice
        // determine game status
        if (diceSum == aPoint) { // win by making point
            s1 = "You Win!!";
            stillGame = WON;
        } else if (diceSum == 7) { // lose by rolling seven
            s1 = "You've Lost";
            stillGame = loss;
        }
    }// end else structure
    if (e.getSource() == startButton) {
        s1 = "";
    }
    repaint();
}
// roll dice, calculate sum and display results
public int diceRoller() {
    int sum;
    dice1 = gen.nextInt(6) + 1; // pick random dice values
    dice2 = gen.nextInt(6) + 1;
    sum = dice1 + dice2; // sum die values
    return sum; // return the sum of dice
} // end method rollDice
} // end

下一个问题是:在init()方法中,您声明局部变量:

Button rollButton = new Button("Roll Dice");
Button startButton = new Button("Start Game");

并将ActionListener添加到它们中,但在actionPerformed(ActionEvent e)方法中,您将source与null进行比较:

e.getSource() == rollButton
e.getSource() == startButton

这里:rollButton == nullstartButton == null,因此,您的if语句永远不会执行,只有else语句。

init()方法中声明您的按钮,如下所示:

rollButton = new JButton("Roll Dice");
startButton = new JButton("Start Game");

我认为这对你有帮助。

另请阅读java中的变量。

最新更新