如何使我的计时器与我的按钮无关

时间:2018-04-03 16:27:53

标签: java

**我正在制作记忆匹配游戏。问题是计时器没有正常工作,它只在按下按钮时递增,如果用户没有按任何按钮,则无法自动递增。计时器应始终递增,直到用户找到所有对。 这是我的董事会成员**

package gamex;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Date;
import java.util.TimeZone;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Board extends JFrame{


    private List<Card> cards;
    private Card selectedCard;
    private Card c1;
    private Card c2;
    private Timer t;
    private int tries =1;
    JLabel Jtime;
    JLabel Jtries;
    int seconds;
    private SimpleDateFormat df;




    public Board(){


        int pairs = 4;
        List<Card> cardsList = new ArrayList<Card>();
        List<Integer> cardVals = new ArrayList<Integer>();

        for (int i = 0; i < pairs; i++){
            cardVals.add(i);
            cardVals.add(i);
        }
        Collections.shuffle(cardVals);

        for (int val : cardVals){
            final Card c = new Card();
            c.setId(val);
            c.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    selectedCard = c;
                    doTurn();
                }
            });
            cardsList.add(c);
        }
        this.cards = cardsList;

        //set up the timer
        t = new Timer(1000, new ActionListener(){
            public void actionPerformed(ActionEvent ae){
                checkCards();


            }

        });


        t.setRepeats(false);


        setTitle("Memory Match");
        JPanel p1= new JPanel();

        p1.setLayout(new GridLayout(4, 5));
        for (Card c : cards){
            p1.add(c);
        }

        Container pane = getContentPane();
        pane.setLayout(new BorderLayout());
        pane.add(p1);

        df = new SimpleDateFormat("HH:mm:ss"); // HH for 0-23
        df.setTimeZone(TimeZone.getTimeZone("GMT"));

        Jtime = new JLabel();
        Jtime.setForeground(Color.BLACK);
        Jtime.setFont(new Font("Tahoma", Font.PLAIN, 20));
        Jtime.setPreferredSize(new Dimension(200,30));
        pane.add(Jtime,BorderLayout.NORTH);

        Jtries = new JLabel("0");
        Jtries.setForeground(Color.BLACK);
        Jtries.setFont(new Font("Tahoma", Font.PLAIN, 20));
        Jtries.setAlignmentX(50);
        Jtries.setPreferredSize(new Dimension(100,30));
        pane.add(Jtries,BorderLayout.SOUTH);


        JMenuBar mb = new JMenuBar();
        setJMenuBar(mb);
        JMenu game = new JMenu("game",true);
        game.setMnemonic('g');
        mb.add(game);
        final JMenuItem newG; 
        final JMenuItem exitG;


    game.add(newG = new JMenuItem("return to Menu       alt+r", 'r'));
    game.add(exitG = new JMenuItem("exit game                alt+e", 'e'));

    exitG.addActionListener(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent ae) {
               if (ae.getSource()== exitG){
     JOptionPane.showMessageDialog(null, "Warning! your score will not be saved",
 "Warning", JOptionPane.INFORMATION_MESSAGE);
        System.exit(0);

               }
          }
      });

     newG.addActionListener(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent ae) {
               if (ae.getSource()== newG){
     JOptionPane.showMessageDialog(null, "Warning! your score will not be saved",
 "Warning", JOptionPane.INFORMATION_MESSAGE);
       dispose();

               }
          }
      });



    }

    private void setTimer() {
        seconds++;
        Date d = new Date(seconds * 1000L);
        String time = df.format(d);
        Jtime.setText(time);
    }

    private void setTries(int tries){
        String tri= Integer.toString(tries);
        Jtries.setText(tri+" trie(s)");
    }

    public void doTurn(){
        if (c1 == null && c2 == null){
            c1 = selectedCard;
            c1.setText(String.valueOf(c1.getId()));

        }

        if (c1 != null && c1 != selectedCard && c2 == null){
            c2 = selectedCard;
            c2.setText(String.valueOf(c2.getId()));
            t.start();
            setTimer();

        }
    }

    public void checkCards(){
        if (c1.getId() == c2.getId()){//match condition
            c1.setEnabled(false); //disables the button
            c2.setEnabled(false);
            c1.setMatched(true); //flags the button as having been matched
            c2.setMatched(true);
            if (this.isGameWon()){
                JOptionPane.showMessageDialog(this, "You win! "+"you did "+(tries-1)+
                        " tries to finish with the time of "+Jtime.getText());
    this.dispose();
            }
        }

        else{
            c1.setText(""); //'hides' text
            c2.setText("");
            setTries(tries++);
        }
        c1 = null; //reset c1 and c2
        c2 = null;

    }

    public boolean isGameWon(){
        for(Card c: this.cards){
            if (c.getMatched() == false){
                return false;
            }
        }
        return true;
    }



}

这是我的卡片类

package gamex;

import javax.swing.JButton;


public class Card extends JButton{
    private int id;
    private boolean matched = false;


    public void setId(int id){
        this.id = id;
    }

    public int getId(){
        return this.id;
    }


    public void setMatched(boolean matched){
        this.matched = matched;
    }

    public boolean getMatched(){
        return this.matched;
    }
}

提前感谢您的所有帮助:)

0 个答案:

没有答案
相关问题