千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          以前寫的一個貪吃蛇,比較適合初學者,并且里面用到了JDK1.5的很多新的東西,比如枚舉,泛型,增強for循環,靜態導入等等,希望能對初學者有一定的幫助.
          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;
          import java.util.*;
          import static java.lang.Math.*;//靜態導入
          /*

          * 此類是貪吃蛇的簡單實現方法
          * 自己可以加入在開始時的設置,比如
          * 選關,初始的蛇的長度等等
          * 作者:千里冰封
          * 日期:2006年6月25日15:47
          */
          public class Snake extends JPanel{
          private Direction dir;//要走的方向
          private int blockWidth=10;//塊大小
          private int blockSpace=2;//塊之間的間隔
          private long sleepTime;//重畫的進間間隔
          private MySnake my;
          private int total;//代表蛇的長度
          private Rectangle food;//代表蛇的食物
          private volatile boolean go;
          private int round;//表示第幾關
          public Snake(JFrame jf){
            initOther();
            
          //為頂級窗口類JFrame添加事件處理函數
            jf.addKeyListener(new KeyAdapter(){
             
          public void keyReleased(KeyEvent ke){
              
          int code=ke.getKeyCode();
              
          if(code==KeyEvent.VK_RIGHT){
               
          if(dir!=Direction.WEST)
                dir
          =Direction.EAST;
              }
              
              
          else if(code==KeyEvent.VK_LEFT){
               
          if(dir!=Direction.EAST)
                dir
          =Direction.WEST;
              }
              
              
          else if(code==KeyEvent.VK_UP){
               
          if(dir!=Direction.SOUTH)
                dir
          =Direction.NORTH;
              }
              
              
          else if(code==KeyEvent.VK_DOWN){
               
          if(dir!=Direction.NORTH)
                dir
          =Direction.SOUTH;
              }
              
          else if(code==KeyEvent.VK_ENTER){
               
          if(!go)
               initOther();
              }
             }
            });
            
          this.setBounds(300,300,400,400);
            
          this.setVisible(true);
          }
          //隨機生成一個食物的位置
          private void makeFood(){
            
          int x=40+(int)(random()*30)*12;
            
          int y=10+(int)(random()*30)*12;
            food
          =new Rectangle(x,y,10,10);
          }
          //做一些初始化的工作
          private void initOther(){
            dir
          =Direction.EAST;
            sleepTime
          =500;
            my
          =new MySnake();
            makeFood();
            total
          =3;
            round
          =1;
            
          new Thread(new Runnable(){
             
          public void run(){
              go
          =true;
              
          while(go){
               
          try{
                Thread.sleep(sleepTime);
                repaint();
               }
               
          catch(Exception exe){
                exe.printStackTrace();
               }
              }
             }
            }).start();
          }
          //處理多少關的函數
          private void handleRound(){
            
          if(total==6){
             round
          =2;
             sleepTime
          =300;
            }
            
          else if(total==10){
             round
          =3;
             sleepTime
          =200;
            }
            
          else if(total==15){
             round
          =4;
             sleepTime
          =100;
            }
            
          else if(total==18){
             round
          =5;
             sleepTime
          =50;
            }
            
          else if(total==20){
             round
          =6;
             sleepTime
          =20;
            }
            
          else if(total>21){
             round
          =7;
             sleepTime
          =15;
            }
          }
          //把自己的組件全部畫出來
          public void paintComponent(Graphics g){
             g.setColor(Color.PINK);
             g.fillRect(
          0,0,this.getWidth(),this.getHeight());
             g.setColor(Color.BLACK);
             g.drawRect(
          40,10,358,360);
             
          if(go){
              my.move();
              my.draw(g);
              g.setFont(
          new Font("黑體",Font.BOLD,20));
              g.drawString(
          "您的得分:"+(total*10)+"      第"+round+"",40,400);
             }
             
          else{
              g.setFont(
          new Font("黑體",Font.BOLD,20));
              g.drawString(
          "游戲結束,按回車(ENTER)鍵重玩!",40,440);
             }
             g.setColor(Color.RED);
             g.fillRect(food.x,food.y,food.width,food.height);
          }
          private class MySnake{
            
          private ArrayList<Rectangle> list;
            
          public MySnake(){
             list
          =new ArrayList<Rectangle>();
             list.add(
          new Rectangle(160+24,130,10,10));
             list.add(
          new Rectangle(160+12,130,10,10));
             list.add(
          new Rectangle(160,130,10,10));
            }
            
          //蛇移動的方法
            public void move(){
             
          if(isDead()){
              go
          =false;
              
          return;
             }
             
          if(dir==Direction.EAST){
              Rectangle rec
          =list.get(0);
              Rectangle rec1
          =new Rectangle(rec.x+(blockWidth+blockSpace),rec.y,rec.width,rec.height);
              list.add(
          0,rec1);
             }
             
          else if(dir==Direction.WEST){
              Rectangle rec
          =list.get(0);
              Rectangle rec1
          =new Rectangle(rec.x-(blockWidth+blockSpace),rec.y,rec.width,rec.height);
              list.add(
          0,rec1);
             }
             
          else if(dir==Direction.NORTH){
              Rectangle rec
          =list.get(0);
              Rectangle rec1
          =new Rectangle(rec.x,rec.y-(blockWidth+blockSpace),rec.width,rec.height);
              list.add(
          0,rec1);
             }
             
          else if(dir==Direction.SOUTH){
              Rectangle rec
          =list.get(0);
              Rectangle rec1
          =new Rectangle(rec.x,rec.y+(blockWidth+blockSpace),rec.width,rec.height);
              list.add(
          0,rec1);
             }
             
          if(isEat()){
              handleRound();
              makeFood();
             }
             
          else{
              list.remove(list.size()
          -1);
             }
            
            }
            
          //判斷是否吃到了食物
            private boolean isEat(){
             
          if(list.get(0).contains(food)){
              total
          ++;
              
          return true;
             }
             
          else
              
          return false;
            }
            
          //判斷是否死了,如果碰壁或者自己吃到自己都算死了
            private boolean isDead(){
             Rectangle temp
          =list.get(0);
             
          if(dir==Direction.EAST){
              
          if(temp.x==388)
               
          return true;
              
          else{
               Rectangle comp
          =new Rectangle(temp.x+12,temp.y,10,10);
               
          for(Rectangle rec:list){
                
          if(rec.contains(comp))
                 
          return true;
               }
              }
               
          return false;
             }
             
          else if(dir==Direction.WEST){
              
          if(temp.x==40)
               
          return true;
              
          else {
               Rectangle comp
          =new Rectangle(temp.x-12,temp.y,10,10);
               
          for(Rectangle rec:list){
                
          if(rec.contains(comp))
                 
          return true;
               }
              }
               
          return false;
             }
             
          else if(dir==Direction.NORTH){
              
          if(temp.y==10)
               
          return true;
              
          else{
               Rectangle comp
          =new Rectangle(temp.x,temp.y-12,10,10);
               
          for(Rectangle rec:list){
                
          if(rec.contains(comp))
                 
          return true;
               }
              }
               
          return false;
             }
             
          else if(dir==Direction.SOUTH){
              
          if(temp.y==358)
               
          return true;
              
          else{
               Rectangle comp
          =new Rectangle(temp.x,temp.y+12,10,10);
               
          for(Rectangle rec:list){
                
          if(rec.contains(comp))
                 
          return true;
               }
              }
               
          return false;
             }
             
          else{
              
          return false;
             }
            }
            
          //把自己畫出來
            public void draw(Graphics g){
             
          for(Rectangle rec:list){
              g.fillRect(rec.x,rec.y,rec.width,rec.height);
             }
            }
            
          }
          public static void main(String arsg[]){
            JFrame jf
          =new JFrame("貪吃蛇");
            Snake s
          =new Snake(jf);
            jf.getContentPane().add(s,BorderLayout.CENTER);
            jf.setBounds(
          300,300,500,500);
            jf.setVisible(
          true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          }
          }
          //定義一個枚舉,在此也可以用接口或者常量值代替
          enum Direction{
          EAST,
          SOUTH,
          WEST,
          NORTH;
          }




          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-08-30 10:34 千里冰封 閱讀(567) 評論(2)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: 貪吃蛇
          2007-09-03 15:44 | 孫健
          我還真對java中的枚舉很不熟悉。呵呵。厲害  回復  更多評論
            
          # re: 貪吃蛇[未登錄]
          2007-09-04 01:49 | java學習者
          看了你的程序 真是收益非淺啊
          希望中文注釋 在詳細些 就更好了  回復  更多評論
            
          主站蜘蛛池模板: 黔江区| 子洲县| 桃江县| 万全县| 建水县| 东安县| 同德县| 迁西县| 兖州市| 昭通市| 富民县| 大名县| 上虞市| 内江市| 来宾市| 新兴县| 始兴县| 汝阳县| 图们市| 罗源县| 张家口市| 五大连池市| 鲜城| 剑河县| 布尔津县| 阳谷县| 大悟县| 牟定县| 龙门县| 广德县| 泽州县| 临夏县| 闸北区| 延川县| 双鸭山市| 随州市| 江门市| 班戈县| 吴忠市| 花莲市| 扎兰屯市|