目标:
在一个窗体上随机掉落字母,通过键盘输入,敲对后消除并且累计积分,否则扣除一定积分。
具体内容:
画一个窗体——》产生随机字母——》接受键盘输入——》显示分数
代码:
packagechapter01;import java.awt.*;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;public classMyChar {public static voidmain(String[] args) {
Frame w= newFrame() ;
w.setSize(300 , 400) ;
MyPanel mp= newMyPanel() ;
w.add(mp) ;
Thread t= newThread(mp) ;
t.start() ;
w.addKeyListener(mp) ;
mp.addKeyListener(mp) ;
w.show() ;//响应程序关闭按钮
w.addWindowListener(newWindowAdapter() {
@Overridepublic voidwindowClosing(WindowEvent e)
{
System.exit(0);
}
} );
}
}class MyPanel extends Panel implementsRunnable , 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) ;
}
}
@Overridepublic voidpaint(Graphics g){for(int i = 0 ; i < 10 ; i ++){
g.drawString(newCharacter(c[i]).toString(), x[i] , y[i]) ;
}//显示成绩
g.setColor(Color.RED) ;
g.drawString("你的成绩是:"+score, 5, 15) ;
}
@Overridepublic voidrun() {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() ;
}
}
@Overridepublic voidkeyPressed(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;
}
}
@Overridepublic voidkeyReleased(KeyEvent arg0) {//TODO Auto-generated method stub
}
@Overridepublic voidkeyTyped(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就该这样学》,对于他推崇的构建主义学习法甚是震撼,颠覆了之前的学习观念,在跟着他实现一个又一个小的游戏或项目的时候,真心感觉到了编程逻辑之美。