Java实现打字练习的代码

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

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;

/**
 * Java版打字练习软件
 * 
 */
public class RapidTyping 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; // count 当前进行的个数, rapidity 游标的位置
	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 RapidTyping() {
		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();
		}
		RapidTyping frame = new RapidTyping();
		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 RapidTyping adaptee;

	Frame1_jButton2_actionAdapter(RapidTyping adaptee) {
		this.adaptee = adaptee;
	}

	public void actionPerformed(ActionEvent e) {
		adaptee.jButton2_actionPerformed(e);
	}
}

class Frame1_jButton1_actionAdapter implements ActionListener {
	private RapidTyping adaptee;

	Frame1_jButton1_actionAdapter(RapidTyping 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;
	}
}