虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Java编程 > Java贪吃蛇游戏完善版

Java贪吃蛇游戏完善版
类别:Java编程   作者:码皇   来源:互联网   点击:

这篇文章主要为大家详细介绍了Java贪吃蛇游戏完善版,支持菜单操作,键盘监听,可加速,减速,统计得分等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了。

下面是项目各包及类的层次关系:

游戏的主要运行界面截图如下:

下面是部分代码,详细源码见此链接:贪吃蛇源码下载

Snake类:

    package com.huowolf.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 com.huowolf.listener.SnakeListener;
    import com.huowolf.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 Set<SnakeListener> listeners = new HashSet<SnakeListener>();
    //存储蛇的链表结构 private LinkedList<Point> body = new LinkedList<Point>();
    private boolean life;
    //是否活着 private boolean pause;
    //是否暂停游戏 private int oldDirection,newDirection;
    //新,旧方向的引入(避免一次移动时间内的无效方向) private Point oldTail;
    //旧的尾巴(在吃掉食物的时候使用) private int foodCount = 0;
    //吃掉食物的数量 private Color headColor;
    private Color bodyColor;
    private int sleepTime;
    public boolean isLife() {
    return life;
    }
    public int getSleepTime() {
    return sleepTime;
    }
    public void setSleepTime(int sleepTime) {
    this.sleepTime = sleepTime;
    }
    public void setHeadColor(Color headColor) {
    this.headColor = headColor;
    }
    public void setBodyColor(Color bodyColor) {
    this.bodyColor = bodyColor;
    }
    public void init() {
    int x = Global.WIDTH/2;
    int y = Global.HEIGHT/2;
    for(int i=0;
    i<3;
    i++) {
    body.addLast(new Point(x--,y));
    }
    oldDirection = newDirection = RIGHT;
    foodCount = 0;
    life = true;
    pause = false;
    if(sleepTime==0) {
    sleepTime = 300;
    }
    }
    //清空蛇的节点的方法(用来开始一次新的游戏) public void clear() {
    body.clear();
    }
    public void setLife(boolean life) {
    this.life = life;
    }
    public boolean getPause() {
    return pause;
    }
    public void setPause(boolean pause) {
    this.pause = pause;
    }
    //用来改变pause常量的状态 public void changePause() {
    pause = !pause;
    }
    //蛇死掉的方法 public void die() {
    life = false;
    }
    //蛇移动的方法 public void 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 changeDirection(int direction) {
    newDirection = direction;
    }
    //吃食物 public void eatFood() {
    body.addLast(oldTail);
    foodCount++;
    }
    //获取吃到的食物数量 public int getFoodCount() {
    return foodCount;
    }
    //蛇是否吃到了自己的身体 public boolean isEatBody() {
    for(int i=1;
    i<body.size();
    i++) {
    if(body.get(i).equals(this.getHead())) return true;
    }
    return false;
    }
    //获取代表蛇头的节点 public Point getHead() {
    return body.getFirst();
    }
    //显示自己 public void drawMe(Graphics g) {
    if(bodyColor==null) {
    g.setColor(new Color(0x3333FF));
    }
    else {
    g.setColor(bodyColor);
    }
    for(Point p : body) {
    g.fillRoundRect(p.x*Global.CELL_SIZE, p.y*Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, 15,12 );
    }
    drawHead(g);
    }
    //画蛇头 public void drawHead(Graphics g) {
    if(headColor==null) g.setColor(Color.YELLOW);
    else {
    g.setColor(headColor);
    }
    g.fillRoundRect(getHead().x * Global.CELL_SIZE, getHead().y* Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, 15,12);
    }
    //控制蛇移动的线程内部类 private class SnakeDriver implements Runnable {
    public void run() {
    while(life) {
    if(pause==false) {
    move();
    for(SnakeListener l : listeners) l.snakeMoved(Snake.this);
    }
    try {
    Thread.sleep(sleepTime);
    }
    catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
    //启动线程的方法 public void begin() {
    new Thread(new SnakeDriver()).start();
    }
    //添加监听器 public void addSnakeListener(SnakeListener l) {
    if(l != null) {
    listeners.add(l);
    }
    }
    //加速 public void speedUp() {
    if(sleepTime>50) {
    sleepTime-=20;
    }
    }
    //减速 public void speedDown() {
    if(sleepTime<700) {
    sleepTime+=20;
    }
    }
    }

Food类:

    package com.huowolf.entities;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Point;
    import com.huowolf.util.Global;
    public class Food extends Point{
    private static final long serialVersionUID = 1L;
    private Color foodColor;
    public void setFoodColor(Color foodColor) {
    this.foodColor = foodColor;
    }
    public Color getFoodColor() {
    return foodColor;
    }
    public void newFood(Point p) {
    setLocation(p);
    }
    public boolean isFoodEated(Snake snake) {
    return this.equals(snake.getHead());
    }
    public void drawMe(Graphics g) {
    if(foodColor==null) {
    g.setColor(Color.RED);
    }
    else {
    g.setColor(foodColor);
    }
    g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, true);
    }
    }

Ground类

    package com.huowolf.entities;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.util.Random;
    import com.huowolf.util.Global;
    public class Ground {
    private boolean [][] rocks = new boolean[Global.WIDTH][Global.HEIGHT];
    private int mapType = 1;
    public int getMapType() {
    return mapType;
    }
    public void setMapType(int mapType) {
    this.mapType = mapType;
    }
    //初始化地面(清空石头) public void clear() {
    for (int x = 0;
    x < Global.WIDTH;
    x++) for (int y = 0;
    y < Global.HEIGHT;
    y++) rocks[x][y] = false;
    }
    /** * 产生石头 */ public void generateRocks1() {
    for (int x = 0;
    x < Global.WIDTH;
    x++) rocks[x][0] = rocks[x][Global.HEIGHT - 1] = true;
    for (int y = 0;
    y < Global.HEIGHT;
    y++) rocks[0][y] = rocks[Global.WIDTH - 1][y] = true;
    }
    public void generateRocks2() {
    for (int y = 0;
    y < 6;
    y++) {
    rocks[0][y] = true;
    rocks[Global.WIDTH - 1][y] = true;
    rocks[0][Global.HEIGHT - 1 - y] = true;
    rocks[Global.WIDTH - 1][Global.HEIGHT - 1 - y] = true;
    }
    for (int y = 6;
    y < Global.HEIGHT - 6;
    y++) {
    rocks[6][y] = true;
    rocks[Global.WIDTH - 7][y] = true;
    }
    }
    public void generateRocks3() {
    for(int x=4;
    x<14;
    x++) rocks[x][5] = true;
    for(int j=5;
    j<15;
    j++) rocks[21][j] = true;
    for(int y=13;
    y<20;
    y++) rocks[14][y] = true;
    for(int x=2;
    x<10;
    x++) rocks[x][17] = true;
    for(int i=10;
    i<Global.WIDTH-3;
    i++) rocks[i][Global.HEIGHT-3] = true;
    }
    //蛇是否吃到了石头 public boolean isGroundEated(Snake snake) {
    for(int x=0;
    x<Global.WIDTH;
    x++) {
    for(int y=0;
    y<Global.HEIGHT;
    y++) {
    if(rocks[x][y] == true && (x==snake.getHead().x &&y==snake.getHead().y)) {
    return true;
    }
    }
    }
    return false;
    }
    public Point getPoint() {
    Random random = new Random();
    int x=0,y=0;
    do {
    x = random.nextInt(Global.WIDTH);
    y = random.nextInt(Global.HEIGHT);
    }
    while (rocks[x][y]==true);
    return new Point(x,y);
    }
    //显示方法 public void drawMe(Graphics g) {
    g.setColor(Color.DARK_GRAY);
    for(int x=0;
    x<Global.WIDTH;
    x++) {
    for(int y=0;
    y<Global.HEIGHT;
    y++) {
    if(rocks[x][y] == true) {
    g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE, Global.CELL_SIZE,Global.CELL_SIZE, true);
    }
    }
    }
    }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • java实现的简单猜数字游戏代码
  • java编写贪吃蛇小游戏
  • Java编写迷宫小游戏
  • Java完美实现2048小游戏
  • java实现五子棋小游戏
  • Java制作智能拼图游戏原理及代码
  • java贪吃蛇游戏编写代码
  • Java swing框架实现的贪吃蛇游戏完整示例
  • java中使用双向链表实现贪吃蛇程序源码分享
相关热词搜索: Java 贪吃蛇 游戏