
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; |
} |
} |




高级设计师
by: 神马 发表于:2012-09-03 00:38:33 顶(4) | 踩(0) 回复
good
回复评论