题目:
编写一个打字游戏,从一个面板顶端随机出现一些字母,字母按一定的时间自顶向下移动,如果字母接触到面板底端则Game Over,用户可以通过敲击键盘消除移动中的字母。
- 绘制出GUI界面的简易图
- 生成含有大小写随机字母并记录的方法
- 字母移动并显示的线程类
- 敲击键盘事件的响应方法(用于消除字母)
代码实现:
package ClickLetter;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;
/**
* auther:Xing
* time:2019/12/12
*/
public class MoveGame extends JFrame implements Runnable , KeyListener {
private Random random = new Random();
private Thread thread;
//字母个数
private final int DEFAULT_SIZE = 10;
//各个值的x位置
private ArrayList<Integer> x_index = new ArrayList<>();
//y坐标位置
private int y_index = 50;
//存放String字母集
private volatile ArrayList<String> numbers = new ArrayList<>();
//构造函数
public MoveGame() {
super("打字游戏");
setFont(new Font("Time New Roman",Font.BOLD,20));
//启动事件监控
addKeyListener(this);
//初始化字母集
init(DEFAULT_SIZE);
//启动线程
start();
//设置窗体属性
setSize(700, 600);
setVisible(true);
this.setLocation(440,330);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
//生成随机大小写字母的方法
private String getNumber(){
int flag = random.nextInt(2);
char str = 'A';
String s = "";
if(flag == 0){
//大写字母
s += (char)(str + random.nextInt(26));
}else{
//小写字母
//char str = 'a';
s += (char)(str + random.nextInt(26)+32);
}
return s;
}
/**
* 初始化字母集及字母的x坐标
* @param count 字母个数
*/
public void init(int count){
int x = 10;
for(int i=0;i<count;i++) {
numbers.add(getNumber());
x_index.add(x);
x = random.nextInt(30)+50+x;
}
}
//开始进程
private void start(){
if(thread == null){
thread = new Thread(this);
thread.start();
}
}
//线程
@Override
public void run() {
while(thread != null){
//游戏成功
if(numbers.size() == 0){
stop();
System.exit(0);
}
//游戏失败
if(y_index == 600){
stop();
System.exit(0);
}
y_index += 10;
//调用方法重绘界面
repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//停止线程
public void stop(){
thread = null;
}
//绘图
public void paint(Graphics g){
Graphics2D G = (Graphics2D)g;
//获取窗口大小
Dimension dim = getSize();
//设背景为白色
g.setColor(Color.white);
g.fillRect(0,0,dim.width,dim.height);
//设置字体颜色
g.setColor(Color.black);
//画出字母
for(int i=0;i<numbers.size();i++){
//获取字母
String ch = numbers.get(i);
//获取x坐标
int x = x_index.get(i);
//写字母
g.drawString(ch,x,y_index);
}
}
@Override
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
for(String str:numbers){
char[] chars = str.toCharArray();
char ch = chars[0];
if(ch == c){
numbers.remove(str);
break;
}
}
}
//主函数
public static void main(String[] args) {
MoveGame moveGame = new MoveGame();
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}