目标:
在一个窗体上随机掉落字母,通过键盘输入,敲对后消除并且累计积分,否则扣除一定积分。
具体内容:
画一个窗体——》产生随机字母——》接受键盘输入——》显示分数
代码:
package chapter01; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class MyChar { public static void main(String[] args) { Frame w = new Frame() ; w.setSize(300 , 400) ; MyPanel mp = new MyPanel() ; w.add(mp) ; Thread t = new Thread(mp) ; t.start() ; w.addKeyListener(mp) ; mp.addKeyListener(mp) ; w.show() ; //响应程序关闭按钮 w.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } } ); } } class MyPanel extends Panel implements Runnable , KeyListener{ int x[] = new int[10] ; int y[] = new int[10] ; char c[] = new char[10] ; int score = 1000 ; MyPanel() { for (int i = 0; i < 10; i++) { x[i] = (int)(Math.random()*300) ; y[i] = (int)(Math.random()*300) ; c[i] = (char)(Math.random()*26+97) ; } } @Override public void paint(Graphics g){ for(int i = 0 ; i < 10 ; i ++){ g.drawString(new Character(c[i]).toString(), x[i] , y[i]) ; } //显示成绩 g.setColor(Color.RED) ; g.drawString("你的成绩是:"+score, 5, 15) ; } @Override public void run() { while(true){ for (int i = 0; i < 10; i++) { y[i] ++ ; if(y[i]>400){ y[i] = 0 ; x[i] = (int)(Math.random()*300) ; c[i] = (char)(Math.random()*26+97) ; score -= 100 ; } } try{ Thread.sleep(30) ; }catch(Exception e) { e.printStackTrace(); } repaint() ; } } @Override public void keyPressed(KeyEvent arg0) { char keyC = arg0.getKeyChar() ; int nowY = -1 ; int nowIndex = -1 ; for(int i = 0 ; i < 10 ; i ++){ if(keyC==c[i] && y[i]>nowY){ nowY = y[i] ; nowIndex = i ; } } if(nowIndex!=-1){ y[nowIndex] = 0 ; x[nowIndex] = (int)(Math.random()*300) ; c[nowIndex] = (char)(Math.random()*26+97) ; score += 10 ; }else { score -= 100 ; } } @Override public void keyReleased(KeyEvent arg0) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent arg0) { // TODO Auto-generated method stub } }
运行截图:
注意事项:
(1)用的是最初的窗体类Frame,因为想比较一下和Jframe的区别,好吧,效果很明显
(2)里面用到了JAVA Frame 响应窗口关闭事件,响应了监听事件。如果是JFrame 只需要加一句话: setDefaultCloseOperation
(3)随机产生字母,考虑到了ASCII(97a-123z),具体方法是(char)(Math.random()*26+27)
(4)画字符的时候用到了drawString方法,但是它的第一个参数是字符串,怎么办呢,之前是用字符数组存储起来的,解决办法是new Character(c[i]).toString()
(5)如果字符落到屏幕下方,需要随机产生字母,并且位置还不能和以前一样,所以加了一个判断if(y[i]>400){y[i]=0;x[i]=(int)(Math.random()*300;)}用来生成随机位置
(6)有一个逻辑上需要考虑的点,那就是输入匹配的字母需要是最靠下的,用到了两个变量nowy和nowIndex,在字符数组中查找时先找到y值最大的数,然后记录下它的下标,再然后是重画
总结:
这是java入门的第一个小程序,关于基础语法和写代码的逻辑都有了更深一层的认识,特别是敲20遍之后,真的是头脑异常兴奋。
记得刚开始接触编程的时候,是c语言入门的,讲课的老师是一位上了年龄的老师,听的第一节课真的是枯燥无味,当时就想,天呐,编程难道就是这样的吗?!
后来又学的C++,讲课的女老师也只是在课堂上堆砌知识点,当时还没有真正入门。
后来有幸在图书馆看到了达内集团王洋老师写的《java就该这样学》,对于他推崇的构建主义学习法甚是震撼,颠覆了之前的学习观念,在跟着他实现一个又一个小的游戏或项目的时候,真心感觉到了编程逻辑之美。