首页>代码>java swing编写的一个打字小游戏>/KeyGame1/src/cn/guida/keyGame/KeyPanel.java
package cn.guida.keyGame;

import java.awt.Color;
import java.awt.Font;
//导入画笔类
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.sql.Time;
import java.util.Random;

import javax.imageio.ImageIO;
//导入面板类
import javax.swing.JPanel;
import javafx.scene.media.AudioClip;
/**
 * 这是面板类
 * @author Administrator
 *
 */
/*继承:子类继承父类,子类拥有父类的特征
 *      子类可以重写和加强父类的方法
 * 语法: 子类  extends 父类
 */
public class KeyPanel extends JPanel implements KeyListener {
	
	int[] x = new int[10];//装x坐标
	int[] y = new int[10];//装y坐标
	char[] ch = new char[10];//装字符

	public boolean flagPause = false;
	
	//定义分数
	private int score = 0;
	/*
	 * 构造方法:给属性赋初始值
	 * 语法:类名(){赋值的过程} 构造方法的方法名和类名一致
	 */
	KeyPanel() {
		Random ran = new Random();
		//for循环给x,y,ch数组赋值
		for(int i=0 ; i<10 ; i++) {
			x[i] = ran.nextInt(27)*25;
			y[i] = ran.nextInt(24)*25;
			ch[i] = (char)(ran.nextInt(26)+97);	
		}
	}
	//定义图片 图片属于静态资源,使用static修饰
	public static BufferedImage sky;
	/**
	 *给静态资源(图片,音乐,视频)
	 *一般使用静态代码块
	 *随着类的加载而加载 
	 */
	static {
		try {
			sky = ImageIO.read(KeyPanel.class.getResource("sky2.jpg"));
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("图片加载错了");
		}
	}
	/**
	 * 画画的方法:只负责画
	 */
	public void paint(Graphics g) {
		//画背景图
		g.drawImage(sky, 0, 0, null);
		//设置画笔颜色
		g.setColor(Color.green);
		//设置画笔的字体
		g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,25));
		//使用for循环画出10个字符
		for(int i=0 ; i<10 ; i++) {
			g.drawString(ch[i]+"",x[i],y[i]);
		}
		
		g.setColor(Color.YELLOW);
		
		g.drawString("SCORE:"+score, 10, 25);
		if (flagPause) {
			g.setColor(Color.red);
			g.drawString("游戏暂停", 350, 350);
		}
		if (score<=-100) {
			g.setColor(Color.red);
			g.drawString("GAMEOVER!", 300, 300);
		}
		
	}
	/**
	 * 字符下移
	 */
	public void run() {
		AudioClip ac;
	    ac = new AudioClip(new File("src\\music\\南宫嘉骏、彭清 - 回忆总想哭 (DJ何鹏版).mp3").toURI().toString());
	    ac.play();   //开始播放
	    ac.setCycleCount(1000);  //设置循环次数
		
		int[] xSpeed = new int[10];
		for (int i = 0; i < xSpeed.length; i++) {
			xSpeed[i]=1;
		}
		
			while((score >-100)) {
			if(!flagPause) {
				
			//1,改坐标
			for(int i=0 ; i<10 ; i++) {
				y[i]++;
				//x坐标可以左右移动,碰到边界可以弹回
				if(x[i]>670|x[i]<0) {
					xSpeed[i]=-xSpeed[i];
				}
				x[i]+=xSpeed[i];
				//如果字符的y坐标越界(大于700),则重新生成字符和坐标
				if(y[i]>700) {
					Random ran = new Random();
					y[i] = 0;
					x[i] = ran.nextInt(27)*25;
					ch[i] = (char)(ran.nextInt(26)+97);
					score-=10;//字符越界,分数减去10
				}
			}
			//2,重画
			repaint();//repaint方法底层调用paint方法
			//3,控制速度
			/**
			 * Thread:线程,这里可以理解为键盘打字游戏
			 * sleep(500):线程暂停500毫秒,这里可以累积理解为两次移动的间隔时间
			 */
			try {
				Thread.sleep(50);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	 }
	}
    /**
     * 按键方法,通过按键实现某个功能
     * KeyEvent:键盘事件类
     * e:键盘事件,可以调用方法获取按键的编码,字符等
     */
	public void keyPressed(KeyEvent e) {
		//得到按键的字符
		char keyC = e.getKeyChar();
		//将输入的字符统一转为小写
		keyC = Character.toLowerCase(keyC);	
		if ((int)keyC==32|(int)keyC==13) {
			score+=10;
			if (!flagPause) {
				flagPause=true;
			} else {
				flagPause=false;
			}
			//break;
		}
		//输出keyC
		//System.out.println(keyC);
		//maxY用来存储最大的y坐标
		int maxY = -1;
		//maxYIndex用来自大的y的下标
		int maxYIndex = -1;
		for (int i = 0; i < 10; i++) {
			//如果敲对了
			if (keyC == ch[i]) {
				//比较出最大的y
				if (y[i]>maxY) {
					maxY = y[i];
					maxYIndex = i;
				}
			}
		}
		//如果maxY不等于-1,说明匹配对了,则重新生成字符及其坐标
		if (maxY != -1) {
			y[maxYIndex] = 0;
			Random ran = new Random();
			x[maxYIndex] = ran.nextInt(27)*25;
			ch[maxYIndex] = (char)(ran.nextInt(26)+97);
			score+=10;
		}else {
			score-=10;
		}
		
	}
	

	@Override
	public void keyReleased(KeyEvent e) {
		
		
	}
	@Override
	public void keyTyped(KeyEvent e) {
		
		
	}
}
最近下载更多
linlinlin1  LV1 3月25日
你们的代码都是我的了  LV16 2023年8月21日
xingxing1234  LV10 2023年3月22日
baoxing567  LV9 2021年5月11日
zhuangshouna  LV14 2020年12月7日
段朝洪  LV15 2020年11月21日
哇哈哈哈6451sadfd  LV1 2020年7月1日
笑得很美  LV11 2020年6月13日
hz1918  LV1 2020年5月10日
sddsdddd  LV1 2020年1月3日
最近浏览更多
linlinlin1  LV1 3月25日
shiaomon 2023年12月14日
暂无贡献等级
你们的代码都是我的了  LV16 2023年8月21日
2385649653  LV7 2023年6月25日
KAIzx11  LV7 2023年6月24日
655982592  LV2 2023年5月11日
xingxing1234  LV10 2023年3月22日
微信网友_5992582549164032  LV6 2023年2月16日
总有人间一两风  LV8 2022年12月12日
103463  LV1 2022年12月5日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友