【发布时间】:2018-10-13 01:32:41
【问题描述】:
我正在尝试创建一个有 12 个切换按钮的记忆游戏。如果你点击一个按钮,图标就会改变。如果两个图标匹配,则两者都被翻转。我在游戏顶部显示了一个经过的计时器。我想让计时器在游戏结束时停止;但是,计时器只是继续运行。这就是我所拥有的:
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.*;
import java.util.Collections;
import java.util.Calendar;
import java.time.*;
public class MemoryGame extends JToggleButton implements ActionListener {
private Timer cdTimer;
private Timer swTimer;
private int count = 0;
private long start;
private long begin = Calendar.getInstance().getTimeInMillis();
private JToggleButton[] buttons;
private JToggleButton last;
private JLabel time;
//private String[] commandID = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"};
ArrayList<ImageIcon> iconList = new ArrayList();
ArrayList<JToggleButton> retireButton = new ArrayList();
ImageIcon icon = new ImageIcon("MemoryGame.png");
public MemoryGame() {
JFrame jfrm = new JFrame("Memory Game");
jfrm.setSize(1000, 1000);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfrm.setIconImage(icon.getImage());
time = new JLabel("Elapsed time is 00:00:00");
GridLayout layout = new GridLayout(3,4);
JPanel gamePanel = new JPanel();
gamePanel.setLayout(layout);
createIcons();
buttons = new JToggleButton[12];
for(int i = 0; i < buttons.length; i++) {
JToggleButton btn = new JToggleButton(icon);
buttons[i] = btn;
//buttons[i].setActionCommand(commandID[i]);
buttons[i].addActionListener(this);
gamePanel.add(buttons[i]);
}
//Collections.shuffle(Arrays.asList(buttons));
//Collections.shuffle(iconList);
jfrm.add(gamePanel, BorderLayout.CENTER);
time.setHorizontalAlignment(JLabel.CENTER);
time.setVerticalAlignment(JLabel.CENTER);
jfrm.add(time, BorderLayout.NORTH);
jfrm.setLocationRelativeTo(null);
jfrm.setVisible(true);
}
public void actionPerformed(ActionEvent e){
timerStart();
JToggleButton btn = (JToggleButton)e.getSource();
setIcon(btn);
if(last == null){
last = btn;
return;
}
matching(btn, last);
last = null;
}
public void updateTime(){
long temp = Calendar.getInstance().getTimeInMillis();
time.setText("Elapsed time is " + formatTime((long) (temp - begin)) + "-"+retireButton.size());
}
public static String formatTime(long ms){
long millis = ms % 1000;
long x = ms / 1000;
long seconds = x % 60;
x /= 60;
long minutes = x % 60;
x /= 60;
long hours = x % 24;
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
}
private void timerStart(){
ActionListener timerAL = new ActionListener(){
public void actionPerformed(ActionEvent e){
updateTime();
}
};
swTimer = new Timer(1000, timerAL);
swTimer.start();
}
private void timerStop(){
if(retireButton.size() == 12){
long stop = Calendar.getInstance().getTimeInMillis();
time.setText("Elapsed time is " + formatTime((long)(stop-begin)));
swTimer.stop();
}
}
private void setIcon(JToggleButton btn) {
if(btn == buttons[0] || btn == buttons[1])
btn.setIcon(iconList.get(0));
else if(btn == buttons[2] || btn == buttons[3])
btn.setIcon(iconList.get(1));
else if(btn == buttons[4] || btn == buttons[5])
btn.setIcon(iconList.get(2));
else if(btn == buttons[6] || btn == buttons[7])
btn.setIcon(iconList.get(3));
else if(btn == buttons[8] || btn == buttons[9])
btn.setIcon(iconList.get(4));
else if(btn == buttons[10] || btn == buttons[11])
btn.setIcon(iconList.get(5));
}
private void matching(JToggleButton btn, JToggleButton btn2){
if(btn.isSelected()){
if(btn2.isSelected()){
buttonDisable(btn, btn2);
if(!btn.getIcon().toString().equals(btn2.getIcon().toString())){
startTime(1, btn, btn2);
}
else {
retirePair(btn, btn2);
timerStop();
buttonEnable(btn, btn2);
}
}
}
}
private void startTime(int countPassed, JToggleButton btn, JToggleButton btn2){
ActionListener action = new ActionListener(){
public void actionPerformed(ActionEvent e){
if(count == 0){
cdTimer.stop();
unflipPair(btn, btn2);
buttonEnable(btn, btn2);
}
else
count--;
}
};
cdTimer = new Timer(500, action);
cdTimer.start();
count = countPassed;
}
private void buttonEnable(JToggleButton btn, JToggleButton btn2){
if(retireButton.isEmpty()){
for(int i = 0; i < buttons.length; i++){
if(buttons[i] != btn && buttons[i] != btn2)
buttons[i].setEnabled(true);
}
}
else{
for(int i = 0; i < buttons.length; i++){
for(int j = 0; j < retireButton.size(); j++){
if(buttons[i] != btn && buttons[i] != btn2 && buttons[i] != retireButton.get(j))
buttons[i].setEnabled(true);
}
}
}
}
private void buttonDisable(JToggleButton btn, JToggleButton btn2){
for(int i = 0; i < buttons.length; i++){
if(buttons[i] != btn && buttons[i] != btn2)
buttons[i].setEnabled(false);
}
}
private void unflipPair(JToggleButton btn, JToggleButton btn2){
btn.setIcon(icon);
btn2.setIcon(icon);
btn.setEnabled(true);
btn2.setEnabled(true);
btn.setSelected(false);
btn2.setSelected(false);
}
private void retirePair(JToggleButton btn, JToggleButton btn2){
btn.setEnabled(false);
btn2.setEnabled(false);
btn.setSelected(true);
btn2.setSelected(true);
retireButton.add(btn);
retireButton.add(btn2);
}
private void createIcons(){
ImageIcon icon1 = new ImageIcon("1.png");
ImageIcon icon2 = new ImageIcon("2.png");
ImageIcon icon3 = new ImageIcon("3.png");
ImageIcon icon4 = new ImageIcon("4.png");
ImageIcon icon5 = new ImageIcon("5.png");
ImageIcon icon6 = new ImageIcon("6.png");
iconList.add(icon1);
iconList.add(icon2);
iconList.add(icon3);
iconList.add(icon4);
iconList.add(icon5);
iconList.add(icon6);
}
所以我创建了一个退出按钮的数组列表。我设置的定时器停止条件是如果退出按钮的数组列表大小达到12(这是游戏中的按钮总数),那么定时器就会停止;但是,它一直在继续。我不知道我做错了什么。请帮忙谢谢。
【问题讨论】:
-
请了解minimal reproducible example 构造,您可以通过将代码压缩到最小的代码来隔离问题,以便编译和运行并为我们演示问题。这在在这里提问时很有用,因为它使我们更容易理解您的代码和您的问题,但更重要的是,它也使 您 更容易看到问题并成为可以自己调试。
-
1.有没有调试过程序。 2. 包括你是否测试过并确保游戏结束检测确实有效,以及试图停止计时器的代码是否被实际调用?
标签: java swing user-interface timer