java练习案例_Java版打字练习案例源码

这是一个Java实现的打字练习程序,包含了开始、结束按钮,速度调节滑块,以及错误和正确计数的显示。用户可以进行打字练习,程序会随机生成字符并下落,用户按键响应进行打字,同时有背景音乐和音效反馈。程序使用Swing库创建界面,通过线程控制字符下落,并实现了键盘监听功能。
摘要由CSDN通过智能技术生成

代码如下

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;

}

}

效果图

5be6c64a2865602092d2bce222494c8e.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,打字练习通常不是作为特定的语言特性或内置功能提供的。然而,你可以通过编程设计一个简单的练习程序来帮助用户提升打字速度。以下是一个简单的示例,展示了如何创建一个命令行界面的打字练习程序: ```java import java.util.Scanner; import java.text.DecimalFormat; public class TypingPractice { private static final int MAX_TIME.SECONDS = 60; private static final int KEYBOARD_ROWS = 5; private static final String[] ALPHABET = "qwertyuiopasdfghjklzxcvbnm".split(""); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Welcome to the Typing Practice!"); System.out.println("Press 'start' to begin:"); String startInput = scanner.nextLine(); if (startInput.equalsIgnoreCase("start")) { int elapsedTime = 0; int correctKeys = 0; String targetText = getTargetText(); while (elapsedTime < MAX_TIME.SECONDS) { System.out.println("Type the following text within " + (MAX_TIME.SECONDS - elapsedTime) + " seconds:"); System.out.println(targetText); String userTyping = scanner.nextLine(); int userKeysTyped = countKeysTyped(userTyping); elapsedTime += 1; if (compareStrings(userTyping, targetText)) { correctKeys += userKeysTyped; } updateProgress(elapsedTime, correctKeys); } double accuracy = (double) correctKeys / userKeysTyped * 100; DecimalFormat df = new DecimalFormat("#.##"); System.out.println("Practice completed! Accuracy: " + df.format(accuracy) + "%"); } else { System.out.println("Practice cancelled."); } scanner.close(); } private static String getTargetText() { // 可以选择不同的文本,如随机字母、单词或句子 return ALPHABET[KEYBOARD_ROWS - 1] + " " + ALPHABET[KEYBOARD_ROWS - 2] + " " + ALPHABET[KEYBOARD_ROWS - 3]; } private static int countKeysTyped(String typing) { int count = 0; for (char c : typing.toCharArray()) { if (Character.isLetter(c)) { count++; } } return count; } private static boolean compareStrings(String typing, String target) { return typing.equalsIgnoreCase(target); } private static void updateProgress(int elapsedTime, int correctKeys) { // 更新进度显示或其他统计信息 System.out.println("Elapsed Time: " + elapsedTime + " seconds, Correct Keys: " + correctKeys); } } ``` 这个程序创建了一个简单的打字练习,用户需要在规定的时间内输入特定的字符串(在这个例子中是一行字母)。程序会计算用户的准确率,并在结束后显示。 相关问题-- 1. 在这个Java程序中,`getTargetText()`方法的作用是什么? 2. `countKeysTyped()`方法是如何计算用户键入的字母数量的? 3. 用户如何结束这个打字练习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值