2)javaee贪吃蛇实现贪吃蛇的移动以及吃食物

4 篇文章 0 订阅

一. 首先定义贪吃蛇1基础的常量配置

1.config类

//常量配置
public class Config {
    public static final int ROWS = 22;//行
    public static final int COLS = 35;//列
    public static final int SPAN = 20;//方格像数值
   
    public static final String U ="u";//方向-上
    public static final String D ="d";//方向-下
    public static final String L ="l";//方向-左
    public static final String R ="r";//方向-右
    
    public static boolean isLive =true;
    
}
二.定义贪吃蛇的对象类

首先有蛇类snake类,食物类food,蛇形状节点类node

snake类:定义蛇的基础属性,定义贪吃蛇的初始位置,实现贪吃蛇的蛇头。蛇身。蛇尾的绑定,

有参的snake的初始化方法

绘制蛇的方法:把蛇的节点便利出来

Graphics g参数是需要调用里面的setcolor方法和设置形状的方法。

move方法:贪吃蛇移动

1.添加蛇头。2.去除蛇尾 3.吃食物 4.死亡检测

1.添加蛇头、

判断条件head.dir,赋值常量判断常量对应的键盘实现蛇头的移动,如果向右对应的

列加1,如果是上下那么行+1;

绑定新的节点关系,把新的节点赋值给蛇头、 

去除蛇尾方法 removetail

判断蛇头移动方向的方法keycontrol如果蛇头朝上就不能朝下,操左就不能朝右

eat方法吃食物方法判断食物与蛇头是否重合,重合就添加蛇头,刷新食物

获取蛇头坐标的方法getheadrec

检测贪吃蛇是否食物的方法deadcheck()碰到边界或者蛇身死亡

 

------------------------------------------------------

import java.awt.Graphics;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.prefs.NodeChangeEvent;

// 贪吃蛇
public class Snake {

   Node head; //蛇头
   Node body; //蛇身
   Node tail; //蛇尾
   Food food; //食物
  
   //初始化贪吃蛇起始位置,以及贪吃蛇的前进方向
   public Snake(Food food){
     //指定蛇头。蛇身,蛇尾节点。
     head =new Node(7, 13,Config.R);
     body =new Node(7, 12,Config.R);
     tail =new Node(7, 11,Config.R);
     // 绑定蛇头,蛇身,蛇尾节点之间的关系。
     head.next =body;
     body.pre =head;
     body.next= tail;
     tail.pre = body;
     //初始化食物对象
     this.food=food;
     
   }
  // 绘制蛇
  public void draw(Graphics g) {
        //蛇有多个节点,需要取出每个节点,然后把每个节点都绘制出来
        for (Node n =head;n != null;n=n.next) {
        //便利节点,调用节点画图的方法 
           n.draw(g);
        }
  }
  //貪吃蛇移動的方法
   public void move(){
       // 1.添加蛇頭2.去除蛇尾3.吃食物4.死亡檢測
       addHead();//添加蛇頭。
       removeTail();//去除蛇尾
       eat();
       deadCheck();
   }
   //添加蛇頭(根據蛇運行的方向添加蛇頭)
   public void addHead(){
       Node node =null;
       //根據蛇頭的方向判斷
       switch (head.dir) {
       //如果舌头朝右,那么应该在右边添加蛇头,只需要酱蛇头的坐标右移一位
       case Config.R:
        node = new Node(head.row,head.col+1,head.dir);
        break;
       case Config.L:
        node =new Node(head.row,head.col-1, head.dir);   
        break;
       case Config.U:
         node =new Node(head.row-1, head.col,head.dir);
        break;
       case Config.D:
        node =new Node(head.row+1, head.col,head.dir);
        break;
    }
       //綁定新關係
       node.next =head;
       head.pre =node;
       head =node;//把新結點賦值給蛇頭;
   }
       //去除蛇尾
      public void removeTail(){
        //把蛇尾的前一个节点的后一个节点(后节点)设置为null
          tail.pre.next =null;
        //把设为的前一个节点赋值给蛇尾
          tail=tail.pre;
     }
      public void keyControl(KeyEvent e){
          //通过对案件的判断修改蛇头移动方向,从而控制贪吃蛇方向
           switch (e.getKeyCode()) {
           case KeyEvent.VK_UP:
            //如果蛇头方向不超下可以实现向上移动
            if (head.dir.equals(Config.D)) {
            
                break;        
            }
            head.dir=Config.U;
            break;
           case KeyEvent.VK_DOWN:
            //如果蛇头方向不超上就可以实现向下移动
            if(head.dir.equals(Config.U)){
                break;
            }
            head.dir=Config.D;
             break;
            case KeyEvent.VK_RIGHT:
            if(head.dir.equals(Config.L)){
                break;
            }
            head.dir=Config.R;
            break;
           case KeyEvent.VK_LEFT:
            if (head.dir.equals(Config.R)) {
                break;
            }
            head.dir=Config.L;
            break;    
        default:
            break;
        }
      }
      //吃食物
      /*
       * 1.判断贪吃色蛇头坐标和事物坐标是否重合
       * 2.重新生成一条新的贪吃蛇(添头不去尾)
       * 3.重新生成随机食物
       * 
       */
      public void eat(){
          //判断两个矩形是否重合(蛇头是否碰到食物)
          Rectangle a = getHeadRec();
          Rectangle b = food.getFoodRec();
          if (a.intersects(b)) {
            addHead();
            food.repair();
          }
      }
      //获取蛇头坐标
      public Rectangle getHeadRec(){
          //获取蛇头坐标矩形
          
          return new Rectangle(head.col*Config.SPAN,head.row*Config.SPAN,Config.SPAN,Config.SPAN);
      }
      //检测贪吃蛇是否死亡
      public void deadCheck(){
          //当蛇头碰到边界
          //行的范围:0 - config.rows-1
          //列的范围:0 - Config.col-1
          if (head.row<0 || head.col<0 || head.row>Config.ROWS-1 ||head.col>Config.COLS-1) {
                Config.isLive=false;
                  }
          //当蛇头碰到蛇身
          //便利蛇身,判断节点与舌头重合
          for (Node n =head.next;n!=null;n=n.next) {        
             //判断蛇头的行和列  和当前蛇身节点的位置是否相同
             if (head.row == n.row && head.col==n.col) {
                Config.isLive=false;
                break;
            } 
          }
      }
}
-------------------------

food类:定义所在的行和所在的列的基础属性,定义构造器实现生成食物随机的方法

画食物的方法:实现食物的形状大小和颜色。

定义的随机生成食物的方法,

获取食物坐标的方法:通过获取食物坐标与蛇头坐标对比实现蛇头的增长

--------------------------------------

 

package com.game.snake;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;

public class Food {
   //所在的行
    private int row;
    //所在的列
    private int col;
    //构造器
    public Food(){
        repair();
    }
    //画食物
    public void draw(Graphics g){
        //设置颜色
        g.setColor(Color.RED);
        //绘制填充矩形(位置,大小)
        g.fillRect(col*Config.SPAN,row*Config.SPAN,Config.SPAN,Config.SPAN);
    }
    //随机生成食物位置
    public void repair(){
        row=new Random().nextInt(Config.ROWS);
        col=new Random().nextInt(Config.COLS);
    }
    //获取食物坐标
    public Rectangle getFoodRec(){
        
        return new Rectangle(col*Config.SPAN, row*Config.SPAN,Config.SPAN, Config.SPAN);
        
    }
}
 

-------------------------------

node类:定义画布上的行和列的对象,以及蛇头的前进方向。

绘制节点的方法:绘制节点把蛇头定义为黄色,把蛇身定义为蓝色,把贪吃蛇形状定义为椭圆

--------------------------------- 

package com.game.snake;

import java.awt.Color;
import java.awt.Graphics;

//贪吃蛇分割的节点
public class Node {
   int  row;//行
   int  col;//列
   Node next;//下一个节点指针
   Node pre;//上一个节点指针
   String dir;//蛇头前进方向
   
   // 初始化节点方向,指定节点的位置信息。
   public Node(int row,int col,String dir){
        this.row =row;
        this.col =col;
        this.dir =dir;
   }
   //绘制节点
   public void draw(Graphics g){
       //如果当前节点的上一个节点为null,则当前节点是蛇头
       if (this.pre ==null) {
        //绘制蛇头颜色为黄色
           g.setColor(Color.YELLOW);
    }else {
        g.setColor(Color.BLUE);
    }
       //绘制贪吃蛇形状为椭圆
       g.fillOval(Config.SPAN * col,row * Config.SPAN,  Config.SPAN  ,  Config.SPAN);
   }
}
---------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值