- 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;
- }
- }
来源: http://www.phpxs.com/code/1002083/