package com.dazi3;
/*
* 待解决的问题:
* 1.一直输入,可能丢失数据,最后就不出来图片了 (因为是当前的y值和我输入后赋值的和会超过我们制定的范围)
* [1.已解决]
* 2.加分不正确 (因为在监听里的循环可能循环了多次,导致score最后会变大)
*/
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
class daziganme extends JFrame implements Runnable {
private static final long serialVersionUID = 1L;
static int score = 100;
Toolkit KIT = this.getToolkit();;
char pic[] = new char[5];
Image zimu[] = new Image[5];
int x[] = new int[5];
int y[] = new int[5];
int z[] = new int[5];
int level = 0;
daziganme(int level) {
this.level = level;
for (int i = 0; i < y.length; i++) {
// 最好加一个方法,生成字母是不同的
// 生产随机字母
pic[i] = (char) (Math.random() * 26 + 'A');// 生产随机字母
zimu[i] = KIT.createImage("img/字母/" + pic[i] + ".png");
// x轴
x[i] = (int) (Math.random() * 800);
// y轴
y[i] = 10 + (int) (Math.random() * 30);
// y+z y来决定初始化的位置, z为随机出往下走的速度
// z应该加个变量,来决定游戏难度 这样速度就不同了
z[i] = 2 + (int) (Math.random() * level);
}
}
public void paint(Graphics g) {
// 重写paint方法来来显示出往下掉的效果
// 如果没有会重复显示
super.paint(g);
for (int i = 0; i < y.length; i++) {
g.drawImage(zimu[i], x[i], y[i], this);
}
// 键盘监听
// 是个匿名内部类
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
// for (int i = 0; i < y.length; i++) {
// if (e.getKeyChar() >= 'a' && e.getKeyChar() <= 'z'
// || (e.getKeyChar() >= 'A' && e.getKeyChar() <= 'Z')) {
// if (Character.toLowerCase(pic[i]) == (e.getKeyChar())) {
// y[i] = 700;
// score += 2;
// daziganme.this.repaint();
// }
// }
// }
// System.out.println("自动生成"+Character.toLowerCase(pic[0]));
// System.out.println("来自键盘"+e.getKeyChar());
for (int i = 0; i < y.length; i++) {
if (e.getKeyChar() == pic[i]
|| e.getKeyChar() == pic[i] + 32) {
y[i] = 710;
score += 2;
daziganme.this.repaint();
}
}
}
});
// 当字母到达屏幕边缘时,判断
// 键盘监听里添加,如果键入正确,则会到达屏幕边缘
for (int i = 0; i < y.length; i++) {
if (y[i] >= 700 && y[i] <= 2000) {
// 有可能 在700-750范围里在移动一次,那就扣两次分了。所以直接让他蹦出800位置
y[i] = 2001;
// 每当重新生成图片,都要重新随机x和y轴,还有图片
x[i] = (int) (Math.random() * 800);
y[i] = (int) (Math.random() * 50);
z[i] = 2 + (int) (Math.random() * 50);
pic[i] = (char) (Math.random() * 26 + 'A');// 生产随机字母
zimu[i] = KIT.createImage("img/字母/" + pic[i] + ".png");
daziganme.this.repaint();
score--;
}
}
this.setTitle("打字游戏v1.0_By Anting 你的生命为" + score + "正确率:");
}
protected void double_Click() {
new startgame();
this.dispose();// 销毁窗体
}
public void run() {
// 鼠标点两次 返回主菜单
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) { // 如果点击的次数是2 就退出
System.out.println("ok");
double_Click();
}
}
});
while (true) {
// 应该把这些放在run方法中,不然每次调用repaint()方法都会加一次Y坐标,所有就会往下蹦。
for (int i = 0; i < y.length; i++) {
y[i] += z[i];
}
// 重复调用paint方法
repaint();
try {
Thread.sleep(700);
} catch (Exception e) {
}
}
}
}
public class dazi3 extends JFrame {
static int level = 0;
public dazi3(int level) {
this.level = level;
daziganme dzg = new daziganme(level);
dzg.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 获取屏幕的长、宽
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
// 屏幕的长、宽减去窗口本身的大小除于2 来让窗口显示在屏幕中央
dzg.setLocation((width - 900) / 2, (height - 700) / 2);
dzg.setSize(900, 700);
dzg.setVisible(true);
new Thread(dzg).start();
}
public static void main(String[] args) {
new dazi3(level);
}
}