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);
    }
}

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

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,这里是一个简单打字游戏示例,使用Java Swing编写。 ```java import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.Timer; public class TypingGame extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private static final int WIDTH = 600; private static final int HEIGHT = 400; private JLabel scoreLabel; private JLabel timeLabel; private JTextField textField; private JPanel gamePanel; private int score; private int timeLeft; private Timer timer; private Random random; private String[] words = { "java", "programming", "computer", "language", "algorithm", "software" }; public TypingGame() { super("Typing Game"); setPreferredSize(new Dimension(WIDTH, HEIGHT)); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(new BorderLayout()); scoreLabel = new JLabel("Score: 0"); scoreLabel.setFont(new Font("Arial", Font.BOLD, 16)); scoreLabel.setForeground(Color.BLUE); mainPanel.add(scoreLabel, BorderLayout.NORTH); gamePanel = new JPanel(); gamePanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); mainPanel.add(gamePanel, BorderLayout.CENTER); timeLabel = new JLabel("Time left: 30"); timeLabel.setFont(new Font("Arial", Font.BOLD, 16)); timeLabel.setForeground(Color.RED); mainPanel.add(timeLabel, BorderLayout.SOUTH); textField = new JTextField(20); textField.setFont(new Font("Arial", Font.PLAIN, 16)); textField.addActionListener(this); gamePanel.add(textField); add(mainPanel); pack(); setLocationRelativeTo(null); score = 0; timeLeft = 30; random = new Random(); timer = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { timeLeft--; timeLabel.setText("Time left: " + timeLeft); if (timeLeft == 0) { endGame(); } } }); timer.start(); newWord(); } private void newWord() { String word = words[random.nextInt(words.length)]; gamePanel.removeAll(); gamePanel.add(new JLabel(word)); textField.setText(""); pack(); } private void endGame() { timer.stop(); textField.setEnabled(false); gamePanel.removeAll(); gamePanel.add(new JLabel("Game over!")); pack(); } @Override public void actionPerformed(ActionEvent e) { String input = textField.getText().trim(); String word = ((JLabel) gamePanel.getComponent(0)).getText(); if (input.equals(word)) { score++; scoreLabel.setText("Score: " + score); newWord(); } else { textField.setText(""); } } public static void main(String[] args) { TypingGame game = new TypingGame(); game.setVisible(true); } } ``` 这个游戏有一个单词列表,每次随机选择一个单词并将其显示在屏幕上。玩家必须在文本框中输入正确的单词,以赚取分数。游戏时间为30秒,计时器会在游戏结束时停止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值