⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake2.java

📁 请使用jdk1.3以上版本编译运行
💻 JAVA
字号:
/* * Snake2.java * * Created on 2004年5月5日, 下午9:01 *//** * * * @author  zhouhui */import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.awt.event.*;import java.util.*;public class Snake2 extends JPanel implements Runnable {     /* 0  变量声明*/     static int speed=2;     static int lastunitnum=0;     static boolean isPause=false;     static int playTimes=5;     static JLabel label1=new JLabel("按‘P’暂停,再按其它任意键继续");     static JLabel label2=new JLabel("您总共有  "+playTimes+" 次机会");     static boolean isAlive=true;     static JFrame f;     static Thread t;     static Random ran=new Random();     static int unitnum=4;     static final int north=4;static final int south=3;static final int west=2;static final int east=1;     static int direction=south;     static class BodyUnit                   //身体单位类声明     {         int xc;         int yc;     }     static BodyUnit bodyunit[]=new BodyUnit[50];  //all has 50 bodyunit     static class Food                     //食物类声明     {        int x;        int y;        Food(int xx,int yy)        {            this.x=xx;            this.y=yy;        }     }     Food food;         /**   1 构造方法 */    public Snake2() {        super.setSize(600,550);        super.setVisible(true);        for(int i=0;i<unitnum;i++)                     //初始化bodyuint        {                        bodyunit[i]=new BodyUnit();            bodyunit[i].xc=10;            bodyunit[i].yc=i*10+20;           }        food=new Food(60, 70);                             //初始化food        t=new Thread(this);        t.start();           }        /*  2 事件响应方法*/    public static void s2keyPressed(KeyEvent e)    {         if(e.getKeyCode()==39&&direction!=west)                {                    direction=east;                }           if(e.getKeyCode()==37&&direction!=east)                {                    direction=west;                }           if(e.getKeyCode()==38&&direction!=south)                {                    direction=north;                }           if(e.getKeyCode()==40&&direction!=north)                {                    direction=south;                }            if((e.getKeyChar()=='p'||e.getKeyChar()=='P')&&isAlive==true)               {                   isPause=true;               }            if(isPause==true&&e.getKeyChar()!='p'&&e.getKeyChar()!='P')                {                    isPause=false;                }             if(isAlive==false&&e.getKeyCode()==32&&playTimes>0)    //按空格继续                {                    lastunitnum=unitnum;                    unitnum=4;                         //恢复初始值                    speed=2;                    isPause=false;                    isAlive=true;                }         System.out.println(e.getKeyChar());         System.out.println(e.getKeyCode());         //System.out.println("speed is "+speed);    }        /*  3 画图方法*/    public void paintComponent(Graphics g)    {          g.drawLine(0,500,600,500);        g.drawLine(0,1,600,1);       g.drawLine(485, 1, 485, 500);       g.drawLine(1,1,1, 500);       this.setSize(600,550);       int i;                         //先画蛇       g.clearRect(bodyunit[0].xc,bodyunit[0].yc,9,9);       for( i=0;(i<unitnum-1);i++)       {           bodyunit[i].xc=bodyunit[i+1].xc;           bodyunit[i].yc=bodyunit[i+1].yc;           {                g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9);           }       }       if(direction==south)       {           bodyunit[i].yc+=10;           if(bodyunit[i].xc>=500)  bodyunit[i].xc-=500  ;           if(bodyunit[i].yc>=500)  bodyunit[i].yc-=500  ;           if(bodyunit[i].xc<0)  bodyunit[i].xc+=500  ;           if(bodyunit[i].yc<0)  bodyunit[i].yc+=500  ;           g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9);                  }       if(direction==north)       {           bodyunit[i].yc-=10;           if(bodyunit[i].xc>=500)  bodyunit[i].xc-=500  ;           if(bodyunit[i].yc>=500)  bodyunit[i].yc-=500  ;           if(bodyunit[i].xc<0)  bodyunit[i].xc+=500  ;           if(bodyunit[i].yc<0)  bodyunit[i].yc+=500  ;           g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9);       }       if(direction==east)       {           bodyunit[i].xc+=10;           if(bodyunit[i].xc>=500)  bodyunit[i].xc-=500  ;           if(bodyunit[i].yc>=500)  bodyunit[i].yc-=500  ;           if(bodyunit[i].xc<0)  bodyunit[i].xc+=500  ;           if(bodyunit[i].yc<0)  bodyunit[i].yc+=500  ;           g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9);       }       if(direction==west)       {           bodyunit[i].xc-=10;           if(bodyunit[i].xc>=500)  bodyunit[i].xc-=500  ;           if(bodyunit[i].yc>=500)  bodyunit[i].yc-=500  ;           if(bodyunit[i].xc<0)  bodyunit[i].xc+=500  ;           if(bodyunit[i].yc<0)  bodyunit[i].yc+=500  ;           g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9);       }               g.drawRect(food.x,food.y, 9, 9);           // 再画食物       /*        if(lastunitnum>unitnum)                  //若有必要的话,就擦掉身体        {            for(int j=unitnum;j<lastunitnum;i++)            {                g.clearRect(bodyunit[j].xc, bodyunit[j].yc,10, 10);            }            lastunitnum=0;        }        */    }          /* 4 睡觉方法*/       public  void run() {           int count=0;       try{            while(true&&playTimes>0)            {                t.sleep((int)400/speed);                  if(isPause==false&&isAlive==true)                {                        if(hitSelf())                          {                            isAlive=false;                            //playTimes--;                            //break;                            while(true&&isAlive==false)                            {                                t.sleep((int)400/speed);                                 //repaint();                            }                         }                        if(eatFood()&&(unitnum%5==3)) speed+=1;                        repaint();                 }                               count++;             System.out.println("count="+count+"    00000000000000000000000000000000");             System.out.println("speed="+speed);             System.out.println("unitnum="+unitnum);             System.out.println("lastunitnum="+lastunitnum);             System.out.println("playtimes="+playTimes);             System.out.println("direction="+direction);                     }System.out.println("isAlive is false now");        }catch(InterruptedException e){System.out.println("run-thread was interrupted");}           }          /* 5  判断(x,y)是否有蛇身体单位的方法*/           public boolean hasUnit(int x,int y)      {          for(int i=0;i<unitnum;i++)          {              if(bodyunit[i].xc==x&&bodyunit[i].yc==y)  return true;          }          return false;      }     /*   6  判断(x,y)是否有食物的方法*/      public boolean hasFood(int xx,int yy)      {          if(food.x==xx&&food.y==yy) return true;          else                      return false;      }    /*   7  产生食物的方法 */      public void generateFood()      {          boolean flag=true;          int x,y;          while(flag)          {              x=ran.nextInt(50)*10;              y=ran.nextInt(50)*10;              if(!hasUnit(x,y))              {                  flag=false;                  food=new Food(x,y);  System.out.println("generate food successfully  "+x+"  "+y);              }          }      }      /*  8 吃食物的方法  */      public boolean eatFood()      {          boolean eatsuccess=false;         switch (direction)         {             case east:             {                 if(hasFood(bodyunit[unitnum-1].xc+10,bodyunit[unitnum-1].yc))                 {                      System.out.println("old head at "+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc+direction);                    unitnum++;                    bodyunit[unitnum-1]=new BodyUnit();                     bodyunit[unitnum-1].xc=food.x;                     bodyunit[unitnum-1].yc=food.y;                     System.out.println(direction+"new head at"+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc);                     generateFood();                     eatsuccess=true;                 }             }break;              case west:             {                   if(hasFood(bodyunit[unitnum-1].xc-10,bodyunit[unitnum-1].yc))                 {                    System.out.println("old head at "+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc+direction);                    unitnum++;                    bodyunit[unitnum-1]=new BodyUnit();                     bodyunit[unitnum-1].xc=food.x;                     bodyunit[unitnum-1].yc=food.y;                     generateFood();                      eatsuccess=true;                      System.out.println(direction+"new head at"+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc);                 }             }break;               case north:             {                 if(hasFood(bodyunit[unitnum-1].xc,bodyunit[unitnum-1].yc-10))                 {                      System.out.println("old head at "+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc+direction);                    unitnum++;                    bodyunit[unitnum-1]=new BodyUnit();                     bodyunit[unitnum-1].xc=food.x;                     bodyunit[unitnum-1].yc=food.y;                     generateFood();                      eatsuccess=true;                      System.out.println(direction+"new head at"+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc);                 }             }break;                case south:             {                 if(hasFood(bodyunit[unitnum-1].xc,bodyunit[unitnum-1].yc+10))                 {                      System.out.println("old head at "+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc+direction);                    unitnum++;                    bodyunit[unitnum-1]=new BodyUnit();                     bodyunit[unitnum-1].xc=food.x;                     bodyunit[unitnum-1].yc=food.y;                     generateFood();                      eatsuccess=true;                      System.out.println(direction+"new head at"+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc);                 }             }break;         }        //if(unitnum%5==3&&eatsuccess)  this.speed+=3;         return eatsuccess;      }      /* 9 判断是否撞自己的方法 */      public boolean hitSelf()      {          for(int i=0;i<=unitnum-4;i++)          {              if(bodyunit[i].xc==bodyunit[unitnum-1].xc&&bodyunit[i].yc==bodyunit[unitnum-1].yc)              {                     System.out.println("      hithithit ");                  playTimes--;                  label2.setText("您还有 "+playTimes+"次机会 \n按空格重玩");                  return true;              }          }          return false;      }      /*  10   */      public void paint(Graphics g)      {          super.paint(g);          //this.paintComponent(g);          if(lastunitnum>unitnum)                  //若有必要的话,就擦掉身体        {            for(int j=unitnum;j<lastunitnum;j++)            {                g.clearRect(bodyunit[j].xc, bodyunit[j].yc,10, 10);            }            lastunitnum=0;        }      }    /**  主方法     * @param args the command line arguments     */    public static void main(String[] args) {        f=new JFrame("贪吃蛇");        f.getContentPane().add(label1,BorderLayout.SOUTH);        label2.setSize(5,500);        f.getContentPane().add(label2,BorderLayout.EAST);        f.addKeyListener(new KeyAdapter()  //增添处理键盘事件的方法        {            public void keyPressed(KeyEvent e)            {               s2keyPressed(e);              // 待添加            }        }        );       final Snake2 s2=new Snake2();       f.getContentPane().add(s2,BorderLayout.NORTH);       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       f.setBounds(10, 10, 600, 600);       f.setResizable(false);       f.setVisible(true);       }           }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -