【Java开源代码栏目提醒】:网学会员鉴于大家对Java开源代码十分关注,论文会员在此为大家搜集整理了“TypingGame.java”一文,供大家参考学习
package book.applet;
import java.applet.Applet;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
/**
* 用Applet实现的打字游戏。同时有多个字母方块不断的落下,
* 需要按下字母方块上的字母,才能得分。
*/
public class TypingGame extends Applet implements Runnable {
// 游戏画面的宽度和高度
int width, height;
// 游戏的画布和画笔
public Image img;
Graphics off;
// 键盘和鼠标事件处理器
MouseListener mouseListener = new MyMouseAdapter();
KeyListener keyListener = new MyKeyAdapter();
// 右键的弹出菜单
JPopupMenu popupMenu;
// 字母制造器,不断的产生字母。
LetterMaker myLetterMaker;
// 玩家击中的字母的次数
int rightTypedSum;
// 玩家漏掉的字母数
int omittedSum;
// 玩家按错的次数
int wrongTypedSum;
// 正确率
float percent;
// 游戏的刷新率
public int FPS;
// 游戏的后台线程和游戏的运行状态
public Thread gameThread;
public static boolean running;
/**
* 初始化Applet
*/
public void init() {
this.setBackground(Color.pink);
this.setLayout(new FlowLayout());
// 从Applet的配置HTML中读取参数
FPS = Integer.parseInt(getParameter("FPS"));
rightTypedSum = omittedSum = wrongTypedSum = 0;
percent = 0f;
// 读取Applet的大小参数
width = this.getWidth();
height = this.getHeight();
// 将游戏背景大小设置为Applet大小
img = this.createImage(width, height);
off = img.getGraphics();
running = false;
// 添加组件
addComponents();
}
// 为Applet增加组件
private void addComponents() {
// 为Applet增加鼠标和键盘事件处理器
this.addKeyListener(keyListener);
this.addMouseListener(mouseListener);
// 构造右键的弹出菜单
popupMenu = new JPopupMenu();
// 开始游戏菜单
JMenuItem menuItem = new JMenuItem("开始游戏");
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rightTypedSum = omittedSum = wrongTypedSum = 0;
running = true;
start();
}
});
popupMenu.add(menuItem);
// 结束游戏菜单
menuItem = new JMenuItem("结束游戏");
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stop();
running = false;
}
});
popupMenu.add(menuItem);
// 增加字母数字菜单
popupMenu.addSeparator();
menuItem = new JMenuItem("增加字母数字");
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (myLetterMaker.currentLetterNumOnScreen < 9){
myLetterMaker.currentLetterNumOnScreen++;
}
myLetterMaker.refreshLetters();
}
});
popupMenu.add(menuItem);
// 加快下落速度菜单
menuItem = new JMenuItem("加快下落速度");
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
speedUp();
}
});
popupMenu.add(menuItem);
popupMenu.addSeparator();
// 减少字母数字
menuItem = new JMenuItem("减少字母数字");
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (myLetterMaker.currentLetterNumOnScreen > 1){
myLetterMaker.currentLetterNumOnScreen--;
}
myLetterMaker.refreshLetters();
}
});
popupMenu.add(menuItem);
// 减缓下落速度
menuItem = new JMenuItem("减缓下落速度");
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
speedDown();
}
});
popupMenu.add(menuItem);
}
/**
* 启动Applet
*/
public void start() {
// 新建游戏线程
gameThread = new Thread(this);
gameThread.start();
// 新建字母制造器
myLetterMaker = new LetterMaker(this, off);
myLetterMaker.refreshLetters();
}
public void stop() {
running = false;
gameThread = null;
}
public void run() {
while (running) {
this.repaint();
try {
Thread.sleep(1000/FPS);
} catch (InterruptedException e) {
System.out.println(e.toString());
}
}
}
public void paint(Graphics g) {
int sum;
int showPercent = 0;
// 使用双缓冲技术,首先将图形画在Image对象上,再将Image对象画在屏幕上。
if (running) {
//off画笔属于Image对象的,所以它画的所有东西都在Image上
off.setColor(this.getBackground());
off.fillRect(0, 0, width, height);
myLetterMaker.paintLetters(g);
off.setColor(Color.blue);
// 计算玩家的各种指标
sum = rightTypedSum + wrongTypedSum + omittedSum;
if (sum == 0) {
percent = 0f;
showPercent = 0;
} else {
percent = (float) rightTypedSum / sum;
showPercent = (int) (percent * 100);
}
off.drawString("击中" + rightTypedSum + " 错击" + wrongTypedSum + " 漏掉"
+ omittedSum + " 正确率" + showPercent + "%", 200, 200);
// g画笔属于Applet,把Image对象画在Applet上。
g.drawImage(img, 0, 0, width, height, this);
} else {
off.setColor(this.getBackground());
off.fillRect(0, 0, width, height);
off.drawString("击中" + rightTypedSum + " 错击" + wrongTypedSum + " 漏掉"
+ omittedSum + " 正确率" + showPercent + "%", 200, 200);
g.drawImage(img, 0, 0, width, height, this);
}
}
public void update(Graphics g) {
this.paint(g);
}
/**
* 减缓字母下落速度
*/
public void speedDown(){
Letter letter = null;
for (int i = 0; i < myLetterMaker.currentLetterNumOnScreen; i++) {
letter = (Letter)myLetterMaker.currentLetters.get(i);
if (letter.speed > 1){
letter.speed --;
}
}
}
/**
* 提高字母下落速度
*/
public void speedUp(){
Letter letter = null;
for (int i = 0; i < myLetterMaker.currentLetterNumOnScreen; i++) {
letter = (Letter)myLetterMaker.currentLetters.get(i);
if (letter.speed < 8){
letter.speed ++;
}
}
}
// 鼠标事件侦听器
class MyMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
showPopup(e);
}
public void mouseReleased(MouseEvent e) {
showPopup(e);
}
// 如果在Applet上点击了右键,则弹出菜单
public void showPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
// 显示菜单
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
}
// 键盘事件侦听器
class MyKeyAdapter extends KeyAdapter {
public void keyPressed(KeyEvent e) {
// 获得被按的键的字符
char key = e.getKeyChar();
Letter letter = null;
for (int i = 0; i < myLetterMaker.currentLetterNumOnScreen; i++) {
letter = (Letter)myLetterMaker.currentLetters.get(i);
if ((char) (key - 32) == letter.getChar()) {
rightTyp
上一篇:
typeWatch$jsp.java
下一篇:
教师节诗歌:思念园丁