记忆游戏得分

时间:2011-10-30 17:59:48

标签: java swing user-interface

我创造了一个记忆游戏。 我想要添加一个得分系统,所以每次玩家选择一对匹配时他们会得到一个打击,但如果他们没有,他们会得到一个错过。它已经具有记忆游戏的基本功能,你选择一张卡,然后另一张卡,如果它们匹配,它们都被移除,如果不是,它们都会再次转回。

如何显示当前分数?我为点击和未命中添加了2个整数计数器,但它似乎没有更新。

这是我的代码:

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

public class MemoryGame extends JFrame implements ActionListener {  

    private JFrame window = new JFrame("Memory Game");
    private static final int WINDOW_WIDTH = 500; // pixels
    private static final int WINDOW_HEIGHT = 500; // pixels
    private JButton exitBtn, replayBtn, solveBtn;  
    ImageIcon ButtonIcon = createImageIcon("card.jpg");
    private JButton[] gameBtn = new JButton[16]; 
    private ArrayList<Integer> gameList = new ArrayList<Integer>();  
    private int Hit, Miss = 0;
    private int counter = 0;   
    private int[] btnID = new int[2];   
    private int[] btnValue = new int[2];   
    private JLabel HitScore, MissScore;
    private Panel gamePnl = new Panel(); 
    private Panel buttonPnl = new Panel();   
    private Panel scorePnl = new Panel();

    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = MemoryGame.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

    public MemoryGame()
    { 
        createGUI();  
        createpanels();  
        setArrayListText();
        window.setTitle("MemoryGame"); 
        window.setDefaultCloseOperation(EXIT_ON_CLOSE); 
        window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
        window.setVisible(true);   
    }

    public void createGUI() 
    {       
        for (int i = 0; i < gameBtn.length; i++) 
        {      
            gameBtn[i] = new JButton(ButtonIcon);

            gameBtn[i].addActionListener(this); 
        }       
        HitScore = new JLabel("Hit: " + Hit);
        MissScore = new JLabel("Miss: " + Miss);
        exitBtn = new JButton("Exit"); 
        exitBtn.addActionListener(this);
        replayBtn = new JButton("Shuffle");  
        replayBtn.addActionListener(this);
        solveBtn = new JButton("Solve"); 
        solveBtn.addActionListener(this);       
    }    

    public void createpanels()
    {

        gamePnl.setLayout(new GridLayout(4, 4)); 
        for (int i = 0; i < gameBtn.length; i++)
        {            
            gamePnl.add(gameBtn[i]);   
        }         
        buttonPnl.add(replayBtn); 
        buttonPnl.add(exitBtn);
        buttonPnl.add(solveBtn);
        buttonPnl.setLayout(new GridLayout(1, 0));
        scorePnl.add(HitScore);
        scorePnl.add(MissScore);
        scorePnl.setLayout(new GridLayout(1, 0));
        window.add(scorePnl, BorderLayout.NORTH);
        window.add(gamePnl, BorderLayout.CENTER);
        window.add(buttonPnl, BorderLayout.SOUTH);  
    }  

    public void setArrayListText() 
    { 
        for (int i = 0; i < 2; i++) 
        {       
            for (int ii = 1; ii < (gameBtn.length / 2) + 1; ii++) 
            {
                gameList.add(ii);       
            }       
        }  
    } 


    public boolean sameValues() 
    {
        if (btnValue[0] == btnValue[1])
        {  
            return true;    
        }

        return false;    
    }  

    public void actionPerformed(ActionEvent e) 
    {    
            if (exitBtn == e.getSource()) 
            { 
                System.exit(0);        
            } 
            if (replayBtn == e.getSource()) 
            {     
                for (int i = 0; i < gameBtn.length; i++)
                { 
                gamePnl.remove(gameBtn[i]);
                }
                scorePnl.remove(HitScore);
                scorePnl.remove(MissScore);
                buttonPnl.remove(exitBtn);
                buttonPnl.remove(replayBtn);
                buttonPnl.remove(solveBtn);
                window.remove(gamePnl);
                window.remove(scorePnl);
                window.remove(buttonPnl);
                window.remove(window);
                window.add(gamePnl);
                window.add(scorePnl);
                window.add(buttonPnl);
                scorePnl.add(HitScore);
                scorePnl.add(MissScore);
                buttonPnl.add(exitBtn);
                buttonPnl.add(replayBtn);
                buttonPnl.add(solveBtn);
                for (int i = 0; i < gameBtn.length; i++)
                { 
                gamePnl.add(gameBtn[i]);
                }

            }    

            if (solveBtn == e.getSource())
            {   
                for (int i = 0; i < gameBtn.length; i++) 
                { 
                    gameBtn[i].setText("" + gameList.get(i));  
                    gameBtn[btnID[0]].setEnabled(false); 
                    gameBtn[btnID[1]].setEnabled(false);

                }
            }

            for (int i = 0; i < gameBtn.length; i++) 
            {  

                if (gameBtn[i] == e.getSource()) 
                { 
                    gameBtn[i].setText("" + gameList.get(i));   
                    gameBtn[i].setEnabled(false);
                    counter++;     
                    if (counter == 3) 
                    { 
                        if (sameValues()) 
                        {    
                            gameBtn[btnID[0]].setEnabled(false); 
                            gameBtn[btnID[1]].setEnabled(false);
                            gameBtn[btnID[0]].setVisible(false); 
                            gameBtn[btnID[1]].setVisible(false);
                            Hit = Hit +1;
                        } 
                        else 
                        {  
                                gameBtn[btnID[0]].setEnabled(true); 
                                gameBtn[btnID[0]].setText("");
                                gameBtn[btnID[1]].setEnabled(true);
                                gameBtn[btnID[1]].setText("");
                                Miss = Miss +1;
                        }        
                        counter = 1;      
                    }        
                    if (counter == 1) 
                    {       
                        btnID[0] = i;   
                        btnValue[0] = gameList.get(i); 
                    }      
                    if (counter == 2) 
                    { 
                        btnID[1] = i;     
                        btnValue[1] = gameList.get(i);  
                    }          
                }        
            }           
    } 

    public static void main(String[] args)
    {  
        new MemoryGame();   
    }
}

1 个答案:

答案 0 :(得分:2)

也许这会让你朝着正确的方向前进。特别参见5个新的单行注释,其中一个是一个问题。

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;

public class MemoryGame
    // don't extend frame
    /* extends JFrame */
    implements ActionListener {

    // very important!
    public void updateHitMiss() {
        HitScore.setText("Hit: " + Hit);
        MissScore.setText("Miss: " + Miss);
    }

    private JFrame window = new JFrame("Memory Game");
    private static final int WINDOW_WIDTH = 500; // pixels
    private static final int WINDOW_HEIGHT = 500; // pixels
    private JButton exitBtn, replayBtn, solveBtn;
    ImageIcon ButtonIcon = createImageIcon("card.jpg");
    private JButton[] gameBtn = new JButton[16];
    private ArrayList<Integer> gameList = new ArrayList<Integer>();
    private int Hit, Miss = 0;
    private int counter = 0;
    private int[] btnID = new int[2];
    private int[] btnValue = new int[2];
    private JLabel HitScore, MissScore;
    // don't mix Swing with AWT
    private JPanel gamePnl = new JPanel();
    private JPanel buttonPnl = new JPanel();
    private JPanel scorePnl = new JPanel();

    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = MemoryGame.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

    public MemoryGame()
    {
        createGUI();
        createJPanels();
        setArrayListText();
        window.setTitle("MemoryGame");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        window.setVisible(true);
    }

    public void createGUI()
    {
        for (int i = 0; i < gameBtn.length; i++)
        {
            gameBtn[i] = new JButton(ButtonIcon);

            gameBtn[i].addActionListener(this);
        }
        HitScore = new JLabel("Hit: " + Hit);
        MissScore = new JLabel("Miss: " + Miss);
        exitBtn = new JButton("Exit");
        exitBtn.addActionListener(this);
        replayBtn = new JButton("Shuffle");
        replayBtn.addActionListener(this);
        solveBtn = new JButton("Solve");
        solveBtn.addActionListener(this);
    }

    public void createJPanels()
    {

        gamePnl.setLayout(new GridLayout(4, 4));
        for (int i = 0; i < gameBtn.length; i++)
        {
            gamePnl.add(gameBtn[i]);
        }
        buttonPnl.add(replayBtn);
        buttonPnl.add(exitBtn);
        buttonPnl.add(solveBtn);
        buttonPnl.setLayout(new GridLayout(1, 0));
        scorePnl.add(HitScore);
        scorePnl.add(MissScore);
        scorePnl.setLayout(new GridLayout(1, 0));
        window.add(scorePnl, BorderLayout.NORTH);
        window.add(gamePnl, BorderLayout.CENTER);
        window.add(buttonPnl, BorderLayout.SOUTH);
    }

    public void setArrayListText()
    {
        for (int i = 0; i < 2; i++)
        {
            for (int ii = 1; ii < (gameBtn.length / 2) + 1; ii++)
            {
                gameList.add(ii);
            }
        }
    }


    public boolean sameValues()
    {
        if (btnValue[0] == btnValue[1])
        {
            return true;
        }

        return false;
    }

    public void actionPerformed(ActionEvent e)
    {
            if (exitBtn == e.getSource())
            {
                System.exit(0);
            }
            if (replayBtn == e.getSource())
            {
                for (int i = 0; i < gameBtn.length; i++)
                {
                gamePnl.remove(gameBtn[i]);
                }
                // what was all this removing/adding intended to achieve?
                /*
                scorePnl.remove(HitScore);
                scorePnl.remove(MissScore);
                buttonPnl.remove(exitBtn);
                buttonPnl.remove(replayBtn);
                buttonPnl.remove(solveBtn);
                window.remove(gamePnl);
                window.remove(scorePnl);
                window.remove(buttonPnl);
                window.remove(window);
                window.add(gamePnl);
                window.add(scorePnl);
                window.add(buttonPnl);
                scorePnl.add(HitScore);
                scorePnl.add(MissScore);
                buttonPnl.add(exitBtn);
                buttonPnl.add(replayBtn);
                buttonPnl.add(solveBtn);
                */
                for (int i = 0; i < gameBtn.length; i++)
                {
                gamePnl.add(gameBtn[i]);
                }

            }

            if (solveBtn == e.getSource())
            {
                for (int i = 0; i < gameBtn.length; i++)
                {
                    gameBtn[i].setText("" + gameList.get(i));
                    gameBtn[btnID[0]].setEnabled(false);
                    gameBtn[btnID[1]].setEnabled(false);

                }
            }

            for (int i = 0; i < gameBtn.length; i++)
            {

                if (gameBtn[i] == e.getSource())
                {
                    gameBtn[i].setText("" + gameList.get(i));
                    gameBtn[i].setEnabled(false);
                    counter++;
                    if (counter == 3)
                    {
                        if (sameValues())
                        {
                            gameBtn[btnID[0]].setEnabled(false);
                            gameBtn[btnID[1]].setEnabled(false);
                            gameBtn[btnID[0]].setVisible(false);
                            gameBtn[btnID[1]].setVisible(false);
                            Hit = Hit +1;
                        }
                        else
                        {
                                gameBtn[btnID[0]].setEnabled(true);
                                gameBtn[btnID[0]].setText("");
                                gameBtn[btnID[1]].setEnabled(true);
                                gameBtn[btnID[1]].setText("");
                                Miss = Miss +1;
                        }
                        counter = 1;
                    }
                    if (counter == 1)
                    {
                        btnID[0] = i;
                        btnValue[0] = gameList.get(i);
                    }
                    if (counter == 2)
                    {
                        btnID[1] = i;
                        btnValue[1] = gameList.get(i);
                    }
                }
            }
        updateHitMiss();
    }

    public static void main(String[] args)
    {
        // Swing GUIs should be created on the EDT
        new MemoryGame();
    }

}