一. 首先定义贪吃蛇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);
}
}
---------------------------------------------------