JAVA简易贪吃蛇的实现

简介: JAVA简易贪吃蛇的实现


//---主方法-----------------

publicclassGreedSnake {

  publicstaticvoidmain(String[] args) {

      SnakeModel model=newSnakeModel();

      SnakeControl control=newSnakeControl(model);

      SnakeView view=newSnakeView(model,control);

     newThread(model).start();

     newThread(view).start();

   }

}

//---SnakeModel------------

importjava.util.LinkedList;

importjava.util.ListIterator;

importjava.util.Random;

 

publicclassSnakeModelimplementsRunnable {

  staticboolean[][]matrix;

  intmaxX,maxY;

  staticintfreshTime;

  intbufDir;

   Nodehead;

   Nodefood;

  publicstaticfinalintUP=1;

  publicstaticfinalintDOWN=3;

  publicstaticfinalintLEFT=2;

  publicstaticfinalintRIGHT=4;

   LinkedList<Node>snakeList=newLinkedList<Node>();

  publicNode createFood(){

      Random r=newRandom();

     intx,y;

     while(true){

          x=r.nextInt(maxX);

          y=r.nextInt(maxY);

         if(!matrix[x][y]){

            break;

          }

      }

      Node n=newNode(x,y,LEFT);

     matrix[x][y]=true;

      System.out.println("matrix "+x+" "+y);

     returnn;

   }

  publicSnakeModel(){

     head=newNode(2,3,RIGHT);

     maxX=30;

     maxY=30;

     freshTime=200;

     matrix=newboolean[maxX][maxY];

     snakeList.add(head);

     snakeList.add(newNode(2,2,DOWN));

     food=createFood();

     bufDir=head.drct;

   }

  publicvoidmove(){    

      ListIterator<Node> it=snakeList.listIterator();

     //吃掉食物

 

      System.out.println("head "+head.x+" "+head.y);

     booleannear=false;

     switch(head.drct){

     caseUP:

         if(food.x==head.x&&food.y==(head.y-1)){

             near=true;

          }

         break;

     caseDOWN:

         if(food.x==head.x&&food.y==(head.y+1)){

             near=true;

          }

         break;

     caseLEFT:

         if(food.x==(head.x-1)&&food.y==head.y){

             near=true;

          }

         break;

     caseRIGHT:

         if(food.x==(head.x+1)&&food.y==head.y){

             near=true;

          }

         break;

      }

     if(near){

          System.out.println("eat");

         snakeList.addFirst(food);

         food.drct=head.drct;

         head=food;

         food=createFood();

          near=false;

      }

     else{

          it.next();

         while(it.hasNext()){

             Node n=it.next();

            if(head.x==n.x&&head.y==n.y){

                 System.out.println("你输了");

                 System.exit(0);

             }

          }

         while(it.hasPrevious()){

             Node n=it.previous();

            if(it.hasPrevious()){

                if(snakeList.get(it.previousIndex()).x<n.x){

                    n.drct=LEFT;

                 }

                elseif(snakeList.get(it.previousIndex()).x>n.x){

                    n.drct=RIGHT;

                 }

                elseif(snakeList.get(it.previousIndex()).y<n.y){

                    n.drct=UP;

                 }

                elseif(snakeList.get(it.previousIndex()).y>n.y){

                    n.drct=DOWN;

                 }

             }

          }

         while(it.hasNext()){

             Node n=it.next();

            try{

                 nodeMove(n);

             }catch(ArrayIndexOutOfBoundsException e){

                 System.out.println("你输了");

                 System.exit(0);

             }

          }

      }

   }

  publicvoidchangeDirection(){

     if(Math.abs(bufDir-head.drct)==2){

         bufDir=head.drct;

      }

     else

         head.drct=bufDir;

   }

  publicvoidnodeMove(Node n){

     matrix[n.x][n.y]=false;

     switch(n.drct){

     caseUP:

          n.y--;

         break;

     caseDOWN:

          n.y++;

         break;

     caseLEFT:

          n.x--;

         break;

     caseRIGHT:

          n.x++;

         break;

      }

     matrix[n.x][n.y]=true;

   }

 

  publicvoidrun(){

     while(true){

          changeDirection();

          move();

         try{

             Thread.sleep(freshTime);

          }catch(Exception e){}

      }

   }

}

classNode{

  intx;

  inty;

  intdrct;

   Node(intx,inty,intdirect){

     this.x=x;

     this.y=y;

     drct=direct;

   }

}

//---SnakeControl-------------------------

importjava.awt.Frame;

importjava.awt.event.KeyAdapter;

importjava.awt.event.KeyEvent;

 

 

publicclassSnakeControlextendsKeyAdapter{

   SnakeModelmodel;

   SnakeControl(SnakeModel model){

     this.model=model;

   }

  publicvoidkeyPressed(KeyEvent e){

     switch(e.getKeyCode()){

     case38:

         model.bufDir=SnakeModel.UP;

         break;

     case40:

         model.bufDir=SnakeModel.DOWN;

         break;

     case37:

         model.bufDir=SnakeModel.LEFT;

         break;

     case39:

         model.bufDir=SnakeModel.RIGHT;

      }

   }

}

//---SnakeView----------------------

 

importjava.awt.Color;

importjava.awt.Frame;

importjava.awt.Graphics;

importjava.awt.event.WindowAdapter;

importjava.awt.event.WindowEvent;

 

publicclassSnakeViewextendsFrameimplementsRunnable{

  intnodeWidth=10;

  intnodeHeight=10;

   SnakeView(SnakeModel model,SnakeControl control){

      model.maxX=model.maxX;

      model.maxY=model.maxY;

      setSize(model.maxX*nodeWidth+20,model.maxY*nodeHeight+40);

      setLocation(300,200);

      setVisible(true);

      addKeyListener(control);

      addWindowListener(newWindowAdapter(){

         publicvoidwindowClosing(WindowEvent e){

             System.exit(0);

          }

      });

      setBackground(Color.RED);

      setResizable(false);

   }

  publicvoidrepaint(){

      Graphics g=getGraphics();

     for(inti=0;i<SnakeModel.matrix.length;i++){

         for(intj=0;j<SnakeModel.matrix[i].length;j++){

            if(SnakeModel.matrix[i][j]){

                 g.setColor(Color.BLACK);

             }

            else{

                 g.setColor(Color.YELLOW);

             }

             g.fillRect(i*nodeWidth+10, j*nodeHeight+30,nodeWidth-1,nodeHeight-1);

          }

      }

   }

  publicvoidrun(){

     while(true){

         try{

             Thread.sleep(SnakeModel.freshTime);

          }catch(Exception e){

             System.out.println("refresh error");

          }

          repaint();

      }

   }

}

相关文章
|
8月前
|
Java Android开发
贪吃蛇【小游戏】(Java课设)
贪吃蛇【小游戏】(Java课设)
47 0
|
7月前
|
Java
Java 实现 贪吃蛇 小游戏【附源码】
Java 实现 贪吃蛇 小游戏【附源码】
56 0
|
8月前
|
Java Android开发
贪吃蛇小游戏【小游戏】(Java课设)
贪吃蛇小游戏【小游戏】(Java课设)
46 1
|
Java
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
730 0
|
Java
JAVA练习小游戏——贪吃蛇小游戏 PLUS版
JAVA练习小游戏——贪吃蛇小游戏 PLUS版
126 0
|
Java
JAVA练习小游戏——贪吃蛇小游戏
JAVA练习小游戏——贪吃蛇小游戏
120 0
|
Java 数据安全/隐私保护
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
1301 0
JAVA 实现上传图片添加水印(详细版)(上)
|
网络协议 Java
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
|
Java
Java实现拼图小游戏(7)——查看完整图片(键盘监听实例2)
由于在移动和图片中我们已经添加了键盘监听,也继承了键盘监听的接口,那么我们只需要在重写方法内输入我们的代码即可
228 0