千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

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

           

          留言簿(204)

          隨筆分類(197)

          隨筆檔案(189)

          文章檔案(2)

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 966255
          • 排名 - 35

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          以前寫的一個貪吃蛇,比較適合初學者,并且里面用到了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學習者
          看了你的程序 真是收益非淺啊
          希望中文注釋 在詳細些 就更好了  回復  更多評論
            
          主站蜘蛛池模板: 罗平县| 阿拉尔市| 雷州市| 新田县| 翼城县| 盐山县| 大足县| 乐清市| 高雄市| 西宁市| 安化县| 江孜县| 南阳市| 拉萨市| 神农架林区| 濮阳市| 田东县| 色达县| 华池县| 包头市| 横山县| 九台市| 安吉县| 阜南县| 新民市| 雅安市| 义马市| 响水县| 玛多县| 修武县| 游戏| 剑阁县| 黎城县| 洛浦县| 平原县| 嵊泗县| 平江县| 罗江县| 金秀| 牡丹江市| 邵阳县|