首页 > 编程语言 >跟着王洋老师学编程 - 1.8 打字母游戏

跟着王洋老师学编程 - 1.8 打字母游戏

时间:2024-02-02 22:56:58浏览次数:23  
标签:LetterPanel String 10 王洋 编程 1.8 int lp new

案例简述

在一个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

相关文章

  • [Java]静态代理、动态代理(基于JDK1.8)
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18002823出自【进步*于辰的博客】参考笔记一,P83;笔记二,P75.4。目录1、静态代理1.1概述1.2静态代理的两种形式1.2.1面向接口1.2.2面向继承2、动态代理2.1什么是动态代......
  • C++编程练习||创建一个名为Rational的类,进行分数运算。
    题目:创建一个名为Rational的类,进行分数运算。创建一个名为Rational的类,进行分数运算。用整数变量表示类的private数据-numerator(分子)和denominator(分母)。提供一个带默认值的构造函数,并且它应该以简化的形式保存分数。例如分数2/4应在对象中保存为numerator为1,denominator为2的形式。......
  • C++编程练习||Account类:创建一个名为Account的类,银行可以使用它表示客户的银行帐户||I
    1.Account类题目:创建一个名为Account的类,银行可以使用它表示客户的银行帐户。这个类应该包括一个类型为double的数据成员,表示帐户余额。这个类提供一个构造函数,它接受初始余额并用它初始化数据成员。这个构造函数应当确认初始余额的有效性,保证它大于或等于0。否则,余额应设置为0......
  • Windows内核开发-[6]、内核编程基础(3)
    内存分配在应用层编程时,系统提供了GlobalAlloc/HeapAlloc/LocalAlloc等函数。C/C++库提供了malloc函数,以及new操作符在堆上分配内存。在我前面一个关于Windows页交换文件的博客中,介绍了虚拟内存,虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的......
  • canonical 在计算机编程领域的含义
    canonical在计算机编程领域中有多重含义,主要取决于上下文和所指的领域。以下是canonical在不同情境下的含义及相应示例:数据结构与算法:在数据结构与算法中,canonical常用来描述一个问题或者数据结构的标准或典型表达。这通常是指最常见或最经典的表达方式,可以作为学习和理解的......
  • Linux系统编程49 信号 - sigprocmask() 设置信号集当中信号的mask信号屏蔽字
    sigprocmask():虽然我不知道信号什么时候来,但是我可以决定什么时候响应信号信号集:NAMEsigemptyset,sigfillset,sigaddset,sigdelset,sigismember-POSIXsignalsetoperationsSYNOPSIS#include<signal.h>intsigemptyset(sigset_t*set);清空信号集intsigfi......
  • WebAssembly核心编程[3]: Module 与 Instance
    WebAssembly程序总是以模块来组织,模块是基本的部署、加载和编译单元。在JavaScript编程接口中,模块通过WebAssembly.Module类型表示。WebAssembly.Module通过加载的.wasm二进制文件创建而成,它承载了描述wasm模块的元数据,类似于描述程序集的Assembly对象。WebAssembly.Module自身是......
  • Day01 GUI编程入门
    GUI编程入门告诉大家该怎么学?这是什么?它怎么玩?该如何去在我们平时运用?组件窗口弹窗面板文本框列表框按钮图片监听事件鼠标键盘事件破解工具1、简介Gui的核心技术:SwingAWT不流行的原因:​1.因为界面不美观。​2.需要jre环......
  • Java之网络编程的详细解析
    1.网络编程入门1.1网络编程概述计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统网络编程在网络通信协议下,不同计算机上运行的程序,可以进行......
  • shell编程
    1.在/tmp下新建一个名为missing的文件夹。mkdir/tmp/missing2.用man查看程序touch的使用手册mantouch3.用touch在missing文件夹中新建一个叫semester的文件touch用于修改文件的时间属性,如果没有目标文件,则会新建一个目标文件touch/tmp/missing/semest......