-1

私はJavaオブジェクト指向プログラミングのマスターマインドゲームに取り組んでおり、コードの一部を除いてすべてが機能しています。

    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);
        }

上記のコード^^は私の問題がどこにあるかを示しているので、完全なコードを追加していますが、元の完全なコードを調べない限り、なぜそれが想定どおりに機能しないのか理解できません。はい、読み通すのに1、2分かかる場合がありますが、目前の問題には役立ちます。オーディオ部分をコメントアウトして、アイコンを変更できます。実行すると、すべてが正しいと推測するまでコンピュータの推測は表示されませんが、それが問題です。あなたがそれを正しく推測したとしても、あなたが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

あなたが説明する問題は、別個の参照を比較することによって引き起こされます。

配列は次のcompGuessように初期化されます(ソースコード全体に分散されますが、基本的にはそのようなものです)。

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

つまり、を作成しJButton、新しく作成ImageIconしたものをそのボタンに割り当てます。

一方、uG私たちはコードを持っています

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

つまり、ボタンを再度作成し、そのインスタンスに別のインスタンスを割り当てますImageIcon

だからあなたが比較するとき

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

実際には、アイコンインスタンスを比較します。これらは独立して作成されているため、常に一致することはなく、常に別個のオブジェクトです。

この問題を修正するには、個別のアイコンを1回作成し、それをすべてのコンポーネントで共有/再利用します。しかし、私は別の方法を好み、表現(アイコン)を基になるデータモデルから分離し、両方とも適切な(ビューに依存しない)データ型(たとえばenum DiskColor { RED, BLUE, GREEN, YELLOW };)で保存しました。これは簡単に比較できるだけでなく、ビュー表現に変換することもできます。

于 2012-06-07T16:47:16.733 に答える
-1

次のようなものを入れてください:

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

番号が正しく推測されたことをユーザーに示すコード。問題は、デーモン以外のスレッドがバックグラウンドで実行されており、プログラムを終了するように指定していないことだと思います。

于 2012-06-07T09:01:23.797 に答える