Java贪吃蛇游戏完善版

网友投稿 225 2023-02-07


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 listeners = new HashSet();

//存储蛇的链表结构

private LinkedList body = new LinkedList();

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;

}

//蛇klkSIL死掉的方法

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

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) {http://

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

rocks[i][Global.HEIGHT-3] = true;

}

//蛇是否吃到了石头

public boolean isGroundEated(Snake snake) {

for(int x=0; x

for(int y=0; 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

for(int y=0; y

if(rocks[x][y] == true) {

g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE,

Global.CELL_SIZE,Global.CELL_SIZE, true);

}

}

}

}

}

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) {http://

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

rocks[i][Global.HEIGHT-3] = true;

}

//蛇是否吃到了石头

public boolean isGroundEated(Snake snake) {

for(int x=0; x

for(int y=0; 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

for(int y=0; y

if(rocks[x][y] == true) {

g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE,

Global.CELL_SIZE,Global.CELL_SIZE, true);

}

}

}

}

}

rocks[i][Global.HEIGHT-3] = true;

}

//蛇是否吃到了石头

public boolean isGroundEated(Snake snake) {

for(int x=0; x

for(int y=0; 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

for(int y=0; y

if(rocks[x][y] == true) {

g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE,

Global.CELL_SIZE,Global.CELL_SIZE, true);

}

}

}

}

}

for(int y=0; 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

for(int y=0; y

if(rocks[x][y] == true) {

g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE,

Global.CELL_SIZE,Global.CELL_SIZE, true);

}

}

}

}

}

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

for(int y=0; y

if(rocks[x][y] == true) {

g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE,

Global.CELL_SIZE,Global.CELL_SIZE, true);

}

}

}

}

}

for(int y=0; y

if(rocks[x][y] == true) {

g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE,

Global.CELL_SIZE,Global.CELL_SIZE, true);

}

}

}

}

}

if(rocks[x][y] == true) {

g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE,

Global.CELL_SIZE,Global.CELL_SIZE, true);

}

}

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:电脑连接共享文件夹不成功(电脑连接共享文件夹不成功怎么办)
下一篇:Java使用kafka发送和生产消息的示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~