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日
最近浏览更多
qqqww11 LV2
6月26日
2064961572
6月14日
暂无贡献等级
wppppp LV3
6月4日
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日