package com.wordgame;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 键盘练习小游戏
* 步骤如下:
* 1--配置界面
* 2--配置内容面板并固定到界面上
* 3--使界面窗口类实现了一个键盘监听接口,
* 在所实现的方法中,按条件执行程序正常退出。
* 4--创建26个字母
* 5--要求26个字母能随机的显示在内容面板上
* (颜色、坐标、自己做的时候,还可以加上每个字母下落的速度)
* 6--在线程中实现每个字母按照y轴方向下落
* 7--单机键盘,对应的字母消失,并随即增加一个字母对象到容器中
* 8--当字母落到界面一下时,该字母自动被清楚,并重新生成一个字母添加到容器中
* 9--字母去重复处理
* 10--设置关数:当分数到达某个值时,把延时的设置时间调整的小一些,这样可以增加难度
*/ //实现键盘监听接口
public class WordFrame extends JFrame implements KeyListener{
private static final long serialVersionUID = 1L;
WordPanel wp = null ;//自定义内容面板(纸)的引用变量
char[] ws = new char[]{
'a','b','c','d','e',
'f','g','h','i','j',
'k','l','m','n','o',
'p','q','r','s','t',
'u','v','w','x','y',
'z'
};
LinkedList<Word> words = new LinkedList<Word>();
int x , y , R ,G ,B ,valueIndex ;
int score = 0 ;
Random r = new Random();
LinkedList<Integer> indexs = new LinkedList<Integer>();
int index = 0 ;
public WordFrame(){//窗口类无参构造方法
super();
this.init();//调用窗口的初始化方法
}
public void init(){//游戏窗口初始化方法
this.setUndecorated(true);//无边框
this.setAlwaysOnTop(true);//窗口始终处于最前端
this.setSize(800, 600);//设置窗口的尺寸
this.setLocationRelativeTo(null);//窗口显示在显示器的正中间
wp = new WordPanel();//调用构造方法,创建对象赋值给自定义的引用变量
Thread th = new Thread(wp);
th.start();
this.add(wp);//固定到窗口上(画板)
this.setVisible(true);//告诉jvm将配置好的窗口显示出来
this.addKeyListener(this);//注册键盘监听
}
class WordPanel extends JPanel implements Runnable{
private static final long serialVersionUID = 1L;
public WordPanel() {//游戏内容面板类的无参构造方法
super();
this.init();//调用内容面板的初始化方法
}
public void init(){//内容面板的初始化方法
this.setBackground(Color.BLACK);//设置内容面板的背景色
this.loadWords();//调用装载容器的方法
}
public void paint(Graphics g){//画的方法
super.paint(g);
g.setColor(Color.WHITE);
g.drawString("您的分数为:"+score, 60, 60);
g.setFont(new Font("",Font.ITALIC,35));//设置字母尺寸和样式
for (int j = 0; j < words.size(); j++) { //对每一个字母操作
g.setColor(
new Color(
words.get(j).getR(),
words.get(j).getG(),
words.get(j).getB()
)
);//设置每个字母的颜色
g.drawString(
ws[words.get(j).getValueIndex()]+"", //注意这里
words.get(j).getX(),
words.get(j).getY()
);//用画笔在界面上画一个字符串
}
}
//自定义方法 装载26个字母到集合(LinkedList)容器中
public void loadWords(){
for (int i = 0; i < 26; i++) {
this.getNewWord(); //调用下面的方法装载26次新字母对象
}
}
//创建一个字母
public void getNewWord(){
this.getWordData();//创建对象之前获取一组数据
words.add(new Word(R,G,B,x,-y,valueIndex));//创建一个对象
}
//随机产生一组字母属性值
public void getWordData(){
x = r.nextInt(800);
y = r.nextInt(600);
R = r.nextInt(255);
G = r.nextInt(255);
B = r.nextInt(255);
for(;;){
index = r.nextInt(26);
if(!indexs.contains(index)){
valueIndex = index ;
indexs.add(index);
break ;
}
}
}
@Override
public void run() {
for(;;){//死循环
//1--让每一个字母的y坐标值下降一个位置
for (int i = 0; i < words.size(); i++) {
words.get(i).setY(words.get(i).getY()+2);
if(words.get(i).getY()>=600){
for (int j = 0; j < indexs.size(); j++) {
if(words.get(i).getValueIndex()==indexs.get(j)){
indexs.remove(j);
}
}
words.remove(i);
score = score - 10 ;
this.getNewWord() ;
}
}
//2--延时50毫秒
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//执行重画方法
this.repaint();
}
}
}
public static void main(String[] args) { //程序的入口
new WordFrame();//调用窗口类的无参数构造方法
}
//实现键盘监听接口需要实现的三个方法
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) { //当键盘上的键被按下的瞬间被调用的方法
if(e.getKeyCode()==KeyEvent.VK_SPACE){//当按键键值和空格键的键值相同时,
// System.exit(0);
Runtime.getRuntime().exit(0);//执行程序正常退出
}
for (int i = 0; i < words.size(); i++) {
if(e.getKeyChar()==ws[words.get(i).getValueIndex()]){
for (int j = 0; j < indexs.size(); j++) {
if(words.get(i).getValueIndex()==indexs.get(j)){
indexs.remove(j);
}
}
words.remove(i); //从集合中删除指定字母的对象
score = score + 10 ;
wp.getNewWord();//重新调用内容面板类中的向容器中添加一个字母对象的方法
}
}
}
@Override
public void keyReleased(KeyEvent e) {}
/**
* 这是一个字母对象
*/
class Word implements Serializable{
private static final long serialVersionUID = 1L;
//颜色
int R ;
int G ;
int B ;
//坐标
int x ;
int y ;
//下标值
int valueIndex ;
public Word() {
super();
// TODO Auto-generated constructor stub
}
public Word(int r, int g, int b, int x, int y, int valueIndex) {
super();
R = r;
G = g;
B = b;
this.x = x;
this.y = y;
this.valueIndex = valueIndex;
}
public int getR() {
return R;
}
public void setR(int r) {
R = r;
}
public int getG() {
return G;
}
public void setG(int g) {
G = g;
}
public int getB() {
return B;
}
public void setB(int b) {
B = b;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getValueIndex() {
return valueIndex;
}
public void setValueIndex(int valueIndex) {
this.valueIndex = valueIndex;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + B;
result = prime * result + G;
result = prime * result + R;
result = prime * result + valueIndex;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Word other = (Word) obj;
if (B != other.B)
return false;
if (G != other.G)
return false;
if (R != other.R)
return false;
if (valueIndex != other.valueIndex)
return false;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
@Override
public String toString() {
return "Word [R=" + R + ", G=" + G + ", B=" + B + ", x=" + x + ", y="
+ y + ", valueIndex=" + valueIndex + "]";
}
}
}
java swing 打字母 小游戏 复制粘贴可以
最新推荐文章于 2024-05-09 22:54:27 发布
这是一个使用Java Swing编写的键盘练习小游戏,玩家需要在字母随机下落的过程中通过键盘击打相同的字母以得分。游戏包含字母生成、下落、颜色、坐标管理等功能,实现了键盘监听和窗口管理。

3146

被折叠的 条评论
为什么被折叠?



