打字母的游戏&Java入门


目标:


在一个窗体上随机掉落字母,通过键盘输入,敲对后消除并且累计积分,否则扣除一定积分。


具体内容:


画一个窗体——》产生随机字母——》接受键盘输入——》显示分数


代码:

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就该这样学》,对于他推崇的构建主义学习法甚是震撼,颠覆了之前的学习观念,在跟着他实现一个又一个小的游戏或项目的时候,真心感觉到了编程逻辑之美。

 
posted @ 2017-03-08 16:15  找*寻*  阅读(1698)  评论(0编辑  收藏  举报
TOP