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实现(二)的更多相关文章

  1. 贪吃蛇Controller Java实现(二)

    package cn.tcc.snake.Controller; import java.awt.Point;import java.awt.event.KeyAdapter;import java. ...

  2. 贪吃蛇GamePanel Java实现(二)

    package cn.tcc.snake.tcc.View; import java.awt.Color;import java.awt.Graphics; import javax.swing.JP ...

  3. 贪吃蛇Food Java实现(二)

    1.antition包Food类 package cn.tcc.snake.antition; import java.awt.Graphics;import java.awt.Point;publi ...

  4. 贪吃蛇Ground Java实现(二)

    package cn.tcc.snake.antition; import java.awt.Color;import java.awt.Graphics; import java.awt.Point ...

  5. 贪吃蛇Global Java实现(二)

    package cn.tcc.snake.util; public class Global {public static final int CELL_SIZE=20;public static f ...

  6. 贪吃蛇Listener Java实现(二)

    package cn.tcc.snake.listener; import cn.tcc.snake.antition.Sanke;//接口//处理用户按键事件public interface Sna ...

  7. 贪吃蛇的java代码分析(二)

    代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...

  8. 贪吃蛇的java代码分析(三)

    代码剖析 在上一篇文章中,我们完成了贪吃蛇部分代码的构造.回头审视我们写的代码与思路,会发现我们遗漏了一个重要的地方,那就是:贪吃蛇的自身移动.想必大家都知道,贪吃蛇自身是会自己移动的,并且会跟随你的 ...

  9. 贪吃蛇的java代码分析(一)

    自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...

随机推荐

  1. ubuntu 上 SSH scp 技巧

    参考:https://deepzz.com/post/how-to-setup-ssh-config.html SSH(Secure Shell)是什么?是一项创建在应用层和传输层基础上的安全协议,为 ...

  2. java 设计模式http://www.runoob.com/design-pattern/design-pattern-tutorial.html

    参考:http://www.runoob.com/design-pattern/design-pattern-tutorial.html

  3. hadoop-eclipse插件编译及windows下运行wordcount项目

    参考文章:http://www.360doc.com/content/16/0227/18/10529016_537828949.shtml, 配置修改:http://blog.csdn.net/lo ...

  4. Spring.net介绍及MVC中应用

    Spring.net两大核心内容: IOC(控制反转) 传统的面相对象思维模式是对象A依赖对象B,对象B的实例化和调用都在对象A中发生,一旦对象B中发生变化,对象A也要随之变化,这样使得程序间行程了紧 ...

  5. 机器学习实战之朴素贝叶斯进行文档分类(Python 代码版)

    贝叶斯是搞概率论的.学术圈上有个贝叶斯学派.看起来吊吊的.关于贝叶斯是个啥网上有很多资料.想必读者基本都明了.我这里只简单概括下:贝叶斯分类其实就是基于先验概率的基础上的一种分类法,核心公式就是条件概 ...

  6. java实现生成二维码

    package com.cn.test; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.a ...

  7. UI5-学习篇-16-云端SCP-Destination配置

    1.登录路径: https://account.ap1.hana.ondemand.com/#/home/welcome 2.查看云连接器 如下图所示,虚拟主机都已连接且资源可用: 若虚拟主机连接存在 ...

  8. mui集成百度ECharts的统计图表以及清空释放图表

    echarts官网地址: http://echarts.baidu.com/index.html 更换主题颜色: // 图表清空------------------- mychart.clear(); ...

  9. hdoj 1004 学习思路

    hdoj 1004题目大概讲的是,将输入的字符串根据输入次数多少,输出出现次数最多的字符串. 题目逻辑很简单,就是需要选择相应的数据结构,看了别人提交的discuss,明显发现可以使用多种数据结构解这 ...

  10. Nginx缓存配置以及nginx ngx_cache_purge模块的使用

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...