简体   繁体   中英

Java Craps Applet GUI Trouble

I'm having a difficult time understanding where and when to repaint() in my Craps game. I understand that after every instance of an event, like when Start Game or Roll Dice is selected, I need to put repaint() . However when I change the string output from "" to "You've Won!!" in each case and then reprint, the app does not recognize it. I have scanned the site for possible remedies, but cannot find anything like what I'm trying to do, as I'm using .gif's for the dice images and am writing an applet, thus I cannot just sysout in a main method. Any and all criticism is of course welcome, I can handle the heat..

What I have so far:

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

Seems your problem in next: in init() method you declare local variables:

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

and add ActionListener to them, but in your actionPerformed(ActionEvent e) method you compare source with null :

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

here : rollButton == null and startButton == null , because of that, your if statement never execute, only else statement.

Declare your buttons in init() method like next:

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

I think it helps you.

Also read about variables in java.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM