java swing 打字母 小游戏 复制粘贴可以

这是一个使用Java Swing编写的键盘练习小游戏,玩家需要在字母随机下落的过程中通过键盘击打相同的字母以得分。游戏包含字母生成、下落、颜色、坐标管理等功能,实现了键盘监听和窗口管理。
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 + "]";
	}
	
	
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值