-1

我正在为 Java 面向对象编程开发 Mastermind 游戏,除了代码的一部分之外,我的一切都在工作

    if(uG[0].getIcon() == compGuess[0].getIcon() && uG[1].getIcon() == compGuess[1].getIcon() && uG[2].getIcon() == compGuess[2].getIcon() && uG[3].getIcon() == compGuess[3].getIcon())
        {
            JOptionPane.showMessageDialog(f1, "You have guessed them all coorect!", "Mastermind: Test Your Mind", JOptionPane.INFORMATION_MESSAGE);

            submit.setEnabled(false);

            compGuess[0].setEnabled(false);
            compGuess[1].setEnabled(false);
            compGuess[2].setEnabled(false);
            compGuess[3].setEnabled(false);

            compGuess[0].setVisible(true);
            compGuess[1].setVisible(true);
            compGuess[2].setVisible(true);
            compGuess[3].setVisible(true);

            uG[0].setEnabled(false);
            uG[1].setEnabled(false);
            uG[2].setEnabled(false);
            uG[3].setEnabled(false);

            System.exit(0);
        }

我正在添加完整代码,因为上面的代码 ^^ 显示了我的问题所在,但是除非您查看原始完整代码,否则您无法弄清楚为什么它不能按预期方式工作。是的,通读可能需要一两分钟,但这将有助于解决手头的问题。您可以将音频部分注释掉并更改图标。当它运行时,计算机猜测不会显示,直到你猜对了,但这就是问题所在。即使你猜对了,直到你猜了 10 次,游戏才会开始。我无法弄清楚为什么会这样。有人可以帮忙吗?

    import java.awt.*; 
    import java.io.*;
    import javax.swing.*; 
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.sound.sampled.AudioInputStream; 
    import javax.sound.sampled.AudioSystem; 
    import javax.sound.sampled.*;

    public class Mastermind extends JFrame
    {

    public static int found = 0;
    public static int guesses = 0;
    public final JTextField guess = new JTextField(20);
    public static JFormattedTextField nG = new JFormattedTextField();
public Mastermind()
{   

    final JFrame f1 = new JFrame("Mastermind: Can you win?");
    f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //runs a song/midi upon start of the game
    int replys = JOptionPane.showConfirmDialog(f1, "Welcome to Mastermind! \n T he game to test your brain." +
                                                                      "\n\n\nWould you like to play?", "Mastermind: Test Your Brain!", JOptionPane.YES_NO_OPTION);
    if(replys == JOptionPane.YES_OPTION)
    {
        try
        {

            //AudioFormat audioFormat;
            //AudioInputStream audioInputStream;
            //SourceDataLine sourceDataLine;

            File soundFile = new File("swfinal.mid");
                            AudioInputStream ai =      AudioSystem.getAudioInputStream(soundFile);
            Clip clip = AudioSystem.getClip();
            clip.open(ai);
            clip.start();
        }
        catch (Exception f)
        {}
    }
    else
    {
        System.exit(0);
    }

    //makes the panel to display the computer's guess
    final JPanel gamePanel = new JPanel(new GridLayout(1,4,5,5));
    f1.add(gamePanel);
    gamePanel.setBorder(BorderFactory.createMatteBorder(5,5,5,5, Color.GREEN));
    gamePanel.setBackground(Color.BLACK);   

    //the rules on how to play
    JOptionPane.showMessageDialog(f1, "Welcome to Mastermind! \n The game to test your brain.", "Mastermind: Test Your Brain!", JOptionPane.INFORMATION_MESSAGE);
    JOptionPane.showMessageDialog(f1, "You have to guess what color is behind the circle the White cirlce" +
                                                     "\n This will display on the right side of the f1 for you." +
                                                     "\n Your guesses will display on the left side of the f1 for you." +
                                                     "\n You have 10 attempts at getting it correct" +
                                                     "after all 10 attmepts are done \nand you did not guess correctly, the game will end." +
                                                     "\n\n\n Now, good luck on Mastermind. May you have a very fun time!", "Mastermind Rules", J   OptionPane.ERROR_MESSAGE);


    //makes the panel to display the heading
    final JPanel Gs = new JPanel();
    f1.add(Gs);
    Gs.setBorder(BorderFactory.createMatteBorder(5,5,5,5, Color.GREEN));
    Gs.setBackground(Color.BLACK);

    //makes the panel where you control everything
    final JPanel p2 = new JPanel();
    f1.add(p2);
    p2.setBorder(BorderFactory.createMatteBorder(5,5,5,5, Color.GREEN));
    p2.setBackground(Color.BLACK);

    final JLabel line = new JLabel("");
    p2.add(line);
    line.setForeground(Color.GREEN);

    //creates the submit button 
    final JButton submit = new JButton("Submit");
    p2.add(submit);

    //adds a text field to display the number of guesses
    final JFormattedTextField tf1 = new JFormattedTextField();
    p2.add(tf1);
    tf1.setColumns(2);
    tf1.setEditable(false);
    tf1.setForeground(Color.RED);
    tf1.setValue(new Integer(guesses));

    JLabel here = new JLabel("Take a guess: ");
            p2.add(here);
    here.setForeground(Color.GREEN);

    final JLabel master = new JLabel("MASTERMIND: TEST YOUR MIND!");
    master.setForeground(Color.green);
    Font newf = new Font("SansSerif", Font.BOLD + Font.ITALIC, 32);
    master.setFont(newf);
    Gs.add(master);

    //add and initializes the computers guess buttons
    //and its guesses
    final String[] colored = new String[4];
    colored[0] = "circle-red.png";
    colored[1] = "circle-blue.png";
    colored[2] = "circle-green.png";
    colored[3] = "circle-yellow.png";

    final JButton[] compGuess = new JButton[4];
    compGuess[0] = new JButton();
    compGuess[1] = new JButton();
    compGuess[2] = new JButton();
    compGuess[3] = new JButton();

    gamePanel.add(compGuess[0]);
    gamePanel.add(compGuess[1]);
    gamePanel.add(compGuess[2]);
    gamePanel.add(compGuess[3]);

    compGuess[0].setVisible(false);
    compGuess[1].setVisible(false);
    compGuess[2].setVisible(false);
    compGuess[3].setVisible(false);

    final String[] colored2 = new String[4];
    final int[] checkFilled = new int[4];
    for(int fill = 0; fill < 4; fill++)
    {
        checkFilled[fill] = 0;
    }
    int counter = 0;
    do
    {
        int Random = (int)(Math.random()*4);

        if(checkFilled[Random] == 0)
        {
            colored2[counter] = colored[Random];
            checkFilled[Random] = 1;
            counter++;
        }
    }
    while(counter < 4);

    final ImageIcon cell1 = new ImageIcon(colored2[0]);
    final ImageIcon cell2 = new ImageIcon(colored2[1]);
    final ImageIcon cell3 = new ImageIcon(colored2[2]);
    final ImageIcon cell4 = new ImageIcon(colored2[3]);

    compGuess[0].setIcon(cell1);
    compGuess[1].setIcon(cell2);
    compGuess[2].setIcon(cell3);
    compGuess[3].setIcon(cell4);

    //adding a label to tell user where their guessing at
    JLabel user = new JLabel("Your Guess: ");
    user.setForeground(Color.green);
    p2.add(user);

    //adding your guessing buttons
    final JButton[] uG = new JButton[4];
    uG[0] = new JButton();
    uG[1] = new JButton();
    uG[2] = new JButton();
    uG[3] = new JButton();

    p2.add(uG[0]);
    p2.add(uG[1]);
    p2.add(uG[2]);
    p2.add(uG[3]);

    //This is the mouse event handler that make it change colors
    //to the corresponding color that you want with the click of
    //the mouse on the button
    uG[0].addMouseListener(new MouseListener()
    {
        @Override
                    public void mouseClicked(MouseEvent e) 
        {
            if(e.getClickCount() == 1)
            {
                uG[0].setIcon(new ImageIcon("circle-red.png"));
            }
            else if(e.getClickCount() == 2)
            {
                uG[0].setIcon(new ImageIcon("circle-blue.png"));
            }
            else if(e.getClickCount() == 3)
            {
                uG[0].setIcon(new ImageIcon("circle-green.png"));
            }
            else if(e.getClickCount() == 4)
            {
                uG[0].setIcon(new ImageIcon("circle-yellow.png"));
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) { }

        @Override
        public void mouseEntered(MouseEvent e) {}

        @Override
        public void mouseExited(MouseEvent e) {}
    });

    uG[1].addMouseListener(new MouseListener()
    {
        @Override
                    public void mouseClicked(MouseEvent e) 
        {
            if(e.getClickCount() == 1)
            {
                uG[1].setIcon(new ImageIcon("circle-red.png"));
            }
            else if(e.getClickCount() == 2)
            {
                uG[1].setIcon(new ImageIcon("circle-blue.png"));
            }
            else if(e.getClickCount() == 3)
            {
                uG[1].setIcon(new ImageIcon("circle-green.png"));
            }
            else if(e.getClickCount() == 4)
            {
                uG[1].setIcon(new ImageIcon("circle-yellow.png"));
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) { }

        @Override
        public void mouseEntered(MouseEvent e) {}

        @Override
        public void mouseExited(MouseEvent e) {}
    });

    uG[2].addMouseListener(new MouseListener()
    {
        @Override
                    public void mouseClicked(MouseEvent e) 
        {
            if(e.getClickCount() == 1)
            {
                uG[2].setIcon(new ImageIcon("circle-red.png"));
            }
            else if(e.getClickCount() == 2)
            {
                uG[2].setIcon(new ImageIcon("circle-blue.png"));
            }
            else if(e.getClickCount() == 3)
            {
                uG[2].setIcon(new ImageIcon("circle-green.png"));
            }
            else if(e.getClickCount() == 4)
            {
                uG[2].setIcon(new ImageIcon("circle-yellow.png"));
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) { }

        @Override
        public void mouseEntered(MouseEvent e) {}

        @Override
        public void mouseExited(MouseEvent e) {}
    });

    uG[3].addMouseListener(new MouseListener()
    {       
                    @Override
        public void mouseClicked(MouseEvent e) 
        {
            if(e.getClickCount() == 1)
            {
                uG[3].setIcon(new ImageIcon("circle-red.png"));
            }
            else if(e.getClickCount() == 2)
            {
                uG[3].setIcon(new ImageIcon("circle-blue.png"));
            }
            else if(e.getClickCount() == 3)
            {
                uG[3].setIcon(new ImageIcon("circle-green.png"));
            }
            else if(e.getClickCount() == 4)
            {
                uG[3].setIcon(new ImageIcon("circle-yellow.png"));
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) { }

        @Override
        public void mouseEntered(MouseEvent e) {}

        @Override
        public void mouseExited(MouseEvent e) {}
    });

    submit.addMouseListener(new MouseListener()
    {

    @Override
public void mouseClicked(MouseEvent e)
{   
    if(e.getSource() == submit)
    {
        int s = 0;

        System.out.println(uG[0].getIcon());
        System.out.println(uG[1].getIcon());
        System.out.println(uG[2].getIcon());
        System.out.println(uG[3].getIcon());
        System.out.println(compGuess[0].getIcon());
        System.out.println(compGuess[1].getIcon());
        System.out.println(compGuess[2].getIcon());
        System.out.println(compGuess[3].getIcon());

        if(uG[0].getIcon() == compGuess[0].getIcon() && uG[1].getIcon() == compGuess[1].getIcon() && uG[2].getIcon() == compGuess[2].getIcon() && uG[3].getIcon() == compGuess[3].getIcon())
        {
            JOptionPane.showMessageDialog(f1, "You have guessed them all coorect!", "Mastermind: Test Your Mind", JOptionPane.INFORMATION_MESSAGE);
            submit.setEnabled(false);
            compGuess[0].setEnabled(false);
            compGuess[1].setEnabled(false);
            compGuess[2].setEnabled(false);
            compGuess[3].setEnabled(false);
            uG[0].setEnabled(false);
            uG[1].setEnabled(false);
            uG[2].setEnabled(false);
            uG[3].setEnabled(false);
        }
        else
        {   
            JOptionPane.showMessageDialog(f1, "Please try again!", "Mastermind: Test Your Mind", JOptionPane.INFORMATION_MESSAGE);
        }


        guesses++;
        tf1.setValue(new Integer(guesses));

        if(guesses == 10)
        {
            JOptionPane.showMessageDialog(f1, "Thank you for playing! \n\n\n Have a wonderful day.", "Mastermind: Test Your Mind", JOptionPane.INFORMATION_MESSAGE);
            System.exit(0);
        }

        int x = 0;
        int y = 0;

        if(uG[0].getIcon() == compGuess[0].getIcon())
        {
            x = x + 1;
        }
        if(uG[1].getIcon() == compGuess[1].getIcon())
        {
            x = x + 1;
        }
        if(uG[2].getIcon() == compGuess[2].getIcon())
        {
            x = x + 1;
        }
        if(uG[3].getIcon() == compGuess[2].getIcon())
        {
            x = x + 1;
        }

        if(uG[0].getIcon() != compGuess[0].getIcon())
        {
            y = y + 1;
        }
        if(uG[1].getIcon() != compGuess[1].getIcon())
        {
            y = y + 1;
        }
        if(uG[2].getIcon() != compGuess[2].getIcon())
        {
            y = y + 1;
        }
        if(uG[3].getIcon()!= compGuess[2].getIcon())
        {
            y = y + 1;
        }

        JOptionPane.showMessageDialog(f1, "You have " + x + " colors correct and in the right position."+
                                                     "\nYou have " + y + " colors correct but in the wrong position.", "Mastermind: Test Your      Mind", JOptionPane.INFORMATION_MESSAGE);
    }
}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}

    });
    //set the component of the game on the f1
    //and also sets the size of the fame and makes
    // its visible to the user
    f1.add(Gs, BorderLayout.NORTH);
    f1.add(gamePanel, BorderLayout.CENTER);
    f1.add(p2, BorderLayout.SOUTH);
    f1.setSize(650, 350);
    f1.setVisible(true);
    f1.setResizable(false);
    f1.setLocationRelativeTo(null);
}

public static void main(String[] args)
{
    Mastermind mastermind = new Mastermind();
}   
    }

提前感谢杰伊!

4

2 回答 2

0

The problem you describe is caused by comparing distinct references.

The compGuess array is initialized by something like (distributed accross your sorce code, but basically it's like that):

// colored2[0] contains filename
final ImageIcon cell1 = new ImageIcon(colored2[0]);  
compGuess[0] = new JButton();
compGuess[0].setIcon(cell1);

i.e. you create a JButton and assign a newly created ImageIcon to that button.

On the other hand for uG we have the code

uG[0] = new JButton();
uG[0].setIcon(new ImageIcon("circle-red.png"));    // inside mouse listener

which means you again create a button and assign another instance of ImageIcon to that one.

So when you compare

uG[0].getIcon() == compGuess[0].getIcon()

you actually compare the icon instances which of course never match since they were created independently and are thus always distinct objects.

To fix this issue you may create each distinct icon once and share/reuse it for all your components. But I'd prefer a different way and separate the representation (icons) from the underlying data model and have both stored with a suitable (view-independent) data type (e.g. enum DiskColor { RED, BLUE, GREEN, YELLOW };) which you can easily compare but also transform into your view representation.

于 2012-06-07T16:47:16.733 回答
-1

Put something like:

Thread.sleep(1000);
System.exit(0);

On the code that shows the user that the number was guessed correctly. I think the problem is that there are not-daemon threads running on the background and you don't specify that you want the program to end.

于 2012-06-07T09:01:23.797 回答