贪吃蛇手机游戏设计.doc

上传人:豆**** 文档编号:29924404 上传时间:2022-08-02 格式:DOC 页数:16 大小:228KB
返回 下载 相关 举报
贪吃蛇手机游戏设计.doc_第1页
第1页 / 共16页
贪吃蛇手机游戏设计.doc_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《贪吃蛇手机游戏设计.doc》由会员分享,可在线阅读,更多相关《贪吃蛇手机游戏设计.doc(16页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、中文摘要:摘要贪吃蛇是经典的游戏之一,每个人的童年都有玩过这类游戏,尤其是在手机上较为常见。这次选择这个游戏作为我的题材主要是因为这个游戏它需要的编程知识很多,而且我在原来的游戏基础上加以改良,拥有自己独特的玩法,也算是一件比较有意义的事情,同时也能使我的编程能力得到较大的提升。英文摘要:AbstractSnake is a classic game, everyones childhood are played this game, especially in the more common mobile phone. The choice of this game as my subjec

2、t is mainly because this game it requires knowledge of programming a lot, and I in the original game to be based on the improved, has its own unique gameplay, it is a meaningful thing, also can make my programming ability to get bigger promotion.目录第一章 前言- 1 -1.1关于贪吃蛇- 1 -1.1.1贪吃蛇功能- 1 -1.1.2贪吃蛇背景- 1

3、 -1.2关于编程环境- 1 -1.3关于游戏兼容性- 1 -第二章 概要设计- 2 -2.1贪吃蛇含有的方法- 2 -2.1.1贪吃蛇结构- 2 -2.1.2游戏流程- 2 -第三章 贪吃蛇实现- 4 -3.1贪吃蛇各个方法概述- 4 -3.1.1方法概述- 4 -3.1.2成员变量- 4 -3.1.3资源分配- 5 -3.2贪吃蛇游戏流程实现- 5 -3.2.1主窗口初始化- 5 -3.2.2初始化蛇和食物- 6 -3.2.3开始游戏- 7 -3.2.4无敌模式- 9 -3.2.5双蛇模式- 9 -第四章 结果与讨论- 10 -4.1程序运行和不足之地- 10 -4.2错误调试与分析- 1

4、2 -第一章 前言1.1关于贪吃蛇1.1.1贪吃蛇的功能贪吃蛇的主要功能包含:(1) 能有键盘控制四处走动。(2) 屏幕左上角含有分数计数器。(3) 游戏结束画面。(4) 食物能随时间的变动而变动颜色,主要为红绿。(5) 能够吃食物,并且能随着吃到的食物而增长身体。(6) 无敌模式。1.1.2贪吃蛇背景贪吃蛇在我小时候留下很大的印象,而且它运用到的编程知识不比其他的游戏少,线程,双缓存,等等。麻雀虽小五脏俱全。贪吃蛇也包含人生哲理,和别的游戏不同,贪食蛇是一个悲剧性的游戏。许多电子游戏都是打通关打到底,游戏操作者以胜利而告终。而贪食蛇的结局却是死亡。不管你玩得多么纯熟,手艺多么高超,你最终听到

5、的都是小蛇那一声惨叫。当手机上的小蛇越长越长,积分越来越高的时候,死亡也就越来越近。那时候忙的不是为了吃蛋长身体,而是为了避免撞墙。你会发现你穷于应付,四处奔忙。树高风摧,福兮祸倚,这不是宿命又是什么?1 所以我加上自己的无敌模式,使得在游戏的疲劳之时能够拥有不死之身。这也是一种兴趣,而且还可以帮助我提高编程能力,所以我选择这个题目。1.2关于编程环境本游戏采用JAVA语言编写,用MyEclipse 10的英文版本进行编译。MyEclipse,是一个十分优秀的用于开发Java, J2EE的Eclipse插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不

6、错。2 运行环境是在win7下,并且在linux版本ubuntu系统中也可以运行。1.3关于兼容性本程序经过调试,可以在win7系统下编译运行,也可以在linux下运行,界面稍有不同,但不影响运行结果。但是要注意jdk版本的一致否则linux下将运行失败。在linux下运行要下载最新版本的jdk。第二章 概要设计2.1贪吃蛇含有的各种类2.1.1贪吃蛇类结构类GameJFrame:主要实现了游戏窗口的大小和线程启动以及paint方法。才能使得贪吃蛇动起来。这个类包含有main方法,是游戏的入口类。故在各个类中都含有对GameJFrame的引用,为得是使得调用GameJFrame方法以及成员变量

7、更加的方便,同时实现了事件监听,对键盘的游戏键进行了监听,具体实现监听的方法在Snake里面实现。类Snake:主要实现了贪吃蛇的各种方法。包括判断是否是上帝模式,重新开始游戏的方法reApear,吃到食物时候在蛇头加一个点addToHead方法,当然也可以设置把食物加到贪吃蛇的尾巴addToTail,自身的draw方法,用来画出自己。还有判断是否吃到食物的方法eat,键盘监听等等。类Food:用于勾勒出食物的各种属性和方法。构造方法含有两个,一个是无参数的,一个是有参数的,有参数的可以自己定义食物在屏幕的任何方向。reApear方法,当蛇把食物吃了可以让食物随机重新出现,把自己画出来的方法d

8、raw,还有一个方法是用于判断是否被蛇吃到的getRect(),eat方法要判断时候需要传入这个方法的返回值。Game类Direction:用于方向的枚举类。包含的方向有上(U)下(D)左(L)右(R),可用于蛇节点的方向,蛇的方向就是蛇头的方向。DirectionGameJFrameFoodSnakeNode(内部类)KeyMonitor(内部类)PaintThread(内部类)图2-1 贪吃蛇结构图2.1.2游戏流程启动游戏时候,先有GameJFrame类构造自身,并且调用LaunchGameJFrame方法,开始创建窗口包括窗口的大小,然后开启线程,开启事件监听,开始画出直线和背景,并调

9、用贪吃蛇自身的画画方法和食物的画画方法,游戏初始化完毕。当键盘监听到按键时候开始调用贪吃蛇本身的事件监听处理方法KeyPressed方法,而第二只蛇由于方向跟第一只蛇的方向不同所以第二只蛇调用的是KeyPressedDouble方法。并对按键做处理,同时判断游戏是否结束以及是否吃到食物等。当开启上帝模式时候,判断游戏结束的方法将换成如果超出边界则由另外一边重新出现贪吃蛇。当没有开启上帝模式的时候,超出边界则游戏结束,出现游戏结束画面。 正常游戏界面 游戏结束界面双蛇模式加上帝模式界面第三章 贪吃蛇实现3.1贪吃蛇各个方法概述根据程序的结构,将贪吃蛇需要实现的功能细化成为相应的函数。各个类含有的

10、方法如下:3.1.1方法概述类GameJFrame:Public void launchGame() ;/初始化游戏界面Public int getScore();/获得分数Public void setScore(int);/设置分数Public void paint(Graphics);/画出游戏界面方法Public void update(Graphics);/双缓存技术防止画面闪烁内部类PaintThread:Public void run();/线程run方法Public void pause();/线程暂停Public void reStart();/线程重新开始Public st

11、atic void main(String);/main方法内部类KeyMonitor:Public KeyMonitor(GameJFrame);/构造方法Public void keyPressed(KeyEvent);/键盘监听Public void gameOver();/游戏结束类Snake:Public Boolean isGodModen();/判断是否上帝模式Public void setGodModen(Boolean);/设置开启上帝模式Public Snake(GameJFrame);/构造方法Public Snake(GameJFrame,int,int);/第二只蛇的

12、构造方法Public void reAppear(GameJFrame);/重新安排蛇的位置Public void reAppear(GameJFrame,int,int);/重新安排蛇的位置Public void addToHead();/增加蛇的长度到头结点Public void addToTail();/增加蛇的长度到尾巴Public void draw(Graphics);/画出自己Private Rectangle getRect();/返回RectanglePublic void eat(Food);/吃食物Public void keyPressed(KeyEvent);/键盘按

13、键处理方法Public void keyPressedDouble(KeyEvent);/第二只蛇键盘处理方法Public void move();/贪吃蛇移动Private void checkDead();/检查死亡Private void deleteFromTail();/删除尾巴内部类Node:Public Node(int,int,Direction);/点类的构造方法Public void draw(Graphics);/画出点的方法类Food:Public Food(int,int);/食物构造方法,指定位置生成食物Public Food();/食物构造方法,不知道位置Publ

14、ic void reAppear();/食物重新出现Public Rectangle getRect();/返回Rectangle类类Direction:3.1.2成员变量类GameJFrame:Public static boolean doubleModen;/变量判断是否开启双蛇模式Public static int COLS;/游戏窗口列数Public static int ROWS;/游戏窗口行数Public static int BLOCK_SIZE;/每个小格子间隔Private boolean gameOver;/判断游戏是否结束Public static int socre;

15、/分数Private Font font;/字体设置PaintThread paintThread;/类PaintThreadSnake s;/蛇类Snake s2;/第二只贪吃蛇Food e;/食物Image offScreenImage;/双缓存镜像image内部类PaintThread:Public Boolean running;/是否运行线程Public Boolean pause;/是否暂停线程Private GameFrame g/对GameJFrame的引用内部类KeyMonitor:Private GameJFrame gameJFrame;/对GameJFrame的引用类S

16、nake:Node head;/贪吃蛇头结点Node tail;/贪吃蛇尾巴结点Private int size;/当前有多少个结点,即蛇的长度Private GameJFrame gameJFrame;/对GameJFrame的引用内部类Node:Private int w;/点的宽度Private int h;/点的高度Private int row;/点所在的行数Private int col;/点所在的列数Public Node next;/下个节点Public Node Prev;/上个结点Direction direction;/方向枚举类类Food:Private int row

17、;/食物所在的行数Private int col;/食物所在的列数Private int w;/食物的高度Private int h;/食物的宽度Private Color color;/颜色Private static Random random;/随机类,用于随机生成食物的位置类Direction:U,/上D;/下L;/左R;/右3.1.3资源分配该游戏中的资源分配就是初始化窗口,和两个贪吃蛇以及食物等等一系列对象。3.2贪吃蛇游戏流程实现3.2.1主窗口初始化贪吃蛇游戏的游戏界面包括直线的勾勒、蛇身体的绘制、蛇移动范围的绘制等等。其中贪吃蛇的身体用什么方法绘制,才可以使得其在游戏过程中可

18、以实现“吃”的功能是很重要的。因此在游戏界面的初始绘制时就必须考虑到游戏时可能遇到的问题。本程序采用内部类Node来组成贪吃蛇的神态,内部类里面又有方法和属性,功能很强大,可以自己绘画出自己,还可以判断自己的位置,还可以随时间的变换而变换红绿颜色。对贪吃蛇的各个功能有很大的影响和帮助。游戏初始化时候,蛇只有一只,而且在左上角,游戏初始化的界面如下: 图3-1 游戏初始界面显示3.2.2初始化蛇和食物决定了用Node这个内部类来组成贪吃蛇,并且可以通过任意一个点访问他的下个点和前面一个点。故,贪吃蛇的组成问题已经解决了,但是贪吃蛇的食物如何达到随机出现,并且能够按照网格式与蛇头无偏差相接就是一个

19、亟待解决的问题。随机出现应采用类Random来实现,而食物与蛇头无偏差相接则利用坐标来解决。设置两个整型变量int row,int col作为食物出现的点的坐标,只要col*GameJFrame.BLOCK_SIZE, row*GameJFrame.BLOCK_SIZE, w, h,即可,其中w,h是相等的都等于小格子的宽度。也就是使食物与蛇头无偏差相接。只要调用本身的draw方法就可以画出自己这个点了,调用方法fillOval(int,int ,int ,int)即可。那么如何判断蛇吃到了食物呢?首先把蛇的头结点通过getRect返回得到,同时也把食物的坐标通过getRect返回得到,然后i

20、f(this.getRect().intersects(e.getRect()则就是吃到食物了,其中这个方法是通过查找java API找到的。而且大部分游戏判断是否接触都是通过这个方法的。那么蛇吃到食物也得到了解决。图3-2 蛇与食物的相接3.2.3开始游戏事件监听是这个游戏最为关键的一个,怎么样通过GameJFrame里面的事件监听来调用Snake里面的KeyPressed方法呢,如何传递事件呢?其实只要在GameJFrame里面事件监听的时候调用Snake里面的KeyPressed方法并把事件KeyEvent e传递进去就可以了。然后在调用snake里面的checkDead()方法来判断是

21、否死亡。当然,判断是否死亡的时候还要根据是否开启上帝模式的godModen来具体实现的,所以才可以有时候会死亡,有时候却是无敌。如图3-3所示。 (1)左 (2)下 (3)右 (4)上图3-3 键盘的上下左右键的效果贪吃蛇的死亡判断其实很简单,只要判断蛇的头结点是否超出了整个游戏窗口的边界。如果超出了,就暂停线程,画出string游戏结束的字样。还有一种死亡就是,贪吃蛇自己碰到自己的身体。只要遍历整只蛇,要是有一点跟头结点的行数和列数一样则可以判断贪吃蛇已经死亡。当开启上帝模式的时候,贪吃蛇超出边界时候则让他从边界的另外一边出来。如图所示图3-4 贪吃蛇的死亡食物的颜色可以随着时间的变换而变换

22、,时而变成绿色,时而变成红色。如何实现这个小功能呢?我们知道食物画是通过draw()的方法,那么只要在每一次重画自己的时候判断一下自己当前的颜色,如果自己当前是红色的,则设置自己的颜色是绿色,如果自己当前的颜色是绿色,则设置自己的颜色是红色。就这样可以随着线程的不断重画图像,而改变食物的颜色。当然也可以通过这个方法改变蛇本身的颜色,但是这样太花哨了而且也会拖慢整个程序的进行,故而放弃使用了。3.2.4无敌模式如果说玩贪吃蛇最让人不满意的是什么,那么我说就是在你最得意的时候却不小心松了方向盘,游戏结束。所以我自己想了一下,弄了个无敌模式,这样才能玩到腻为止,在闲来无聊的时候能让你开心好一段时间。

23、如何具体实现这个小功能呢?在蛇里面加一个boolean变量godModen。刚刚开始设置为false。只要稍微改动一下checkDead()方法,在判断死亡之前先判断当前是否为上帝模式?如果不是则按正常处理,而如果是上帝模式,就让蛇可以穿越任何地方,包括自己碰到自己的身体也死不了。private void checkDead() if(godModen = false) if(head.row GameJFrame.ROWS | head.col GameJFrame.COLS) gameJFrame.gameOver();for(Node n = head.next; n != null;

24、n = n.next) if(head.row = n.row & head.col = n.col) gameJFrame.gameOver();else if(head.row GameJFrame.ROWS-1) head.row = 1;if(head.col GameJFrame.COLS-1) head.col = 0;3.2.5双蛇模式同上帝模式一样好玩的是玩家可以一次性操控两只蛇。但是一只蛇的方向和另外一只蛇的方向是截然相反的。如果玩家同时开启上帝模式和双蛇模式就会有一种截然不同的感觉,那么怎么样才可以实现两只蛇出现在屏幕呢,而且还是方向操作相反的呢?同上帝模式一样,可以再Ga

25、meJFrame里面设置一个boolean变量doubleModen,并且在初始化的时候就创建第二条蛇。但是在画画的时候通过变量doubleModen来判断是否要画出第二只蛇。并且事件监听的时候也是根据这个变量来判断是否要监听第二只蛇,如果开启则启动第二只蛇的监听方法keyPressedDouble(KeyEvent),当然keyPressedDoubl(KeyEvent)和keyPressed(KeyEvent)大同小异,除了在方向上的区别。第四章 结果与讨论4.1程序运行和不足之地程序在开始的时候有点小卡,不明白是为什么?而且第一次结束的时候,游戏结束画面有点卡,但是第二次就不会了,猜想可

26、能是要加载资源比较慢才导致的。游戏没有声音,这个我觉得有点遗憾,毕竟这个世界没有了音乐就不完美了,再有音乐的条件下玩游戏会开心很多,这个可以在以后加上。游戏有两只蛇,所以导致了在解除资源占用的时候用到的size会重复,导致空指针错误,所以我没有消除两只蛇的资源,其实这个问题也不大,因为java有个垃圾回收器,在垃圾很多的情况下会自动回收资源的。而且这个小游戏即使你玩一天也玩不爆你的内存。4.2错误调试与分析在刚刚开始构建窗口的时候我就发现了一个问题,就是所画出来的行数会少于显示的行数,因为windows 7系统上有个横栏会挡住一个行数,所以我放弃那一行,从第二行开始游戏,在生成食物的时候也为了防止食物随机分配到那一行去,判断死亡等等跟边界有关的地方我都省去那一行。如果不用双缓存技术,整个游戏界面会一直不断的闪耀,根本没法玩。查阅资料我用上了双缓存技术但是依然闪耀严重,我很确定我方法调用正确。于是我想到了继承类JFrame和Frame的不同,把JFrame换成Frame结果就可以了。可能是这个技术只适合Frame,又或者是JFrame调用下的方法不一样。查阅资料未果。最后只能继承Frame来实现窗口。换面不闪耀了。 参考文献【1】 【2】 【3】

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com