简单版:
规则:没有时间限制,点对加十分,出界抠十分
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;
}
}