开发者

Java guessing game

I am trying to write a program in Java that takes a random number from 1-1000 and then as the guess it the background color changes to blue(cold) or red(warm) if they are in the number. I am new to java GUI, but I think the rest of the logic is right, not sure. It compiles, but the guess button doesn't work. Any guidance will be appreciated.

package guessGame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.color.*;
import java.util.Random;


import java.util.Random;
import java.util.logging.FileHandler;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class GuessGame extends JFrame
{
    private JFrame mainFrame;
    private JButton GuessButton;
    private JButton QuitButton;
    private JLabel prompt1, prompt2;
    private JTextField userInput;
    private JLabel comment = new JLabel("What is your destiny?");
    private JLabel comment2 = new JLabel (" ");
    //private int number, guessCount;
    //private int lastGuess;
    private int randomNumber;
    private Color background;


    public GuessGame()
    {
        mainFrame = new JFrame ("Guessing Game!");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Creates components
        GuessButton = new JButton("Guess");
        QuitButton  = new JButton("Quit");
        prompt1 = new JLabel("I have a number between 1 and 1000.");
        prompt2 = new JLabel("Can you guess my number? Enter your Guess:");
        comment = new JLabel ("What is your destiny?");
        comment2 = new JLabel (" ");
        userInput = new JTextField(5);
        //userInput.addActionListener(new GuessHandler());

        //content pane
        Container c = mainFrame.getContentPane();
        c.setLayout(new FlowLayout());

        //adding component to the pane
        c.add(prompt1);
        c.add(prompt2);
        c.add(userInput);
        c.add(comment2);
        c.add(GuessButton);
        c.add(QuitButton);
        c.add(comment);

        GuessButton.setMnemonic('G');
        QuitButton.setMnemonic('Q');

        mainFrame.setSize(300,200);
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);
        mainFrame.setResizable(false);

        // define and register window event handler
    //  mainFrame.addWindowListener(new WindowAdapter() {
    //      public void windowClosing(WindowEvent e) 
    //      { System.exit(0); }
    //  });

        //creating the handler
        GuessButtonHandler ghandler = new GuessButtonHandler(); //instantiate new object
        GuessButton.addActionListener(ghandler); // add event listener

        QuitButtonHandler qhandler = new QuitButtonHandler(); 
        QuitButton.addActionListener(qhandler); 



    }

    public void paint (Graphics g)
    {
        super.paint(g);
        setBackground(background);
    }

    class QuitButtonHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            System.exit(0);
        }
    }

    class GuessButtonHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            int getUserInput=0;
            int diff;
            int Difference;
            randomNumber = new Random().nextInt(1001);
            try {
                getUserInput = Integer.parseInt(
                        userInput.getText().trim());
            } catch (NumberFormatException ex){
                comment.setText("Enter a VALID number!");
                return;
            }
            if (getUserInput == randomNumber){
                JOptionPane.showMessageDialog(null, "CONGRATULATIONS! You got it!!",
                        "Random Number: " + randomNum开发者_运维问答ber, 
                        JOptionPane.INFORMATION_MESSAGE);
                randomNumber = new Random().nextInt(1000) + 1;
                return;
            }
            if (getUserInput > randomNumber){
                comment.setText( "Too High. Try a lower number." );
                diff=getUserInput - randomNumber;
                Difference=Math.abs(diff);
            } else {
                comment.setText( "Too Low. Try a higher number." );
                diff=randomNumber - getUserInput;
                Difference=Math.abs(diff);
            }

            if(Difference<=25){
                comment2.setText("Cold");
                setBackgroundColor(Color.blue);
            }

            if(Difference<=10){
                comment2.setText("Warm");
                setBackgroundColor(Color.red);
            }

            else {
            }
        }
        private void setBackgroundColor(Color color) {
               setBackgroundColor(color);
            }
    }


    public static void main(String args[]) {
        //instantiate gueesgame object
        GuessGame app = new GuessGame();

    }
}


The colors aren't changing because your setBackgroundColor always uses Color.black. Change it to:

private void setBackgroundColor(Color color) {
   setBackground(color);
}

As for the number always being zero. You do not instantiate the randomNumber field. Add this to your constructor:

randomNumber = new Random().nextInt(1001);

Another problem I noticed was you added a window listener to ensure the program exits when you close the window. This is implemented in JFrame. In the constructor add:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Instead of using the deprecated method:

mainFrame.show();

use the not deprecated:

mainFrame.setVisible(true);

Furthermore you have a field, which is never queried:

private Color background;

It's best to do the logic before connecting it to the gui. It's a lot easier to test and find the worst bugs.

Refactored code:

  import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.util.Random;

  public class GuessGame extends JFrame {
     private JTextField userInput;
     private JLabel comment = new JLabel("What is your destiny?");
     private JLabel comment2 = new JLabel(" ");

     private int randomNumber;

     public GuessGame() {
        super("Guessing Game!");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Creates components
        JButton guessButton = new JButton("Guess");
        JButton quitButton = new JButton("Quit");
        JLabel prompt1 = new JLabel("I have a number between 1 and 1000.");
        JLabel prompt2 = new JLabel("Can you guess my number? Enter your Guess:");

        comment = new JLabel("What is your destiny?");
        comment2 = new JLabel(" ");
        userInput = new JTextField(5);

        //content pane
        Container c = getContentPane();
        setLayout(new FlowLayout());

        //adding component to the pane
        c.add(prompt1);
        c.add(prompt2);
        c.add(userInput);
        c.add(comment2);
        c.add(guessButton);
        c.add(quitButton);
        c.add(comment);

        guessButton.setMnemonic('G');
        quitButton.setMnemonic('Q');

        setSize(300, 200);
        setLocationRelativeTo(null);
        setVisible(true);
        setResizable(false);

        initializeNumber();

        //creating the handler
        GuessButtonHandler ghandler = new GuessButtonHandler(); //instantiate new object
        guessButton.addActionListener(ghandler); // add event listener

        QuitButtonHandler qhandler = new QuitButtonHandler();
        quitButton.addActionListener(qhandler);
     }

     private void initializeNumber() {
        randomNumber = new Random().nextInt(1000) + 1;
     }

     class QuitButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
           System.exit(0);
        }
     }

     class GuessButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
           int getUserInput;
           int diff;
           int Difference;
           try {
              getUserInput = Integer.parseInt(userInput.getText().trim());
              if (getUserInput == randomNumber) {
                 JOptionPane.showMessageDialog(null, "CONGRATULATIONS! You got it!!",
                         "Random Number: " + randomNumber,
                         JOptionPane.INFORMATION_MESSAGE);
                 initializeNumber();
                 return;
              }
              if (getUserInput > randomNumber) {
                 comment.setText("Too High. Try a lower number.");
                 diff = getUserInput - randomNumber;
                 Difference = Math.abs(diff);
              } else {
                 comment.setText("Too Low. Try a higher number.");
                 diff = randomNumber - getUserInput;
                 Difference = Math.abs(diff);
              }

              if (Difference <= 25) {
                 comment2.setText("Cold");
                 GuessGame.this.setBackgroundColor(Color.blue);
              }

              if (Difference <= 10) {
                 comment2.setText("Warm");
                 GuessGame.this.setBackgroundColor(Color.red);
              }
           } catch (NumberFormatException ex) {
              comment.setText("Enter a VALID number!");
           }
        }


     }

     private void setBackgroundColor(Color color) {
        getContentPane().setBackground(color);
     }

     public static void main(String args[]) {
        //instantiate gueesgame object
        GuessGame app = new GuessGame();

     }
  }


You have more Swing components than you need, and you seem to be adding one set to the frame while manipulating another set. For example, you have two JTextFields, fieldBox and userInput. You add userInput to the frame, but check fieldBox for input in the Guess button handler. Since fieldBox is always empty, the NumberFormatException is caught by your exception handler (which should really just catch NumberFormatException, not Exception), and comment is updated with "Enter a VALID number!". However, just like with the double text area, comment isn't actually added to the frame, prompt1 and prompt2 are, so you can't see the change


I would write your logic without a UI first and test it until it was 100% correct. Just use a command line, text UI at first. Once that's done, put a GUI in front of it. It'll help to isolate your problems: once the text-driven logic is right, you'll know that future problems are due to UI.

It makes your MVC separation cleaner as well.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜