先来个效果图,回头看看,自己都吓一跳,好...呃

231236217.png

程序实现就是 在一个线程里不断的让蛇爬行,同时监听鼠标和键盘的动作,根据动作做响应的转向,每次的转向判断下是否吃到豆豆,是否迟到自己了 ,是否碰壁了。如果吃到了豆豆,加一个长度,移动位置。没迟到的就继续爬呀爬。如果迟到自己了,game over!


上代码吧!

package 贪吃蛇;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JFrame;
import Util.SJQ;
import Util.TP;
public class Game
{
    //f
    //窗口
    ChuangKou   ck;
    //定时器
    DingShiQi   ds1;
    //DingShiQi ds2;
    //蛇
    She she=new She();
    //豆豆
    Dou dou=new Dou(she);
    //c
    Game()
    {
        ck = new ChuangKou();
        ds1 = new DingShiQi(200);
        //ds2 = new DingShiQi(5000);
        ck.setSize(600+2*5, 600+2*5+25);
        ck.setVisible(true);
        //点击关闭退出
        ck.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //she=new She();
        //dou=new Dou(she);
    }
    //m
    //窗口
    class ChuangKou extends JFrame
    {
        //f
        //键盘事件监听
        JianPanQi   jp;
        //鼠标事件监听
        ShuBiaoQi   sb;
        //话蛇和豆豆
        HuaBu       hb;
        //c
        ChuangKou()
        {
            jp = new JianPanQi();
            sb = new ShuBiaoQi();
            hb = new HuaBu();
            //添加监听
            addKeyListener(jp);
            addMouseListener(sb);
            add(hb);
            //重画
            repaint();
        }
        //键盘事件监听
        class JianPanQi extends KeyAdapter
        {
            @Override
            public void keyPressed(KeyEvent e)
            {
                switch (e.getKeyCode())
                {
                case KeyEvent.VK_LEFT:
                    //可以用枚举代替 当年都没意识,嘿嘿
                    she.zhuan(3);
                    break;
                case KeyEvent.VK_UP:
                    she.zhuan(2);
                    break;
                case KeyEvent.VK_RIGHT:
                    she.zhuan(1);
                    break;
                case KeyEvent.VK_DOWN:
                    she.zhuan(4);
                    break;
                }
                repaint();
            }
        }
        //鼠标监听,这个貌似没用么
        class ShuBiaoQi extends MouseAdapter
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                int mx = e.getX();
                int my = e.getY();
                if (e.getButton() == MouseEvent.BUTTON1)
                {
                    System.out.println("left clicked");
                }
                else if (e.getButton() == MouseEvent.BUTTON3)
                {
                    System.out.println("right clicked");
                }
                repaint();
            }
        }
        //在Graphic上显示蛇和豆豆
        class HuaBu extends JComponent
        {
            public void paint(Graphics g)
            {
                she.xianShi(g, this);
                dou.xianShi(g, this);              
            }
        }
    }
    //记得当时是用的死循环来做的,后来老师给我一顿夸啊  o(∩_∩)o 哈哈
    class DingShiQi implements Runnable
    {
        //线程
        Thread  ds;
        //间隔时间
        long    jg;
        //c
        DingShiQi(long jg)
        {
            this.jg = jg;
            ds = new Thread(this);
            ds.start();
        }
        public void run()
        {
            while (true)
            {
                try
                {
                        ds.sleep(jg);
                        she.pa();
                        //出界 || 咬到自己
                        if (she.isChuJie()||she.isZiYao())
                        {
                            System.exit(0);
                        }
                        //终于吃到豆豆了
                        if (she.isChiDou(dou) )
                        {
                            she.chang++;//加长
                            she.pa();//继续爬
                            dou=new Dou(she);//在生成一个豆豆
                            //ck.repaint();
                        }
                }
                catch (InterruptedException e)
                {
                    //异常处理什么滴都么啊 嘿嘿
                    e.printStackTrace();
                }
                //重画啊啊
                ck.repaint();
            }
        }
    }
    public static void main(String[] args)
    {
        new Game();
    }
}
/**
 * 蛇
 * @author xuhy
 *
 */
class She
{
    //f
    //行数组
    int[] hs;
    //列数组
    int[] ls;
    //方向
    int fang;
    //长度
    int chang;
    Image t1;
    Image t2;
    //c
    //构造蛇
    She()
    {
        fang=2;
        chang=6;
        hs=new int[20];
        ls=new int[20];
        for (int i=0;i<chang ;i++ )//循环:知次
        {
            hs[i]=10+i;
            ls[i]=10;
        }
                                                                                                                    
        t2=TP.huoDe("图\\贪吃蛇图片\\身.png");
    }
    //m
    //显示图片
    void xianShi(Graphics g,Game.ChuangKou.HuaBu hb)
    {
        t1=TP.huoDe("图\\贪吃蛇图片\\头"+fang+".png");
        g.drawImage(t1, 30*ls[0], 30*hs[0], hb);
        for (int i=1;i<chang ;i++ )//循环:知次
        {
            //g2d.drawRect(30*ls[i], 30*hs[i],30 ,30 );//画矩形    参数:左,上,宽,高
            g.drawImage(t2, 30*ls[i], 30*hs[i], hb);
        }
    }
    /**
     * 爬行
     */
    void pa()
    {
        for (int i=chang-1;i>=1 ;i-- )//循环:知次
        {
            hs[i]=hs[i-1];
            ls[i]=ls[i-1];
        }
        switch (fang)///进行选择的依据
        {
        case    1://当 :
            ls[0]++;
            break;
        case    2://当 :
            hs[0]--;
            break;
        case    3://当 :
            ls[0]--;
            break;
        case    4://当 :
            hs[0]++;
            break;
        }
    }
    /**
     * 是否出界
     * @return
     */
    boolean isChuJie()
    {
        if (hs[0]==-1||hs[0]==20||ls[0]==-1||ls[0]==20)//如果
        {
            return true;
        }
        else//否则
        {
            return false;
        }
    }
    /**
     * 是否咬到了自己
     * @return
     */
    boolean isZiYao()
    {
        for (int i=1; i<chang;i++ )//循环:知次
        {
            if (hs[0]==hs[i]&&ls[0]==ls[i])//如果
            {
                return true;
            }
        }
        return false;
    }
    /**
     * 是否吃到了豆豆
     * @param dou
     * @return
     */
    boolean isChiDou(Dou dou)
    {
        if (hs[0]==dou.h&&ls[0]==dou.l)//如果
        {
            return true;
        }
        else//否则
        {
            return false;
        }
    }
    /**
     * 转向
     * @param fang
     */
    void zhuan(int fang)
    {
        if (this.fang%2!=fang%2)//如果
        {
            this.fang=fang;
        }
    }
}
class Dou
{
    //f
    int h;
    int l;
    Image tu;
    //c
    Dou(She she)
    {
        boolean zi=false;
        do//豆造在蛇身上
        {
            tu=TP.huoDe("图\\贪吃蛇图片\\豆.png");
            h=SJQ.zao(0, 19);
            l=SJQ.zao(0, 19);
            for (int i=0;i<she.chang ;i++ )//循环:知次
            {
                if (h==she.hs[i]&&l==she.ls[i])//如果
                {
                    zi=false;
                }
            }
        }
        while (zi==true);//每当
    }
    //m
    void xianShi(Graphics g,Game.ChuangKou.HuaBu hb)
    {
        //g2d.fillRect(l*30, h*30,30 ,30 );//画矩形    参数:左,上,宽,高
        g.drawImage(tu, l*30, h*30, hb);
    }
}


贪吃蛇这个经典的东西,对于当年刚上道的俺来说还是相当费劲的。这是俺第一个成功的Program。现在回想,当年还真是不知有多兴奋。玩的那个不亦乐乎,spacer.gifo(∩_∩)o 拿出来分享,虽然不如意的地方太多,全当做个纪念吧!。写的不好不要拍我砖啊!,当然更欢迎您留言,大家可以多交流么。。嘿嘿。。