案例简述
在一个300*400的窗体上,有10个随机产生的字母向下落,在键盘上敲字母,如果对了就消掉,初始成绩为1000分,每敲对一个字母加10分,如果字母落到屏幕下方,或者敲错扣100分。
我的思路
- 创建一个窗体
- 创建一个字母画布类 —— 继承画布类Panel、编写构造方法以初始化数据,实现多线程接口、重写run方法,实现键盘监听接口、重写其中的抽象方法,
- 将画布添加至窗体,启动线程,将窗体设置为可见
代码一
1 import java.awt.*; 2 public class LetterGame{ 3 public static void main(String args[]){ 4 Frame w = new Frame(); 5 w.setSize(400,300); 6 7 LetterPanel lp = new LetterPanel(); 8 w.add(lp); 9 10 w.addKeyListener(lp); 11 lp.addKeyListener(lp); 12 13 Thread t = new Thread(lp); 14 t.start(); 15 16 w.setVisible(true); 17 } 18 } 19 20 class LetterPanel extends Panel implements Runnable,KeyListener{ 21 String ls="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 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"; 22 // 初始化字母数组 23 String[] cs; 24 // 初始化积分 25 int score = 1000; 26 int[] xs=[],ys=[]; 27 public LetterPanel(){ 28 for (int i=0; i<10;i++){ 29 cs[i]=ls.split("")[(int)(Math.random()*52)]; 30 xs[i]=(int)(Math.random()*400); 31 ys[i]=(int)(Math.random()*300); 32 } 33 System.out.println(cs); // 打印cs数组试试 34 } 35 36 public void paint(Graphics g){ 37 for(int j=0;j<10;j++){ 38 g.drawString(cs[j],xs[j],ys[j]); 39 } 40 } 41 // 所有字母持续下落,直到积分清0 42 public void run(){ 43 while(score>0){ 44 for (int k=0; k<10;k++){ 45 xs[k]-=(int)(Math.random()*40); 46 ys[k]-=(int)(Math.random()*30); 47 if(xs[k]>300 || ys[k]>400){ 48 score-=50; 49 } 50 } 51 try{ 52 Thread.sleep(300); 53 }catch(Exception e){ 54 System.out.println(e); 55 } 56 repaint(); 57 } 58 } 59 60 @Override 61 public void keyPressed(KeyEvent ke){ 62 int kc = ke.getKeyChar(); 63 System.out.println(kc); 64 for(int m=0;m<10;m++){ 65 char c = String.copyValueOf(cs[m]); 66 char c2 = cs.charAt(m); 67 System.out.println(c + " " + c2); 68 if(kc==c2 || kc == c){ 69 score +=10; 70 ys[m]=300; 71 // 补充掉落的字母 72 cs[k]=ls.split("")[(int)(Math.random()*52)]; 73 xs[k]=(int)(Math.random()*400); 74 ys[k]=(int)(Math.random()*300); 75 } 76 } 77 } 78 @Override 79 public void keyReleased(KeyEvent ke){ 80 81 } 82 @Override 83 public void keyTyped(KeyEvent ke){ 84 85 } 86 }
编译报错:
看起来是定义字母的X\Y数组时不规范,修改代码重新执行。
代码二
1 class LetterPanel extends Panel implements Runnable,KeyListener{ 2 String ls="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 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"; 3 // 初始化字母数组 4 String[] cs; 5 // 初始化积分 6 int score = 1000; 7 int[] xs,ys; // 去掉了=[] 8 public LetterPanel(){ 9 for (int i=0; i<10;i++){ 10 cs[i]=ls.split("")[(int)(Math.random()*52)]; 11 xs[i]=(int)(Math.random()*400); 12 ys[i]=(int)(Math.random()*300); 13 } 14 System.out.println(cs); // 打印cs数组试试 15 } 16 17 public void paint(Graphics g){ 18 for(int j=0;j<10;j++){ 19 g.drawString(cs[j],xs[j],ys[j]); 20 } 21 }
编译仍然报错:
看起来,将xs,ys定义在一行,好像不行,修改试试。
代码三
1 class LetterPanel extends Panel implements Runnable,KeyListener{ 2 String ls="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 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"; 3 // 初始化字母数组 4 String[] cs; 5 // 初始化积分 6 int score = 1000; 7 int[] xs; 8 int[] ys; // 将xs,ys拆分为两行 9 public LetterPanel(){ 10 for (int i=0; i<10;i++){ 11 cs[i]=ls.split("")[(int)(Math.random()*52)]; 12 xs[i]=(int)(Math.random()*400); 13 ys[i]=(int)(Math.random()*300); 14 } 15 System.out.println(cs); // 打印cs数组试试 16 }
编译报错,上一个问题解决了,因此暴露出更多问题
经过排查,发现三类问题:
1. 一个类可以实现多个接口,因此错误应该不在标点符号之类,再检查,发现,没有导入java.awt.event.*,需要补上;
2. String类型 和 char 类型 的转换仍然有问题,百度时,忽然想到string类型能不能之间转int,结果竟然有这种做法! Integer.parseInt("123")—— 需要专题研究
3. 再检查,发现总是找不到k,发现补充新的字母时,循环的变量未修改
代码四
1 import java.awt.*; 2 import java.awt.event.*; 3 public class LetterGame{ 4 public static void main(String args[]){ 5 Frame w = new Frame(); 6 w.setSize(400,300); 7 8 LetterPanel lp = new LetterPanel(); 9 w.add(lp); 10 11 w.addKeyListener(lp); 12 lp.addKeyListener(lp); 13 14 Thread t = new Thread(lp); 15 t.start(); 16 17 w.setVisible(true); 18 } 19 } 20 21 class LetterPanel extends Panel implements Runnable,KeyListener{ 22 String ls="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 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"; 23 // 初始化字母数组 24 String[] cs; 25 // 初始化积分 26 int score = 1000; 27 int[] xs; 28 int[] ys; // 将xs,ys拆分为两行 29 public LetterPanel(){ 30 for (int i=0; i<10;i++){ 31 cs[i]=ls.split(" ")[(int)(Math.random()*52)]; 32 xs[i]=(int)(Math.random()*400); 33 ys[i]=(int)(Math.random()*300); 34 } 35 System.out.println(cs); // 打印cs数组试试 36 } 37 38 public void paint(Graphics g){ 39 this.setBackground(Color.black); 40 for(int j=0;j<10;j++){ 41 g.setColor(Color.white); // 背景-#fef3d7 字母#fdcb23 #7bc9d1 #f1827a #a8c83b #ef8277 42 g.drawString(cs[j],xs[j],ys[j]); 43 } 44 } 45 // 所有字母持续下落,直到积分清0 46 public void run(){ 47 while(score>0){ 48 for (int k=0; k<10;k++){ 49 xs[k]-=(int)(Math.random()*40); 50 ys[k]-=(int)(Math.random()*30); 51 if(xs[k]>300 || ys[k]>400){ 52 score-=50; 53 } 54 } 55 try{ 56 Thread.sleep(300); 57 }catch(Exception e){ 58 System.out.println(e); 59 } 60 repaint(); 61 } 62 } 63 64 @Override 65 public void keyPressed(KeyEvent ke){ 66 int kc = ke.getKeyCode(); 67 System.out.println("kc: "+kc); 68 for(int m=0;m<10;m++){ 69 int c = Integer.parseInt(cs[m]); 70 System.out.println("c: "+c); 71 if(kc == c){ 72 score +=10; 73 ys[m]=300; 74 // 补充掉落的字母 75 cs[m]=ls.split(" ")[(int)(Math.random()*52)]; 76 xs[m]=(int)(Math.random()*400); 77 ys[m]=(int)(Math.random()*300); 78 } 79 } 80 } 81 @Override 82 public void keyReleased(KeyEvent ke){ 83 84 } 85 @Override 86 public void keyTyped(KeyEvent ke){ 87 88 } 89 }
编译通过!但执行报错了——
仔细看了一下,错误是在主函数的第8行,LetterPanel类的构造方法里第31行 报的,嗯。。对照了一下书中的字母和数字数组,长度没定义……修改如下。
代码五
1 class LetterPanel extends Panel implements Runnable,KeyListener{ 2 String ls="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 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"; 3 // 初始化字母数组 4 string[] cs = new string[10]; 5 // 初始化积分 6 int score = 1000; 7 int[] xs = new int[10]; 8 int[] ys = new int[10]; // 将xs,ys拆分为两行 + 加上长度定义 9 public LetterPanel(){ 10 for (int i=0; i<10;i++){ 11 cs[i]=ls.split(" ")[(int)(Math.random()*51)]; 12 xs[i]=(int)(Math.random()*400); 13 ys[i]=(int)(Math.random()*300); 14 } 15 System.out.println(cs); // 打印cs数组试试 16 }
编译报错:
思考了下,string 与 String不同,所以改一版,然后暴露出更多问题,一口气改了好几版,直到最后……可以用了!!!
代码六
1 import java.awt.*; 2 import java.awt.event.*; 3 public class LetterGame{ 4 public static void main(String args[]){ 5 Frame w = new Frame(); 6 w.setSize(400,300); 7 8 LetterPanel lp = new LetterPanel(); 9 w.add(lp); 10 11 w.addKeyListener(lp); 12 lp.addKeyListener(lp); 13 14 Thread t = new Thread(lp); 15 t.start(); 16 17 w.setVisible(true); 18 } 19 } 20 21 class LetterPanel extends Panel implements Runnable,KeyListener{ 22 // String ls="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 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"; 23 String ls="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 24 char[] lcs=ls.toCharArray(); 25 // 初始化字母数组 26 // String[] cs = new String[10]; 27 // char[] cs = new Character[10]; 28 Character[] cs = new Character[10]; 29 // 初始化积分 30 int score = 1000; 31 int[] xs = new int[10]; 32 int[] ys = new int[10]; // 将xs,ys拆分为两行 + 加上长度定义 33 public LetterPanel(){ 34 for (int i=0; i<10;i++){ 35 // cs[i]=ls.split(" ")[(int)(Math.random()*51)]; 36 cs[i]=lcs[(int)(Math.random()*51)]; 37 xs[i]=(int)(Math.random()*400); 38 ys[i]=(int)(Math.random()*300); 39 System.out.println(cs[i]+" " + ys[i]); // 打印cs数组试试 40 } 41 } 42 43 public void paint(Graphics g){ 44 this.setBackground(Color.black); 45 for(int j=0;j<10;j++){ 46 g.setColor(Color.white); // 背景-#fef3d7 字母#fdcb23 #7bc9d1 #f1827a #a8c83b #ef8277 47 g.drawString(Character.toString(cs[j]),xs[j],ys[j]); 48 } 49 } 50 // 所有字母持续下落,直到积分清0 51 public void run(){ 52 while(score>0){ 53 for (int k=0; k<10;k++){ 54 //xs[k]-=(int)(Math.random()*40); // change 55 ys[k]+=(int)(Math.random()*30); // change 56 if(ys[k]>300){ 57 score-=50; 58 } 59 System.out.println(k +" "+score+cs[k]+" " + ys[k]); // 打印cs数组试试 60 } 61 try{ 62 Thread.sleep(1000); 63 }catch(Exception e){ 64 System.out.println(e); 65 } 66 repaint(); 67 } 68 } 69 70 @Override 71 public void keyPressed(KeyEvent ke){ 72 int kc = ke.getKeyCode(); 73 System.out.println("kc: "+kc); 74 for(int m=0;m<10;m++){ 75 //int c = Integer.parseInt(cs[m]); 76 int c = (int)(cs[m]); 77 System.out.println("c: "+c); 78 if(kc == c){ 79 score +=10; 80 ys[m]=300; 81 // 补充掉落的字母 82 // cs[m]=ls.split(" ")[(int)(Math.random()*52)]; 83 // cs[i]=lcs[(int)(Math.random()*51)]; 84 cs[m]=lcs[(int)(Math.random()*51)]; 85 xs[m]=(int)(Math.random()*400); 86 ys[m]=0; 87 } 88 } 89 } 90 @Override 91 public void keyReleased(KeyEvent ke){ 92 93 } 94 @Override 95 public void keyTyped(KeyEvent ke){ 96 97 } 98 }
发现缺少敲错也要扣分、掉落后也要补字母的逻辑,并作了其他一些微调
1 import java.awt.*; 2 import java.awt.event.*; 3 public class LetterGame{ 4 public static void main(String args[]){ 5 Frame w = new Frame(); 6 w.setSize(400,300); 7 8 LetterPanel lp = new LetterPanel(); 9 w.add(lp); 10 11 w.addKeyListener(lp); 12 lp.addKeyListener(lp); 13 14 Thread t = new Thread(lp); 15 t.start(); 16 17 w.setVisible(true); 18 } 19 } 20 21 class LetterPanel extends Panel implements Runnable,KeyListener{ 22 // String ls="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 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"; 23 String ls="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 24 char[] lcs=ls.toCharArray(); 25 // 初始化字母数组 26 // String[] cs = new String[10]; 27 // char[] cs = new Character[10]; 28 Character[] cs = new Character[10]; 29 // 初始化积分 30 int score = 5000; // 增加初始分数 31 int[] xs = new int[10]; 32 int[] ys = new int[10]; // 将xs,ys拆分为两行 + 加上长度定义 33 public LetterPanel(){ 34 for (int i=0; i<10;i++){ 35 // cs[i]=ls.split(" ")[(int)(Math.random()*51)]; 36 cs[i]=lcs[(int)(Math.random()*51)]; 37 xs[i]=(int)(Math.random()*400); 38 ys[i]=(int)(Math.random()*300); 39 System.out.println(cs[i]+" " + ys[i]); // 打印cs数组试试 40 } 41 } 42 43 public void paint(Graphics g){ 44 this.setBackground(Color.green); 45 for(int j=0;j<10;j++){ 46 //g.setColor(Color.white); // 背景-#fef3d7 字母#fdcb23 #7bc9d1 #f1827a #a8c83b #ef8277 47 g.setColor(Color.yellow); 48 g.setColor(Color.orange); 49 g.setColor(Color.red); 50 g.drawString(Character.toString(cs[j]),xs[j],ys[j]); 51 } 52 } 53 // 所有字母持续下落,直到积分清0 54 public void run(){ 55 while(score>0){ 56 for (int k=0; k<10;k++){ 57 //xs[k]-=(int)(Math.random()*40); // change 58 ys[k]+=(int)(Math.random()*30); // change 59 if(ys[k]>300){ 60 score-=50; 61 // 也要补充掉落的字母 62 cs[k]=lcs[(int)(Math.random()*51)]; 63 xs[k]=(int)(Math.random()*400); 64 ys[k]=0; 65 } 66 System.out.println(k +" "+score+cs[k]+" " + ys[k]); // 打印cs数组试试 67 } 68 try{ 69 Thread.sleep(1000); 70 }catch(Exception e){ 71 System.out.println(e); 72 } 73 repaint(); 74 } 75 } 76 77 @Override 78 public void keyPressed(KeyEvent ke){ 79 int kc = ke.getKeyCode(); 80 boolean boo=true; 81 System.out.println("kc: "+kc); 82 for(int m=0;m<10;m++){ 83 //int c = Integer.parseInt(cs[m]); 84 int c = (int)(cs[m]); 85 System.out.println("c: "+c); 86 if(kc == c){ // 还差一块逻辑,如果没有匹配的,也要扣分 87 score +=10; 88 ys[m]=300; 89 // 补充匹配掉的字母 90 // cs[m]=ls.split(" ")[(int)(Math.random()*52)]; 91 // cs[i]=lcs[(int)(Math.random()*51)]; 92 cs[m]=lcs[(int)(Math.random()*51)]; 93 xs[m]=(int)(Math.random()*400); 94 ys[m]=0; 95 boo=false; 96 } 97 } 98 if(boo){ // 没有匹配也要扣分 99 score-=50; 100 } 101 102 } 103 @Override 104 public void keyReleased(KeyEvent ke){ 105 106 } 107 @Override 108 public void keyTyped(KeyEvent ke){ 109 110 } 111 }
标签:LetterPanel,String,10,王洋,编程,1.8,int,lp,new From: https://www.cnblogs.com/shannonredeemed/p/17945802