实现逻辑:一个画板实现Runnable接口,会不停刷新,此外这个画板也充当了监听器的作用,监听来自键盘的事件。让JFrame加上监听器就能监听。在画板刷新过程中,去判断有没有正确的打出字母,打出来则去掉数组中的字母,重新换一个字母从最顶部逐渐向下走。话不多说,直接上源码。
package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends JFrame{
public MyFrame(){
this.setSize(800,600);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
MyPanel myPanel = new MyPanel();
this.addKeyListener(myPanel);
this.add(myPanel);
Thread t = new Thread(myPanel);
t.start();
}
}
class MyPanel extends JPanel implements Runnable,KeyListener{
private List<Letter> letters;
private int score;
private boolean isLive;
public MyPanel(){
score = 0;
isLive = true;
letters = new LinkedList<>();
for (int i = 0; i <18 ; i++) {
Letter letter = new Letter();
letter.setPoint(new Point(0,0));
int rand = (int)(Math.random()*26 + 65);
letter.setLetter((char)rand);
// int randSpeed = (int)(1+Math.random()*7);
letter.setSpeed(1);
letter.setColor(Color.YELLOW);
letter.setPoint(new Point(i*40,0));
letters.add(letter);
}
this.setBackground(Color.BLACK);
this.setFont(new Font("微软雅黑",Font.PLAIN,36));
}
@Override
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i <letters.size() ; i++) {
Letter letter = letters.get(i);
System.out.println(letter.getLetter());
g.setColor(letter.getColor());
g.drawString(letter.getLetter()+"",(int)letter.getPoint().getX(),(int)letter.getPoint().getY());
if(letter.getPoint().getY()>600){
g.drawString("游戏结束",100,100);
}
g.drawString("得分:"+score,600,500);
}
}
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i <letters.size() ; i++) {
Letter letter = letters.get(i);
this.updateState(letters);
System.out.println(letter.getPoint());
this.repaint();
if(letter.getPoint().getY()>600){
this.isLive = false;
break;
}
}
if(!this.isLive){
break;
}
}
}
public void updateState(List<Letter> letters){
for (int i = 0; i <letters.size() ; i++) {
Letter letter = letters.get(i);
int y = (int)(letter.getPoint().getY()+letter.getSpeed());
int x = (int)(letter.getPoint().getX());
Point point = new Point(x,y);
letter.setPoint(point);
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("监听到按下键盘事件!");
for (int i = 0; i <letters.size() ; i++) {
if(e.getKeyCode()==(int)letters.get(i).getLetter()){
letters.get(i).setColor(Color.RED);
letters.remove(i);
Letter letter = new Letter();
letter.setSpeed(2);
letter.setColor(Color.YELLOW);
int rand = (int)(Math.random()*26 + 65);
letter.setLetter((char)rand);
letter.setPoint(new Point(i*40,0));
letters.add(letter);
this.score++;
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
class Letter{
private char letter;
private int speed;
private Point point;
private Color color;
public char getLetter() {
return letter;
}
public void setLetter(char letter){this.letter = letter;}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public static void main(String[] args) {
int rand = (int)(Math.random()*26 + 65);
System.out.println(rand);
System.out.println((char)rand);
}
}
效果演示: