在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Java游戏开发 → JavaSE贪吃蛇源码

JavaSE贪吃蛇源码

Java游戏开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.53M
  • 下载次数:39
  • 浏览次数:700
  • 发布时间:2018-10-27
  • 实例类别:Java游戏开发
  • 发 布 人:Chalice_zhou
  • 文件格式:.rar
  • 所需积分:3
 相关标签: 贪吃蛇 JavaSE Eclipse开发

实例介绍

【实例简介】该程序使用JavaSE技术完成,IDE工具为Eclipse,可运行,运行类为Yard

下载后请阅读先阅读readme文件

【实例截图】

from clipboard

【核心代码】


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;

/*
 * 作为一个内部类,必须先new出包装类,才能new其内部的类
 * 蛇移动时就相当于将蛇尾部节点去掉,在头部加一个新的节点
 * 
 * */

public class Snake {
	Node head = null;
	Node tail = null;
	int size = 0;
	Node n = new Node(20, 30, Direction.UP);		//初始节点
	Yard y;
	/*
	public Snake(Node node) {
		head = node;
		tail = node;
		size = 1;
	}
	*/
	public Snake(Yard y) {		//初始化该蛇
		head = n;
		tail = n;
		size = 1;
		this.y = y;		//指定是哪个Yard对象
	}
	
	//蛇的尾部添加方法,未使用
	public void addToTail() {
		Node node = null;
		switch(tail.dir) {
			case UP :
				node = new Node(tail.x, tail.y   1, tail.dir);
				break;
			case RIGHT :
				node = new Node(tail.x - 1, tail.y, tail.dir);
				break;
			case DOWN :
				node = new Node(tail.x, tail.y - 1, tail.dir);
				break;
			case LEFT :
				node = new Node(tail.x   1, tail.y, tail.dir);
				break;
			//default :;break;
		}
		tail.next = node;			//构成双向回环
		node.prev = tail;		//构建双向回环列表
		tail = node;
		//size   ;
	}
	
	//蛇的头部添加方法
	public void addToHead() {
		Node node = null;
		switch(head.dir) {
			case UP :
				node = new Node(head.x, head.y - 1,head.dir);
				break;
			case RIGHT :
				node = new Node(head.x   1, head.y, head.dir);
				break;
			case DOWN :
				node = new Node(head.x, head.y   1, head.dir);
				break;
			case LEFT :
				node = new Node(head.x - 1, head.y, head.dir);
				break;
			//default :;break;
		}
		node.next = head;		//把这个新的节点放在头的上面
		head.prev = node;		//构建双向回环列表
		head = node;		//把这个新的节点变成新的头节点
		//size   ;
	}
	
	//蛇的尾部节点删除方法
	private void deleteFromTail() {
		// TODO Auto-generated method stub&
		//if (tail == null) return;		判断蛇是否存在
		if(size == 0) return;
		tail = tail.prev;
		tail.next = null;
	}
	
	//蛇的移动方法
	private void move() {
		// TODO Auto-generated method stub&
		addToHead();
		deleteFromTail();
		isDead();
	}
	
	//判断死亡
	public boolean isDead() {
		if (head.x < 1 || head.x > Yard.COLS - 1 || head.y < 3 || head.y > Yard.ROWS - 1) {		//判断蛇是否出界
			return false;
		}
		if (size > 1) {
			if (this.getRect(head).intersects(this.getRect(tail))) {			//在蛇身大于1的情况下,蛇身是否与蛇尾相撞
				return false;
			}
		}
		for(Node node = head.next;node != null;node = node.next) {		//判断蛇与身体是否相撞
			if (head.x == node.x && head.y == node.y)
				return false;
		}
		return true;
	}
	
	//画出这条蛇
	public void draw(Graphics g) {
		if (size <=0) return;
		move();		//调用蛇的移动方法,最好放在前面,否则运行时可能不太灵敏
		for(Node node = head; node != null; node = node.next) {		//画出该蛇的各个节点
			node.draw(g);
		}
	}

	//节点类,使用内部类构建
	private class Node {
		int w = Yard.BLOCK_SIZE;
		int h = Yard.BLOCK_SIZE;
		int x,y;		// x应为列数cols,y应为行数rows
		Direction dir = Direction.LEFT;
		Node next = null;
		Node prev = null;
		
		public Node(int x,  int y, Direction dir) {
			//super();&
			this.x = x;
			this.y = y;
			this.dir = dir;
		}
		
		void draw(Graphics g) {
			Color c = g.getColor();
			g.setColor(Color.BLACK);
			g.fillRect(x * Yard.BLOCK_SIZE,  y * Yard.BLOCK_SIZE,  w,  h);
			g.setColor(c);
		}
	}//结束内部类
	
	//获取节点所在位置
	private Rectangle getRect(Node obj) {
		return new Rectangle(Yard.BLOCK_SIZE * obj.x, Yard.BLOCK_SIZE * obj.y, obj.w, obj.h);
	}
	
	//检测蛇头与蛋碰撞
	public void eat(Egg e) {
		if(this.getRect(head).intersects(e.getRect())) {		//相交,Rectangle类中的一个方法,判断矩形是否相交
			e.reApear();
			this.addToHead();
			this.size   ;
			y.score  = 5;
		}
	}
	
	//检测键盘事件
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub&
		int key = e.getKeyCode();
		switch(key) {
			case KeyEvent.VK_UP:
				if (head.dir != Direction.DOWN)		//阻止蛇向相反方向变向
					head.dir = Direction.UP;
				break;
			case KeyEvent.VK_RIGHT:
				if (head.dir != Direction.LEFT)
					head.dir = Direction.RIGHT;
				break;
			case KeyEvent.VK_DOWN:
				if (head.dir != Direction.UP)	
					head.dir = Direction.DOWN;
				break;
			case KeyEvent.VK_LEFT:
				if (head.dir != Direction.RIGHT)
					head.dir = Direction.LEFT;
				break;
		}
	}
} 


实例下载地址

JavaSE贪吃蛇源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 哇塞啊 发表于: 2019-06-17 18:37 39
你的下载连接失效了

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警