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 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;
}
//蛇死掉的方法
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) {
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);
}
}
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java贪吃蛇_Java贪吃蛇游戏完善版相关推荐
- java控制台扫雷_java实现扫雷游戏控制台版
本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(grid): 属性:内容(content).状态(typ ...
- java扫雷雷区的统计数据代码_java实现扫雷游戏控制台版
本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(Grid): 属性:内容(content).状态(typ ...
- java捕鱼达人_java捕鱼达人游戏(源码)
[实例简介] java做的捕鱼游戏,有兴趣的小伙伴们可以看看了,源码非常详细. [实例截图] [核心代码] FishGame └── FishGame ├── bg │ ├── fishlight ...
- java连连看代码_java实现连连看游戏
本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: package com.lr.bean; import java.util.Sca ...
- 蜘蛛纸牌java课设_java蜘蛛纸牌游戏设计
java蜘蛛纸牌游戏设计 java蜘蛛纸牌游戏源程序 AboutDialog.java import javax.swing.*; import java.awt.*; /* **"关于&q ...
- java实现飞机_java实现飞机游戏代码
本文实例为大家分享了java实现飞机游戏的具体代码,供大家参考,具体内容如下 MyGameFrame类: 主要的调用类 package sc.wh.game; import javax.swing.J ...
- java斗地主 服务器_JAVA网络版斗地主游戏
大家好,欢迎各位前辈看小弟写的一个网络版的斗地主程序,下面是小弟用了两个多星期的心血写成的,请各位前辈多指教!使小弟我能够得到前辈的指点,更上一层楼,谢谢支持! 下面是我写的项目分析和讲解: 由于我装 ...
- java石头剪刀布界面_Java实现石头剪刀布游戏
本文实例为大家分享了Java实现石头剪刀布游戏的具体代码,供大家参考,具体内容如下 题目: 用 JAVA 语言设计如下界面的石头剪刀布游戏.游戏的一方点击界面上石头.剪刀.布按钮,游戏的另一方计算机随 ...
- java游戏斗地主_Java斗地主小游戏有序版
斗地主综合案例:有序版 1.准备牌:大王小王 52张牌:循环嵌套遍历两个集合,组装52张牌 可以使用Map集合储存牌的索引+组装好的牌.创建一个List集合存储牌的索引 2.洗牌:使用Collecti ...
- JAVA---经典俄罗斯方块游戏完善版
进阶版本的欧罗斯经典方块游戏,还没有实现最后满格消格功能,目前 功能:(1)随机方块体下落:(2)控制左右下移动 第一步依然是建立最小的方块类CELL类 package com.hyxy.oop.da ...
最新文章
- note for git
- websocket与ajax的区别浅析
- 以mips为单位衡量微型计算机的性能,2016计算机二级《MS Office》选择题专项训练...
- 为您详细解析防火墙的工作原理
- oracle存储sql片段引入_强大的跨数据库访问组件 UniDAC使用教程:注释和SQL函数...
- python 验证码识别 阿里云_python3调用阿里云图像识别OCR-实现验证码识别
- 解决PopupWindow的阴影覆盖问题
- getchar() 和getch()
- 精通反激电源变压器及电路设计-自己的笔记
- java电子小词典课程设计,java课程设计---英汉电子词典
- linux ubuntu 联网问题
- Qt C++制作桌面天气,无边框、透明窗口,心知天气API,开放源码
- DDS信号发生器原理与vivado仿真
- Linux杀掉挖矿病毒(qW3xT.2)
- 488 祖玛游戏 python
- 1.44寸TFT-LCD显示屏取模教程
- 无锡设计培训——怎么自学室内设计
- 在 Android 中使用 Google Play 游戏服务登录出现12501 报错
- 搭建PESCMS-Ticket开源客服工单系统
- FPGA挂载EMMC IP源码 ZYNQ PL端读写EMMC IP 最大52MB吞吐率(8bit) 支持1/4/8/bit 支持块读写