【文件属性】:
文件名称:贪吃蛇_JAVA小游戏
文件大小:18KB
文件格式:ZIP
更新时间:2021-03-25 04:11:20
贪吃蛇, JAVA,小游戏
可以运行! (以下代码只是其中的一个类)
package chy.snake.entities;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import chy.snake.listener.SnakeListener;
import chy.snake.util.Global;
public class Snake {
public static final int up = 1;
public static final int down = -1;
public static final int left = -2;
public static final int right = 2;
private int oldDirection,newDirection; //newDirection:一次时间 间隔内输入的最后方向
private Point oldTail;
private boolean life; //life 为 true或者false,初始为true, 用于118行
private LinkedList body = new LinkedList (); //需要经常访问蛇的第一个和最后一个节点,使用链表LinkedList存放蛇的身体节点,因为它有getFirst(),getLast(),removeLast(),方法
private Set listeners = new HashSet();
public Snake(){
init();
}
public void init(){ //初始化
int x = Global.WIDTH/2;
int y = Global.HEIGHT/2;
for(int i=0;i<3;i++){ //初始长度3
body.addLast(new Point(x-i,y)); //是addLast
}
oldDirection = newDirection = right; //初始方向 右
life = true;
}
public void die(){
life = false;
}
public void move(){
System.out.println("Snake's move");
if (!(oldDirection + newDirection == 0)){
oldDirection = newDirection;
}
//1.去尾
oldTail = body.removeLast();
int x = body.getFirst().x;
int y = body.getFirst().y; //蛇头的x,y坐标
switch(oldDirection){
case up:
y--;
break;
case down:
y++;
break;
case left:
x--;
break;
case right:
x++;
break;
}
Point newHead = new Point(x,y);
//2.加头
body.addFirst(newHead);
}
public void changeDirection(int direction){ /*无效方向:在蛇的这一次移动之后和下一次移动之前的
这个时间间隔内输入了多个方向,只有最后一个方向
是 有效方向,其余的都为无效方向*/
System.out.println("Snake's changeDirection");
newDirection = direction; //将一个时间间隔内按得最后方向,赋给 newDirection
}
public void eatFood(){
System.out.println("Snake's eatFood");
body.addLast(oldTail); //后面的节点不去掉
}
public boolean isEatFood(){
System.out.println("Snake's isEatFood");
return false;
}
public boolean isEatBody(Snake snake){ //比较蛇是否吃到身体
System.out.println("snake's isEatBody");
for(int i= 1;i<body.size();i++){ //i 从蛇头结点的下一个节点开始,排除蛇头结点
if(body.get(i).equals(this.getHead())){ //如果i 的节点 和 头结点 相同
return true;
}
}
return false;
}
public void drawMe(Graphics g){
System.out.println("Snake's drawMe");
g.setColor(Color.GREEN); //设置蛇的颜色
for(Point p : body){
g.fill3DRect(p.x * Global.CELL_SIZE, p.y * Global.CELL_SIZE,
Global.CELL_SIZE, Global.CELL_SIZE, true);
}
}
public Point getHead(){ //得到蛇头节点,判断吃食物
return body.getFirst();
}
private class SnakeDriver implements Runnable{ //线程,不停的调用move方法
@Override
public void run() {
// TODO 自动生成的方法存根
while(life){ // 42和46行,life为true 或者false
move();
for(SnakeListener l : listeners){
l.snakeMoved(Snake.this); //循环,依次调用SnakeMoved方法
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
public void start(){
new Thread(new SnakeDriver()).start(); //启动线程的方法
}
public void addSnakeListener(SnakeListener l){
if(l != null){
this.listeners.add(l);
}
}
}
【文件预览】:
MySnake
----bin()
--------chy()
----.settings()
--------org.eclipse.jdt.core.prefs(598B)
----src()
--------chy()
----.project(383B)
----.classpath(301B)