Java實現打字練習的代碼

lope 9年前發布 | 4K 次閱讀 Java Java lookandfeel

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;
    

    } } </pre>

 本文由用戶 lope 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!