JAVA小游戏之打字母(简单版和升级版)

简单版:

规则:没有时间限制,点对加十分,出界抠十分

import javax.swing.*;
import java.awt.*;

/**
 *  原理:
 *  1.生成字母 (绘制字母)
 *  2. 生成坐标系 x y char
 *  3. 随机字母位置 xy color char
 *  4. 按键事件检测
 *  5. 多线程
 *        1.监听键盘
 *        2、同时生成字母
 *  6. 显示分数
 * */
public class ChatGameDemo {
    public static void main(String[] args) {
        //创建窗口
        JFrame frame = new JFrame();
        //创建绘制容器
        CharPanel panel = new CharPanel();
        frame.setBounds(100,100,375,675);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setBackground(Color.BLACK);
        panel.setBackground(Color.BLACK);


        //键盘事件
        frame.addKeyListener(panel);
        panel.addKeyListener(panel);

        Thread thread = new Thread(panel);
        thread.start();
        frame.setVisible(true);
    }
}

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;

public class CharPanel extends Panel implements Runnable, KeyListener {

    // 字母坐标系
    int [] x = new int[10];
    int [] y = new int[10];

    //字母
    char[] chars = new char[10];

    //字母颜色 rgb格式 0-255
    int[] r = new int[255];
    int[] g = new int[255];
    int[] b = new int[255];

    // 分数
    int score = 100;

    public CharPanel() {

        //随机生成字母
        for (int i = 0; i < 10; i++) {
            x[i] = (int) (Math.random() * 300);
            y[i] = (int) (Math.random() * 600);

            chars[i] = (char) (Math.random() * 26 + 97);

            r[i] = (int) (Math.random() * 255);
            g[i] = (int) (Math.random() * 255);
            b[i] = (int) (Math.random() * 255);

        }
    }

    @Override
    public void paint(Graphics graphics) {
        super.paint(graphics);
        Font font1 = new Font("",Font.BOLD,20);
        graphics.setFont(font1);
        graphics.setColor(Color.red);
        if (score < 0){
            graphics.drawString("游戏结束",100,100);
            return ;
        }
        //绘制分数
        graphics.drawString("得分 :" + score,10,20);
        //绘制字母
        Font font2 = new Font("",Font.BOLD,25);
        graphics.setFont(font2);
        for (int i = 0; i < 10; i++) {
            graphics.setColor(new Color(r[i],g[i],b[i]));
            graphics.drawString(""+chars[i],x[i],y[i]);
        }

    }

    //监听键盘
    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        //对所有的按键都有唯一的键盘码
        //新的坐标
        int ny = -1;
        int index = -1;
        for (int i = 0; i < 10; i++) {
            if(e.getKeyChar() == chars[i]){
                if(ny < y[i]){
                    ny = y[i];
                    index = i;
                }
            }
        }
        if(index > -1){
            y[index] = 0;
            x[index] = (int) (Math.random() * 300);
            chars[index] = (char) (Math.random() * 26 +  97);
            score += 10;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void run() {
        while(true){
            for (int i = 0; i < 10; i++) {
                y[i] += 5;
                if(y[i] > 500){
                    y[i] = 0;
                    score -= 10;
                }
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            repaint();
        }
    }
}

升级版:

新增:添加了结束时间,添加了数据库,展示前3名的成绩

规则:在规定时间内,点对一个字符加二十,出界抠10

注意事项:需要自己导入数据库jar包,和创建数据库!!!

注意事项:需要自己导入数据库jar包,和创建数据库!!!

注意事项:需要自己导入数据库jar包,和创建数据库!!!

jar包自己网上找资源

数据库表 typingscore

CREATE TABLE `typing_score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `score` int(11) NOT NULL COMMENT '分数',
  `time` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='打字游戏得分';

图片资源:

 

主方法



import javax.swing.*;
import java.awt.*;

public class MyTying {
    public static void main(String[] args) {
        JFrame frame = new JFrame("java 打字游戏 ");
        frame.setSize(400,600);
        frame.setLocationRelativeTo(null);
        MyPanel panel = new MyPanel();
        frame.add(panel);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //想用自己的图片记得改路径
        ImageIcon imageIcon = new ImageIcon("src/打字图标.jpg");
        frame.setIconImage(imageIcon.getImage());
        frame.setBackground(Color.BLACK);
        panel.setBackground(Color.BLACK);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.addKeyListener(panel);
        panel.addKeyListener(panel);
        new Thread(panel).start();
    }
}

MyPanel



import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;

public class MyPanel extends Panel implements Runnable, KeyListener {
    int [] x = new int[10];
    int [] y = new int[10];
    char [] ch = new char[10];

    int [] r = new int[10];
    int [] g = new int[10];
    int [] b = new int[10];
    public MyPanel() {
        for (int i = 0; i < 10; i++) {
            x[i] = (int) (Math.random() * 400);
            y[i] = (int) (Math.random() * 600);
            ch[i] = (char) (Math.random() *  26 + 97);
            r[i] = (int) (Math.random() *  255);
            g[i] = (int) (Math.random() *  255);
            b[i] = (int) (Math.random() *  255);
        }
    }
    long startTime = System.currentTimeMillis();
    long time = 5;   //游戏时间
    long surplusTime = time;
    int score = 50;
    boolean isSend = false;
    @Override
    public void paint(Graphics graphics) {

        super.paint(graphics);
        if (surplusTime > 0){
            Font font = new Font("",Font.BOLD,20);
            graphics.setFont(font);
            graphics.setColor(Color.RED);
            graphics.drawString("得分 :" + score,10,20);
            graphics.drawString("剩余时间 :" + surplusTime,10,40);
        }
        else {
            Font font1 = new Font("楷体",Font.BOLD,30);
            graphics.setFont(font1);
            graphics.setColor(Color.RED);
            graphics.drawString("游戏结束",115,150);
            graphics.drawString("your score is :" + score,50,200);
            if (!isSend){
                TypingScore typingScore = new TypingScore();
                typingScore.setTime((int) (System.currentTimeMillis() / 100000));
                typingScore.setScore(score);
                TypingJDBC.insert(typingScore);
                isSend = true;
            }
            graphics.setFont(new Font("TimesRoman",Font.PLAIN,25));
            List <TypingScore> scores = TypingJDBC.getTop3();
            graphics.drawString("成绩TOP3排行榜 :",100,230);
            for (int i = 0; i < scores.size(); i++) {
                graphics.drawString("第 " + (i + 1) + "名 :" + scores.get(i).getScore() ,100,230 + (i+1) * 25);
            }
            return;
        }
        for (int i = 0; i < 10; i++) {
            graphics.setColor(new Color(r[i],g[i],b[i]));
            graphics.drawString(""+ch[i],x[i],y[i]);
        }
    }

    @Override
    public void run() {
        while(surplusTime > 0){
            surplusTime = time - (System.currentTimeMillis() - startTime) / 1000;
            for (int i = 0; i < 10; i++) {
                y[i] += 5;
                if (y[i] >= 500){
                    y[i] = 0;
                    score -= 10;   //出界未消除
                }
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            repaint();
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int ny = -1;
        int index = -1;
        for (int i = 0; i < 10; i++) {
            if(e.getKeyChar() == ch[i]){
                if(ny < y[i]){  //找到最下面的一个相同字符
                    ny = y[i];
                    index = i;
                }
            }
        }
        if(index > -1){
            y[index] = 0;
            x[index] = (int) (Math.random() * 400);
            ch[index] = (char) (Math.random() * 26 + 97);
            score += 20;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

TypingScore



public class TypingScore {
    private Integer id;
    private Integer score;
    private Integer time;

    public TypingScore() {
    }

    public TypingScore(Integer id, Integer score, Integer time) {
        this.id = id;
        this.score = score;
        this.time = time;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    public Integer getTime() {
        return time;
    }

    public void setTime(Integer time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return "TypingScore{" +
                "id=" + id +
                ", score=" + score +
                ", time=" + time +
                '}';
    }
}

TypingJDBC 


import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class TypingJDBC {
    private static Connection conn = null;
    private static Statement statement = null;

    //添加分数到数据库
    public static void insert(TypingScore score){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chatgame","root","root");
            statement = conn.createStatement();
            String sql = "insert into typingScore (score,time) values (" + score.getScore() + ","
                    + score.getTime() + ")";
            statement.executeUpdate(sql);

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (statement != null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }

        }

    }

    //获取前三名成绩
    public static List<TypingScore> getTop3(){
        ResultSet rs = null;
        List <TypingScore> scores = new ArrayList<>();
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chatgame","root","root");
            statement = conn.createStatement();
            String sql = "select * from typingScore order by score desc limit 0,3";
            rs = statement.executeQuery(sql);
            while (rs.next()){
                TypingScore typingScore = new TypingScore();
                int id = rs.getInt("id");
                int score = rs.getInt("score");
                int time = rs.getInt("time");
                typingScore.setId(id);
                typingScore.setScore(score);
                typingScore.setTime(time);
                scores.add(typingScore);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return scores;
    }
}

  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值