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

时间: 2024-10-10 05:34:54

Java版打字练习案例源码的相关文章

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;

java实现 swing模仿金山打字 案例源码

java实现 swing模仿金山打字 案例源码,更多Java技术就去Java教程网.http://java.662p.com 代码: <font size="3">import Java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.io.File; import java.io.IO

Java利用webservice创建接口案例源码

环境要求: JDK1.7,并配置Java的环境变量 BaseDao  接口: /** * 要使得成为一个可供访问的接口,必须添加:@WebService * */ @WebServicepublic interface BaseDao {    //添加一个加法的接口        @WebResult(name="addddddre")    public int add(@WebParam(name="add01")int a,@WebParam(name=&q

使用jqplot创建报表(一) 初学后写的第一个案例源码

一.初学后写的第一个案例源码 效果图: 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ include file="common.jsp"%> <html> <head> <script type="text/javascript" src=&q

java多线程核心技术梳理(附源码)

java多线程核心技术梳理(附源码) java多线程核心技术梳理附源码 写在前面 java多线程 对象及变量的并发访问 线程间通信 Lock的使用 定时器 单例模式与多线程 拾遗补增 参考资料 本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组. 写在前面 花了一周时间阅读<java多线程编程核心技术>(高洪岩 著),本文算是此书的整理归纳,书中几乎所有示例,我都亲手敲了一遍,并上传到了我的githu

死磕 java同步系列之CountDownLatch源码解析

??欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以翻译为倒计时器,但是似乎不太准确,它的含义是允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作. Cou

死磕 java同步系列之CyclicBarrier源码解析——有图有真相

问题 (1)CyclicBarrier是什么? (2)CyclicBarrier具有什么特性? (3)CyclicBarrier与CountDownLatch的对比? 简介 CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个条件才继续执行.它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走. 使用方法 pu

死磕 java同步系列之Phaser源码解析

问题 (1)Phaser是什么? (2)Phaser具有哪些特性? (3)Phaser相对于CyclicBarrier和CountDownLatch的优势? 简介 Phaser,翻译为阶段,它适用于这样一种场景,一个大任务可以分为多个阶段完成,且每个阶段的任务可以多个线程并发执行,但是必须上一个阶段的任务都完成了才可以执行下一个阶段的任务. 这种场景虽然使用CyclicBarrier或者CountryDownLatch也可以实现,但是要复杂的多.首先,具体需要多少个阶段是可能会变的,其次,每个阶

JEECG社区 一个微信教育网站案例源码分享

微信教育网站案例演示: http://t.cn/RvPgLcb 源码分享: http://pan.baidu.com/s/1cUImy 截图演示: JEECG社区 一个微信教育网站案例源码分享,布布扣,bubuko.com