1、 新 乡 学 院 毕 业 论 文论文题目贪吃蛇游戏院(系)名称计算机与信息工程学院专业名称信息与管理班 级信息管理一班学生姓名袁广伟学 号10060301124指导教师姓名李冬2013年5月完成目录内容摘要1关 键 词1Abstract1Key words11.引言2 1.1课题背景与意义2 1.2java游戏的现状与概述22.系统开发环境3 2.1开发工具3 2.2应用环境3 23java介绍3 23.1java语言的特点4 23.2java的主要特征43.系统需求分析5 3.1需求分析5 3.2可行性分析54.概要设计7 4.1设计思路7 4.2设计方法75游戏中所需的实体类分析与实现 7
2、5.1游戏显示面板(SnakePanel)类75.2蛇(Snake)类85.3食物类(Egg)类8 5.4游戏窗口(SnakeFrame)类 86.游戏详细设计87. 重难点分析1171监听事件的实现11 72蛇身移动的线程实现1273项目的主程序入口设计13 74蛇的数据结构设计与移动显示14 75修正蛇的移动与显示问题1776 编写与测试表示食物的类并实现吃食物18 参考文献21致 谢22内容摘要:本文用J2SE实现大家耳熟能详的一个贪吃蛇游戏来综合运用所学知识,本游戏运用软件工程思想(螺旋模型),打好游戏主体框架,JAVA的面向对象思想,封装类,接口等概念,来完成本游戏,达到综合运用知识
3、的目的。关 键 词:中央控制器;游戏面板;食物;蛇Abstract: In this paper, J2SE implementation of a Snake game familiar to the integrated use of what they have learned, this game is the use of software engineering thinking (spiral model), the main framework of the fight game, JAVA object-oriented thinking, wrapper classes,
4、interface concepts to complete this game, hitting the integrated use of knowledge and purpose. The game development platform: WINXP;. JAVA Development Environment: JDK1.5 + Eclipse;. Development Languages: J2SE去掉Keywords:Controller;GamePanel;Food;Snake;241引言1.1课题背景与意义 贪吃蛇,手机上一个必不可少的游戏。但是你知道贪吃蛇这个游戏的由
5、来吗?据说,蛇引诱夏娃吃了苹果之后,就被贬为毒虫,阴险的象征。而蛇吃东西是整只动物吞进去的,大概在文艺复兴的时候就有人发明的一种游戏,是现在贪吃蛇的前身。后来慢慢的发展就变成了今天的贪吃蛇了。 贪吃蛇是大众化的一个程序,人们手机中是一个很常见的一个游戏,人们对它并不陌生,在紧张 的现在生活中给人们带来了不少的乐趣,我写的这个贪吃蛇游戏能满足人们业余时间的适当放松,再紧张的生活节奏中适当的放松一下,保持好的心态。 在这个程序中我用了Java语言来编写,运用了Java中的一些常用的功能,Java语言是在国内外广泛使用的一种语言。Java语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率
6、高、可移植性好,纯粹的面向对象的编程,特别适合用于编写应用软件。1.2JAVA游戏的现状与概述在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件,所以并不是人人皆知。直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如家电、汽车等传统行业,也正因为如此,游戏人才的教育、培养远落后于产业的发展。Java作为一种分布式和可移植的计算机语言,在软件开发上有着特别的优点。它开发方便、快捷,安全性高,在当今计算机飞速发展的时代,Java技术的平台无关性、可重用性、模块化
7、等特点大大减少了重复劳动。本论文介绍的是使用Java开发的贪吃蛇游戏,本游戏的主要背景是毕业课程设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高。选择JAVA作为编程语言。需要对其变量定义、变量初始化、界面初始化、游戏初始化、然后进入游戏、处理游戏过程中的各种操作熟悉。此次设计在Microsoft Windows XP系统下,以Java为开发语言,在Eclipse平台上进行游戏的开发。2.系统开发环境 2.1 开发工具第1章的2级标题你采用了顶格,那这里和以后的标题页要采用顶格排版。后面类似问题自己查找修改。 Sun Microsystems公司在推出Java语言的同时
8、,推出了一套开发工具JDK。Sun提供的基于字符模式的Java开发工具包JDK: Java开发工具(JDK)是许多Java专家最初使用的开发环境。Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。 Java源程序编写借助于记事本,Editpuls,UltraEdit等第三方编辑工具。 所有的Java文件编辑、编译、调试、解释运行都是通过使用字符命令来执行操作。JDK由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。其核心Java API是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。JDK 是整个Java的核心,包括了Jav
9、a运行环境(Java RuntimeEnvirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。 JDK里面是java类库和java的语言规范,它提供的是无论你用何种开发软件写java程序都必须用到的类库和java语言规范.没有jdk,你的java程序根本就不能用。 最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(J
10、ava Virtual Machine)运行效率要比SunJDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。首行缩进2字符。建议打开工具选项里的查看隐藏字符。后面这种问题更严重。2.2 应用环境本游戏开发平台:WINXP;JAVA开发环境: JDK1.5 +Eclipse;开发语言:J2SE23java介绍231JAVA语言的特点 Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。 问题同上,后面类似的自己修改。232J
11、AVA的主要特性 JavaJ语言是简单的。Java语言的语法与C语言和C+语言很接近,使得大多数程序员很容易学习和使用Java。JavaJ语言是一个面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言是分布式的语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、 ServerSocket等。Java
12、语言是健壮的。Java的强类型机制、异常处理、废料的自动收集等是Java程序健壮性的重要保证。Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节。Java语言是可移植的。这种可移植性来
13、源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式, 然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。Java是高性能的。与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C
14、+。 Java语言是多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。3系统需求分析3.1需求分析 本系统主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求: (1) 利用方向键来改变蛇的运行方向。 (2) 空格键暂停或继续游戏,并在随机的地方产生食物。 (3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。3.2可行性分析 贪吃蛇游戏是一种简单的大众的
15、游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个贪吃蛇游戏。 贪吃蛇的核心算法时如何实现移动和吃掉食物,没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。 本次设计我将主要运用java语言来完成。Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同的软硬件平台上运行。 由于Java主要用
16、于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。4概要设计4.1设计思路 本次设计的重点之处在于编程思想的形成,设计图像界面,产生随机食物及其位置。 这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的
17、位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇 。4.2设计方法 (1) 总体设计流程图,如下图所示:游戏开始 选择难度判断蛇的起行方向蛇头移动是下面的箭头方向是什么意思呢?下面几个也是如此。有“是”,“否”在哪里呢?是否吃掉食物 是蛇身长度+1判断当前蛇身的节点是否咬到做自己 否是是否碰到墙壁 是 否蛇身再次前移 否游戏结束5. 游戏中所需的实体类分析与实现 涉及到几个对象(类) 每个类有什么方法5.1 游戏显示面板(SnakePanel)类该类有一下几个方法void paint(); /用来显示游戏面板Void KeyPassed();/键盘控制Void startRu
18、n();/ 线程实现移动5.2 蛇(Snake)类,该类有一个方法:void move(); /移动5.3 食物类(Egg)类5.4 游戏窗口(SnakeFrame)类,该类有以下方法这几个小节只有一句话,不至于单独成节啊。:Void main();主方法,运行程序showMe();显示游戏开始的界面6.详细设计本有序遵循MVC(Model-View-Controller)所以首先建立以上几个实体类并定义相应的包名rac下:Egg、Snake、SnakeFrame、SnakePanel四个类,按照以上说明的各个类具有的方法,写上如下代码:Egg类package rac;import javax
19、.swing.JPanel;public class Egg int x;int y;int length;JPanel panel;Snake类package rac;import java.util.Arrays;import javax.swing.JPanel;public class Snake public final static int UP = 0;public final static int DOWN = 1;public final static int LEFT = 2;public final static int RIGHT = 3;int x;int y;int
20、 length;int direction;int speed;JPanel panel;boolean started;boolean dead;public Snake() /移动控制public void move() switch (direction) case UP:if (y0 = 0 & started) for (int i = x.length - 1; i 0; i-) xi = xi - 1;yi = yi - 1;/蛇吃蛇情况if (i 4 & xi = x0 & yi = y0) dead = true;y0 -= speed;if (y0 0; i-) xi =
21、xi - 1;yi = yi - 1;y0 = 0;dead = true;break;SnakeFrame类package rac;import javax.swing.JFrame;public class SnakeFrame extends JFrameprivate SnakePanel panel;public SnakeFrame()panel = new SnakePanel();this.addKeyListener(panel);this.add(panel); panel.startRun();public void showMe()this.setSize(1000,
22、640);this.setTitle(贪吃蛇);this.setVisible(true);this.setDefaultCloseOperation(SnakeFrame.EXIT_ON_CLOSE);public static void main(String args) new SnakeFrame().showMe();SnakePanel类package rac;import javax.swing.JFrame;public class SnakeFrame extends JFrameprivate SnakePanel panel;public SnakeFrame()pane
23、l = new SnakePanel();this.addKeyListener(panel);this.add(panel); panel.startRun();public void showMe()this.setSize(1000, 640);this.setTitle(贪吃蛇);this.setVisible(true);this.setDefaultCloseOperation(SnakeFrame.EXIT_ON_CLOSE);public static void main(String args) new SnakeFrame().showMe();7.重难点分析 71监听事件
24、的实现由于蛇不能直接操作显示面板(GamePanel)所以这里定义一个监听器里面定义一个方法:void snakeMove(Snake); 每当蛇移动一步就触发监听器,调用snakeMoved()由Controller去实现,然后由控制器去触发显示面板的事件源,让显示面板完成相应操作。逻辑图如下:注意排版,又不是写代码,不至于层层缩进,标题顶格,正文首行缩进2字符。图2 事件监听建立联系在Snake 中增加蛇的方向常量:public final static int UP = 0;public final static int DOWN = 1;public final static int
25、LEFT = 2;public final static int RIGHT = 3;实现move()方法public void move() switch (direction) case UP:if (y0 = 0 & started) for (int i = x.length - 1; i 0; i-) xi = xi - 1;yi = yi - 1;/蛇吃蛇情况if (i 4 & xi = x0 & yi = y0) dead = true;y0 -= speed;if (y0 0; i-) xi = xi - 1;yi = yi - 1;y0 = 0;dead = true;bre
26、ak;72蛇身移动的线程实现线程实现移动public void startRun() new Thread() public void run() while (true) snake.move();try Thread.sleep(level); catch (InterruptedException e) e.printStackTrace();repaint();.start();73项目的主程序入口设计package rac;import javax.swing.JFrame;public class SnakeFrame extends JFrameprivate SnakePane
27、l panel;public SnakeFrame()panel = new SnakePanel();this.addKeyListener(panel);this.add(panel); panel.startRun();public void showMe()this.setSize(1000, 640);this.setTitle(贪吃蛇);this.setVisible(true);this.setDefaultCloseOperation(SnakeFrame.EXIT_ON_CLOSE);public static void main(String args) new Snake
28、Frame().showMe();运行这个带有main()的类,当蛇移动一次,就触发监听器,有控制器(controller)给SnakeFrame发送指令,让它重画,SnakePanel中的public void keyPressed(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_UP:if (snake.direction != 1) snake.started = true;snake.direction = 0;snake.move();repaint();Break;这个方法依次画出几个实体,所以打印出上述信息。到了这一步我们的
29、基本框架打好了,下面开始第5步74蛇的数据结构设计与移动显示 分析:要区分蛇头和蛇尾巴,这就要求这个数据结构是有序的,还要经常访问第一个和最后一个节点,所以LinkedList最合适,因为它有getFirst(),getLast()方法和removeLast()方法蛇下一步移动到哪是由方向控制的,前面已经定义过,蛇透坐标如下图:图3 蛇头方向计算新蛇头坐标SnakePanle中的吞食物,蛇身增加的实现;/ 吞蛋的实现while (Math.sqrt(Math.pow(egg.x - snake.x0, 2)+ Math.pow(egg.y - snake.y0, 2) = 0 & starte
30、d) for (int i = x.length - 1; i 0; i-) xi = xi - 1;yi = yi - 1;/蛇吃蛇情况if (i 4 & xi = x0 & yi = y0) dead = true;y0 -= speed;if (y0 0; i-) xi = xi - 1;yi = yi - 1;y0 = 0;dead = true;此时就修正了上面的问题,可以运行Game类来测试下76 编写与测试表示食物的类并实现吃食物 / 避免出现蛋出在蛇身上的情况while (true) boolean isSnake = false;int tx = rom.nextInt(49
31、) * 20;int ty = rom.nextInt(30) * 20;for (int i = 0; i snake.x.length; i+) if (tx = snake.xi & ty = snake.yi) isSnake = true;break;if (isSnake) continue;egg.x = tx;egg.y = ty;break;g.drawImage(eggs, egg.x, egg.y, egg.length, egg.length,this);score += 10;g.setColor(Color.black);g.setFont(font_s);g.dr
32、awString(分数: + score, 10, 20);if (snake.direction = 0) g.drawImage(head_up, snake.x0, snake.y0,snake.length, snake.length, this);if (snake.direction = 1) g.drawImage(head_down, snake.x0, snake.y0,snake.length, snake.length, this);if (snake.direction = 2) g.drawImage(head_left, snake.x0, snake.y0,snake.length, snake.length, this);if (sna