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中使用双向链表实现贪吃蛇程序源码分享
(0)

相关推荐

  • java实现的简单猜数字游戏代码

    本文实例讲述了java实现的简单猜数字游戏代码.分享给大家供大家参考. 具体代码如下: 复制代码 代码如下: import java.util.InputMismatchException; import java.util.Scanner; public class Main {         public static void main(String[] args) {                 // 产生一个随机数                 int number = (in

  • java实现五子棋小游戏

    java实现五子棋小游戏 package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定义一个操作面板 OperatorPane op=null; public GomokuFrame() { //设置名称 this.setTitle("五子棋"); //设置窗口大小 this.setSize(510,510); //设置窗

  • Java制作智能拼图游戏原理及代码

    今天突发奇想,想做一个智能拼图游戏来给哄女友. 需要实现这些功能 第一图片自定义 第二宫格自定义,当然我一开始就想的是3*3 4*4 5*5,没有使用3*5这样的宫格. 第三要实现自动拼图的功能,相信大家知道女人耍游戏都不是很厉害,所以这个自动拼图功能得有. 其他什么暂停.排行就不写了! 现在重点问题出来了 要实现自动拼图功能似乎要求有点高哦!计算机有可不能像人一样只能: 先追究下本质 拼图游戏其实就是排列问题: 排列有这么一个定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺

  • Java swing框架实现的贪吃蛇游戏完整示例

    本文实例讲述了Java swing框架实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: java是门高级语言,做游戏时适合做后台,但是用它也可以做游戏.闲来无事做的时候可以用来写点小游戏,练习练习预防早衰哈哈! 闲话不说了 下面是以前练习的作品,不怕大家笑话,那个时候用了一个礼拜才做出来的. 源码如下供大家学习. 使用的是java的 swing  Jframe Jpanel JButton   当然你也可以使用awt 先来看看运行效果: 具体代码: package Tcs; /** * * *

  • java中使用双向链表实现贪吃蛇程序源码分享

    使用双向链表实现贪吃蛇程序 1.链表节点定义: package snake; public class SnakeNode { private int x; private int y; private SnakeNode next; private SnakeNode ahead; public SnakeNode() { } public SnakeNode(int x, int y) { super(); this.x = x; this.y = y; } public int getX(

  • Java完美实现2048小游戏

    完美地模仿了2048游戏,是根据网友的一个2048改的. Block.java import javax.swing.*; import java.awt.*; public class Block extends JLabel { private int value; public Block() { value = 0;//初始化值为0 setFont(new Font("font", Font.PLAIN, 40));//设定字体 setBackground(Color.gray

  • java编写贪吃蛇小游戏

    废话不多说,直接奉上代码: Frame.java package snake; import java.awt.Graphics; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import

  • Java编写迷宫小游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树是比较合适的,从根节点到每一个子节点都只有一条路径.假设入口是根节点,出口是树中某个子节点,那么,从根节点到该子节点的路径肯定是唯一的. 所以如果能构造一棵树把所有的格子都覆盖到,也就能够做出一个迷宫了. 另外还要求树的父节点和子节点必须是界面上相邻的格子. 在界面显示时,父节点和子节点之间共用的边

  • java贪吃蛇游戏编写代码

    本文实例为大家分享了java贪吃蛇游戏展示的具体代码,供大家参考,具体内容如下 1.采用MVC(model.view.control)框架模式 2.包和类的关系树形图为: 3.源码: package com.huai; import Java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.util.HashSet; import java.util.LinkedList; import java.u

  • Java贪吃蛇游戏完善版

    很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:贪吃蛇源码下载 Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Graphics; import java.awt.Point

  • java贪吃蛇游戏实现代码

    GUI编程实现贪吃蛇小游戏,供大家参考,具体内容如下 1.编写主方法实现启动类,供大家参考,具体内容如下 2.准备好素材图片,编写数据类 3.代码主体部分:在panel面板上实现游戏初始化,键盘和事件的监听等功能 4.代码运行效果图 5.GitHub源码链接 1.编写主方法实现启动类 import javax.swing.*; //主启动类 public class StartGame { public static void main(String[] args) { JFrame jFram

  • Java实现简单版贪吃蛇游戏

    本文实例为大家分享了Java实现简单版贪吃蛇游戏的具体代码,供大家参考,具体内容如下 这是一个比较简洁的小游戏,主要有三个类,一个主类,一个食物类,一个贪吃蛇类. 1.首先定义主类,主类中主要用来创建窗口 public class Main { public static final int WIDTH=600; public static final int HEIGHT=600; public static void main(String[] args) { JFrame win =new

  • Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】

    本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法.分享给大家供大家参考,具体如下: 例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package snake; /** * * @author hjn * */ public class Constant { /** * 蛇方移动方向:左边 */ public static final int LEFT = 0; /** * 蛇方移动方向:右边 */ public static final int R

  • 贪吃蛇游戏C++命令行版实例代码

    本文实例讲述了贪吃蛇游戏C++命令行版的实现代码,是非常经典的游戏.分享给大家供大家参考.具体实现方法如下: 众所周知,贪吃蛇游戏是经典的计算机游戏. 游戏描述如下: 1. 贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格. 2. 贪吃蛇在规定的区域内活动,当: ①贪吃蛇触碰到墙壁时: ②贪吃蛇的蛇头触碰到蛇身或者蛇尾时: ③玩家的键盘输入不是方向键时: 命令行显示"Game Over!"并且退出游戏. 3. 贪吃蛇活动的区域内每次随机产生一颗&quo

  • 利用python实现简易版的贪吃蛇游戏(面向python小白)

    引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序.以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello world'). 这样做效率太低,正确的做法,是到身边找问题,然后编程实现.比如说,我学了高等数学,我是不是应该考虑下如何去用编程实现求导或者积分操作,如果想不出怎么办,是不是应该 baidu 一下,别人是如何实现数值积分或是符号积分的.我们每天买东西都要用到加减甚至乘除,那么我是否能编写个简单的计算器,如果命令行太丑的话,我是否能够快速

  • Java实现贪吃蛇游戏(1小时学会)

    今天就来拿贪吃蛇小游戏来练练手吧! 贪吃蛇游戏规则: 1.按下空格键(游戏未结束)则游戏暂停或开始: 2.按下空格键(游戏结束后)则游戏重新开始: 3.当贪吃蛇的头部撞到身体时则贪吃蛇死亡(游戏结束): 4.当贪吃蛇的头部撞到墙时贪吃蛇死亡(游戏结束): 游戏界面效果: 我们可以看到自己的贪吃蛇吃了多少食物,以及游戏得分.下面是游戏效果图: 源码(注释超详细,注意ImageDate类中的material是一个包名,里面存放的是游戏素材图片): package program_code; impo

  • C语言实现贪吃蛇游戏(单人版)

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 相比于第一个:贪吃蛇游戏,功能更加丰富 #include"snake.h" //蛇的移动 void move_snake(); //画出蛇 void draw_snake(); //产生食物 void creatfood(); //判断蛇是否吃到食物 void eatfood(); //判断蛇是否死掉 void SnakeState(); int main() { //设置窗口大小 system("

随机推荐