黑马程序员 JAVA自主练习 —— 模拟像素鸟

------- android培训java培训、期待与您交流! ---------- 

基础学的差不多了,就想找点东西练练手。正好逛游民星空的时候看到了这个
http://v.youku.com/v_show/id_XNjc1MzgzNTIw.html  

逆天!盒子版《像素鸟》

 
好像看上去很简单的样子 就试着自己写写看结果写出了这个

图像素材来自于 66rpg 素材 图标 的三国系列和愤怒的小鸟

分析:根据视频上 所参考鸟的X轴是固定不动的 只要考虑Y轴 受地心引力影响所以会不但向下
还要有向上飞的控件考虑用键盘事件来实现
那怎么让鸟看上去是向前移动的呢?
就考虑让背景移动起来 看上去像往前飞一样
柱子没找到像样的图片 就用Graphics类中的fillRect 填充个方块来替代

凡是不多说写了就明白了了 虽然做不到向老师中那2个面试题目那样透彻分析  不过万事开头难 慢慢来总会熟练的
 首先是窗体 
class show  // 
{
    JFrame f;
     class window  extends WindowAdapter // 
    {
         public  void windowClosing(WindowEvent e) {
             System.exit( 0);
        }
    }
    show() // 
    {
        f  =  new JFrame( "note");
        f.setSize( 600200);
        f.addWindowListener( new window());
        print1 d  =  new print1();
        f.add(d);
        d.setFocusable( true);
        f.setVisible( true);
    }
}
 JFrame继承Frame 关键里面自带关闭所以可以省一些代码 不过是练习我还是自己写了  删了window按还是能关闭的

最重要的主体
 
class print1  extends JPanel  implements ActionListener // 
{
     /**
     * 
     */
     private  static  final  long serialVersionUID  = 5654288421206033830L;
    ArrayList <walls > a  =  new ArrayList <walls >();
    run1 r  =  new run1(); // 
     int timer  =  10; // 
     int timex  =  0; // 
     int wallstime  =  0;
    Timer time  =  new Timer(timer,  this); // 
     public  int x  =  0, y  =  1015, y1; // 
      boolean i  =  false; // 
    print1() // 
    {
         this.setSize( 600200);
         this.setVisible( true);
         this.addKeyListener( new KeyListener() { // 
            @ Override
             public  void keyTyped(KeyEvent e) {
                 // TODO Auto-generated method stub
                time.start(); // 
            }
            @ Override
             public  void keyPressed(KeyEvent e) {
                 // TODO Auto-generated method stub
                 // if(e.getKeyChar()=='s'){}
                 if (e.getKeyCode()  ==  32) // 
                {
                    i  =  true;
                }
            }
            @ Override
             public  void keyReleased(KeyEvent e) {
                 // TODO Auto-generated method stub
            }
        });
    }
     public  void paint(Graphics g) // 
    {
        Image image1  =  this.getToolkit().getImage( "_FAR3_M1_0.png");  // 
        g.drawImage(image1, x,  0this); // 2
        g.drawImage(image1, y,  0this);
         if (x  ==  -1015) {
            x  =  1015;
        }
         if (y  ==  -1015) {
            y  =  1015;
        }
        x(); // 
        g.setColor(Color.black);
         for ( int x  =  0; x  < a.size(); x ++) {
             if (a.get(x).returny()  >  100)//判断柱子的高度大于100在下面 小于100在上面
                y1  =  200  - a.get(x).returny();
             else
                y1  =  0;
            g.fillRect(a.get(x).returnx1(), y1,  50, a.get(x).returny());
        }
        Image image  =  this.getToolkit().getImage( "12.png"); // 
        g.drawImage(image, r.returnx(), r.returny(),  3030this);
        wallsbuilddel();
        deadorlive();
        upordown(); // 
    }
     private  void deadorlive() {//判断生死 因为鸟打印是从其实坐标打印的不包括整个身体所以在判断里XY轴上个加了30
         // TODO Auto-generated method stub
         for ( int x  =  0; x  < a.size(); x ++) {
             if (a.get(x).returny()  >  100) {
                 if (r.returnx()  +  30  == a.get(x).returnx1()
                         & r.returny()  +  30  >=  200  - a.get(x).returny()) {
                    time.stop();
                    over();
                }
            }  else  if (r.returnx()  +  30  == a.get(x).returnx1()
                     & r.returny()  +  30  <= a.get(x).returny()) {
                time.stop();
                over();
            }
        }
    }
     private  void over() {
         // TODO Auto-generated method stub
        JOptionPane.showMessageDialog( null"you lose");//说出个对话框 宣布游戏结束
         System.exit( 0);
    }
     private  void wallsbuilddel() {
         // TODO Auto-generated method stub
         for ( int i  =  0; i  < a.size(); i ++) {
             if (a.get(i).returnx1()  <=  0)
                a.remove(i);
        }
         if (wallstime  >  1500) {//每1.5秒产生一个墙
            wallstime  =  0;
            a.add( new walls());
        }
        wallstime  += timer;
    }
     private  void x() {
         // TODO Auto-generated method stub
        x --;
        y --;
         for ( int x  =  0; x  < a.size(); x ++) {
            a.get(x).x1();
        }
    }
     public  void upordown() {
         if (i) {
            r.up();
            timex  += timer;
             if (timex  >=  200) {
                i  =  false;
                timex  =  0;
            }
        } // 200
         else
            {r.down();}
    }
     public  void actionPerformed(ActionEvent e) {
        repaint();
    }
}
 以前学过VB里面有个很好用的计时器 然后百度了一下JAVA里也有个蛮好用的计时器  javax.swing.Timer类
 键盘事件 按任意键开始。 按空格激活鸟的跳功能
在绘图里为什么定义两张背景?
为了让图片动起来连贯 当背景走到底的时候更改X轴让他爬到最右边去 理论上就是这样 不过要找张收尾无缝连接的图片才看不出

其实柱子的容器用链表数据结构的linkedlist比较好 逛论坛时发现的这个问题 写都写完了懒的改了 在这里提示一下 T  T


 
public  class fb { // 
     /**
     *  @param  args
     */
     public  static  void main( String[] args) {
         // TODO Auto-generated method stub
        show s  =  new show();
    }
}
 
class run1  // 
{
     private  int x, y; // 
             //
    run1() // 
    {
        x  =  200;
        y  = 50;
    }
     public  void down() // 
    {
        y  = y  +  1;
    }
     public  void up() // 
    {
        y  = y  -  1;
    }
     int returnx() // X
    {
         return x;
    }
     int returny() // Y
    {
         return y;
    }
}
 
class walls {
     private  int y, x1  =  630;// 柱子初始化在最右边所以X默认为630
    walls() {
        y  =  new Random().nextInt( 170);//随机高度
    }
     void x1() {
        x1 --;
    }
     int returnx1() // x
    {
         return x1;
    }
     int returny() // Y
    {
         return y;
    }
}
 为什么代码变量名那么无意义 英文比较着急 没把法 囧

不知不觉的就写成了类似于面向过程的 唉 下次写的时候要多注意了 附代码和素材 http://pan.baidu.com/s/1kTn0Zwb
更多精彩陆续更新........

------- android培训java培训、期待与您交流! ----------

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值