首页 > 编程 > Java > 正文

Java贪吃蛇游戏完善版

2019-11-26 10:03:55
字体:
来源:转载
供稿:网友

很认真的写的一个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);  }  }  }  } } 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表