我创造了一个记忆游戏。 我想要添加一个得分系统,所以每次玩家选择一对匹配时他们会得到一个打击,但如果他们没有,他们会得到一个错过。它已经具有记忆游戏的基本功能,你选择一张卡,然后另一张卡,如果它们匹配,它们都被移除,如果不是,它们都会再次转回。
如何显示当前分数?我为点击和未命中添加了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();
}
}
答案 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();
}
}