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

     
    真诚的态度对待每篇博文
  • 相关阅读:
    onkeydown事件
    单击循环事件
    for-in循环
    in运算符
    数组成员升序降序排列
    bzoj 3754: Tree之最小方差树 模拟退火+随机三分
    bzoj 3752: Hack 预处理+暴力dfs
    hdu 5269 ZYB loves Xor I 分治 || Trie
    bzoj 4501: 旅行 01分数规划+概率期望dp
    bzoj 4260: REBXOR Trie+乱搞
  • 原文地址:https://www.cnblogs.com/yishengyishiduaini321/p/6519947.html
Copyright © 2011-2022 走看看