• Java版打字练习案例源码


    代码如下

    import java.applet.Applet;
    import java.applet.AudioClip;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Toolkit;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.Rectangle;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    import javax.swing.JSlider;
    import javax.swing.JLabel;
    import javax.swing.UIManager;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.io.File;
    import java.util.Vector;
    public class Main extends JFrame implements Runnable {
            private static final long serialVersionUID = -2831332650077025158L;
    
            JPanel contentPane;
            JPanel jPanel1 = new JPanel();
            JButton jButton1 = new JButton();
            JSlider jSlider1 = new JSlider();
            JLabel jLabel1 = new JLabel();
            JButton jButton2 = new JButton();
            JLabel jLabel2 = new JLabel();
            int count = 1, rapidity = 5; 
            int zhengque = 0, cuowu = 0;
            int rush[] = { 10, 20, 30 }; 
            int rush_count = 0; 
            char list[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
                            'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
                            'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
            Vector number = new Vector();
            String paiduan = "true";
            AudioClip Musci_anjian, Music_shibai, Music_chenggong;
    
            public Main() {
                    try {
                            setDefaultCloseOperation(EXIT_ON_CLOSE);
                            // -----------------声音文件---------------------
                            Musci_anjian = Applet.newAudioClip(new File("sounds//anjian.wav")
                                            .toURL());
                            Music_shibai = Applet.newAudioClip(new File("sounds//shibai.wav")
                                            .toURL());
                            Music_chenggong = Applet.newAudioClip(new File(
                                            "sounds//chenggong.wav").toURL());
                            // ---------------------------------------
                            jbInit();
                    } catch (Exception exception) {
                            exception.printStackTrace();
                    }
            }
    
            /**
             * 初始化
             * 
             * @throws Exception
             */
            private void jbInit() throws Exception {
                    contentPane = (JPanel) getContentPane();
                    contentPane.setLayout(null);
                    setSize(new Dimension(588, 530));
                    setTitle("Frame Title");
                    jPanel1.setBorder(BorderFactory.createEtchedBorder());
                    jPanel1.setBounds(new Rectangle(4, 4, 573, 419));
                    jPanel1.setLayout(null);
                    jButton1.setBounds(new Rectangle(277, 442, 89, 31));
                    jButton1.setText("开始");
                    jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this));
                    jSlider1.setBounds(new Rectangle(83, 448, 164, 21));
                    jSlider1.setMaximum(100);
                    jSlider1.setMinimum(0);
                    jSlider1.setValue(95);
                    jLabel1.setText("速度");
                    jLabel1.setBounds(new Rectangle(35, 451, 39, 18));
                    jButton2.setBounds(new Rectangle(408, 442, 89, 31));
                    jButton2.setText("结束");
                    jButton2.addActionListener(new Frame1_jButton2_actionAdapter(this));
                    jLabel2.setText("第一关:10个");
                    jLabel2.setBounds(new Rectangle(414, 473, 171, 21));
                    contentPane.add(jPanel1);
                    contentPane.add(jButton2);
                    contentPane.add(jButton1);
                    contentPane.add(jSlider1);
                    contentPane.add(jLabel1);
                    contentPane.add(jLabel2);
                    this.addKeyListener(new MyListener());
                    jButton1.addKeyListener(new MyListener());
                    jSlider1.addKeyListener(new MyListener());
                    jSlider1.addChangeListener(new ChangeListener() {
                            public void stateChanged(ChangeEvent e) {
                                    rapidity = 100 - jSlider1.getValue();
                            }
                    });
            }
    
            /**
             * 主线程
             */
            public void run() {
                    number.clear();
                    zhengque = 0;
                    cuowu = 0;
                    paiduan = "true";
                    while (count <= rush[rush_count]) {
                            try {
                                    Thread t = new Thread(new Tthread());
                                    t.start();
                                    count += 1;
                                    Thread.sleep(50 + (int) (Math.random() * 500)); // 生产下组停顿时间
                                    // 最快0.05秒.最慢0.5秒
                            } catch (InterruptedException e) {
                                    e.printStackTrace();
                            }
                    }
                    while (true) { // 等待最后一个字符消失
                            if (number.size() == 0) {
                                    break;
                            }
                    }
                    if (zhengque == 0) { // 为了以后相除..如果全部正确或者错误就会出现错误. 所以..
                            zhengque = 1;
                    }
    
                    if (paiduan.equals("true")) { // 判断是否是自然结束
                            if (cuowu <= 2) { // 错误不超过2个的过关
                                    JOptionPane.showMessageDialog(null, "恭喜你过关了");
                                    rush_count += 1; // 自动加1关
                                    if (rush_count < rush.length) {
                                            if (rapidity > 10) { // 当速度大于10的时候在-5提加速度.怕速度太快
                                                    rapidity -= 5; // 速度自动减10毫秒
                                                    jSlider1.setValue(rapidity); // 选择位置
                                            }
                                            Thread t = new Thread(this);
                                            t.start();
                                    } else {
                                            JOptionPane.showMessageDialog(null, "牛B...你通关了..");
                                            rush_count = 0;
                                            count = 0;
                                    }
                            } else {
                                    JOptionPane.showMessageDialog(null, "请再接再励");
                                    rush_count = 0;
                                    count = 0;
                            }
                    } else {
                            rush_count = 0;
                            count = 0;
                    }
            }
    
            public void jButton1_actionPerformed(ActionEvent e) {
                    Thread t = new Thread(this);
                    t.start();
            }
    
            public void jButton2_actionPerformed(ActionEvent e) {
                    count = rush[rush_count] + 1;
                    paiduan = "flase";
            }
    
            /**
             * 字符下移线程
             */
            class Tthread implements Runnable {
                    public void run() {
                            boolean fo = true;
                            int Y = 0, X = 0;
                            JLabel show = new JLabel();
                            show.setFont(new java.awt.Font("宋体", Font.PLAIN, 33));
                            jPanel1.add(show);
                            X = 10 + (int) (Math.random() * 400);
                            String parameter = list[(int) (Math.random() * list.length)] + "";
                            Bean bean = new Bean();
                            bean.setParameter(parameter);
                            bean.setShow(show);
                            number.add(bean);
                            show.setText(parameter);
                            while (fo) {
                                    // ---------------------字符下移--------------------
                                    show.setBounds(new Rectangle(X, Y += 2, 33, 33));
                                    try {
                                            Thread.sleep(rapidity);
                                    } catch (InterruptedException e) {
                                            e.printStackTrace();
                                    }
                                    if (Y >= 419) {
                                            fo = false;
                                            for (int i = number.size() - 1; i >= 0; i--) {
                                                    Bean bn = ((Bean) number.get(i));
                                                    if (parameter.equalsIgnoreCase(bn.getParameter())) {
                                                            cuowu += 1;
                                                            jLabel2.setText("正确:" + zhengque + "个,错误:" + cuowu
                                                                            + "个");
                                                            number.removeElementAt(i);
                                                            Music_shibai.play();
                                                            break;
                                                    }
                                            }
                                    }
                            }
                    }
            }
    
            /**
             * 键盘监听器
             * 
             */
            class MyListener extends KeyAdapter {
                    public void keyPressed(KeyEvent e) {
                            String uu = e.getKeyChar() + "";
                            for (int i = 0; i < number.size(); i++) {
                                    Bean bean = ((Bean) number.get(i));
                                    if (uu.equalsIgnoreCase(bean.getParameter())) {
                                            zhengque += 1;
                                            number.removeElementAt(i);
                                            bean.getShow().setVisible(false);
                                            jLabel2.setText("正确:" + zhengque + "个,错误:" + cuowu + "个");
                                            Music_chenggong.play();
                                            break;
                                    }
                            }
                            Musci_anjian.play();
                    }
            }
    
            public static void main(String[] args) {
                    try {
                            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception exception) {
                            exception.printStackTrace();
                    }
                    Main frame = new Main();
                    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                    Dimension frameSize = frame.getSize();
                    if (frameSize.height > screenSize.height) {
                            frameSize.height = screenSize.height;
                    }
                    if (frameSize.width > screenSize.width) {
                            frameSize.width = screenSize.width;
                    }
                    frame.setTitle("java版打字练习软件");
                    frame.setLocation((screenSize.width - frameSize.width) / 2,
                                    (screenSize.height - frameSize.height) / 2);
                    frame.setVisible(true);
            }
    }
    
    class Frame1_jButton2_actionAdapter implements ActionListener {
            private Main adaptee;
    
            Frame1_jButton2_actionAdapter(Main adaptee) {
                    this.adaptee = adaptee;
            }
    
            public void actionPerformed(ActionEvent e) {
                    adaptee.jButton2_actionPerformed(e);
            }
    }
    
    class Frame1_jButton1_actionAdapter implements ActionListener {
            private Main adaptee;
    
            Frame1_jButton1_actionAdapter(Main adaptee) {
                    this.adaptee = adaptee;
            }
    
            public void actionPerformed(ActionEvent e) {
                    adaptee.jButton1_actionPerformed(e);
            }
    }
    
    /**
    * 下落的字符类
    * 
    */
    class Bean {
            String parameter = null;
            JLabel show = null;
    
            public JLabel getShow() {
                    return show;
            }
    
            public void setShow(JLabel show) {
                    this.show = show;
            }
    
            public String getParameter() {
                    return parameter;
            }
    
            public void setParameter(String parameter) {
                    this.parameter = parameter;
            }
    }
    

      效果图
    <ignore_js_op>

    详细说明:http://java.662p.com/thread-3797-1-1.html

  • 相关阅读:
    两路归并算法
    个性化搜索引擎调研(三)
    编程珠玑开篇磁盘文件排序问题
    Lucene里经常被聊到的几个话题
    成就霸业的座右铭(绝对经典)
    别人对你的态度,决定了你的命运
    iBATIS缓存实现分析[转]
    Taste/Thoth:Taste Architecture 概览【转Beyond Search】
    中文分词算法笔记
    ConcurrentModificationException主要原因及处理方法
  • 原文地址:https://www.cnblogs.com/liniuzen/p/4110238.html
Copyright © 2020-2023  润新知