java实现一个简单的打字游戏

实现逻辑:一个画板实现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);
    }
}

效果演示:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值