Java 实现简单打字游戏

打字游戏

题目:

编写一个打字游戏,从一个面板顶端随机出现一些字母,字母按一定的时间自顶向下移动,如果字母接触到面板底端则Game Over,用户可以通过敲击键盘消除移动中的字母。

  1. 绘制出GUI界面的简易图
  2. 生成含有大小写随机字母并记录的方法
  3. 字母移动并显示的线程类
  4. 敲击键盘事件的响应方法(用于消除字母)

代码实现:

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) {

    }

}

发布了25 篇原创文章 · 获赞 12 · 访问量 2916

猜你喜欢

转载自blog.csdn.net/ALone_cat/article/details/103516468