贪吃蛇snake Java实现(二)
package cn.tcc.snake.antition;
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 cn.tcc.snake.listener.SnakeListener;
import cn.tcc.snake.util.Global;
public class Sanke {
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;
private LinkedList<Point> body = new LinkedList<Point>();
private Set<SnakeListener> Listeners = new HashSet<SnakeListener>(); // 监听器
private Point oldTail;
private boolean life;
public void die(){
life = false;
}
public Sanke(){
init();
}
public void init(){
int x = Global.WIDTH / 2;
int y = Global.HEIGHT /2;
for(int i=0;i<10;i++){
body.addLast(new Point(x--,y));
}
newDirection=oldDirection = RIGHT;
life = true;
}
public void Move(){
System.out.println("Snake Move");
if(!(oldDirection+newDirection==0)){
oldDirection = newDirection;
}
//去尾
oldTail=body.removeLast();
int x = body.getFirst().x;
int y = body.getFirst().y;
switch (oldDirection) {
case UP:
y--;
if(y < 0){
y=Global.HEIGHT-1;
}
break;
case DOWN:
y++;
if(y >= Global.HEIGHT){
y=0;
}
break;
case LEFT:
x--;
if(x<0){
x=Global.WIDTH-1;
}
break;
case RIGHT:
x++;
if(x>=Global.WIDTH){
x=0;
}
break;
}
Point newHead = new Point(x,y);
//加头
body.addFirst(newHead);
}
public void changDirection(int direction){
System.out.println("Snake changDirection");
newDirection = direction;
}
public void eatFood(){
body.addLast(oldTail);
System.out.println("Snake eatFood");
}
public boolean isEatBody(){
System.out.println("Snake EatBody");
for(int i=1;i<body.size();i++){
if(body.get(i).equals(this.getHead())){
return true;
}
}
return false;
}
public void drawMe(Graphics g){
g.setColor(Color.BLUE);
for(Point p: body){
g.fill3DRect(p.x*Global.CELL_SIZE, p.y*Global.CELL_SIZE,Global.CELL_SIZE,Global.CELL_SIZE, true);
}
System.out.println("snake drawme");
}
public Point getHead(){
return body.getFirst();
}
public class SnakeDriver implements Runnable{
@Override
public void run() {
while(life){
Move();
for(SnakeListener l: Listeners){
l.SnakeMoved(Sanke.this);
}
try {
Thread.sleep(300);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void start(){
new Thread(new SnakeDriver()).start();
}
//添加监听器
public void addSnakeListener(SnakeListener l){
if(l != null){
this.Listeners.add(l);
}
}
}
贪吃蛇snake Java实现(二)的更多相关文章
- 贪吃蛇Controller Java实现(二)
package cn.tcc.snake.Controller; import java.awt.Point;import java.awt.event.KeyAdapter;import java. ...
- 贪吃蛇GamePanel Java实现(二)
package cn.tcc.snake.tcc.View; import java.awt.Color;import java.awt.Graphics; import javax.swing.JP ...
- 贪吃蛇Food Java实现(二)
1.antition包Food类 package cn.tcc.snake.antition; import java.awt.Graphics;import java.awt.Point;publi ...
- 贪吃蛇Ground Java实现(二)
package cn.tcc.snake.antition; import java.awt.Color;import java.awt.Graphics; import java.awt.Point ...
- 贪吃蛇Global Java实现(二)
package cn.tcc.snake.util; public class Global {public static final int CELL_SIZE=20;public static f ...
- 贪吃蛇Listener Java实现(二)
package cn.tcc.snake.listener; import cn.tcc.snake.antition.Sanke;//接口//处理用户按键事件public interface Sna ...
- 贪吃蛇的java代码分析(二)
代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...
- 贪吃蛇的java代码分析(三)
代码剖析 在上一篇文章中,我们完成了贪吃蛇部分代码的构造.回头审视我们写的代码与思路,会发现我们遗漏了一个重要的地方,那就是:贪吃蛇的自身移动.想必大家都知道,贪吃蛇自身是会自己移动的,并且会跟随你的 ...
- 贪吃蛇的java代码分析(一)
自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...
随机推荐
- 什么是ThreadLocal
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.ThreadLocal ...
- CSS DISPLAY AND POSITIONING
CSS DISPLAY AND POSITIONING Review: Layout Great job! In this lesson, you learned how to control the ...
- 2018SDIBT_国庆个人第三场
A - A CodeForces - 1042A There are nn benches in the Berland Central park. It is known that aiai peo ...
- spark使用scala读取Avro数据(转)
这是一篇翻译,原文来自:How to load some Avro data into Spark. 首先,为什么使用 Avro ? 最基本的格式是 CSV ,其廉价并且不需要顶一个一个 schema ...
- 尚硅谷springboot学习20-web开发简介
使用SpringBoot 1).创建SpringBoot应用,添加我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 3).自己编写业 ...
- 尚硅谷springboot学习9-配置文件值注入
首先让我想到的是spring的依赖注入,这里我们可以将yaml或者properties配置文件中的值注入到java bean中 配置文件 person: lastName: hello age: 18 ...
- APP安全性测试总结--网上转载
移动APP安全测试 老鹰a0人评论7103人阅读2018-08-06 16:22:07 1 移动APP安全风险分析 1.1 安全威胁分析 安全威胁从三个不同环节进行划分, ...
- 如何遍历List对象
for(String str : list) {//其内部实质上还是调用了迭代器遍历方式,这种循环方式还有其他限制,不建议使用. System.out.println(str); } .普通for循环 ...
- easyui-datebox 只能获取当前日期以前的日期
<td> <input id="happenTimes" name="happenTimes" class="easyui-date ...
- UI简单工作
UI用户界面 需求——效果图——风格设计——高保证效果——html 网页的宽度=屏幕的宽度-纵向滚动条的宽度 企业网站一般是1280 根据百度流量研究所 目前我们的网页注主要是1024和1200 ...