面向对象综合设计-贪吃蛇

一.团队介绍

班级 网络1912
学号 201921123058
姓名 曹松锋(组长)
负责模块 登录界面的设计,文件的处理,UML类图,前期调查

班级 网络1912
学号 201921123045
姓名 洪志鸿(组员)
负责模块 蛇的移动,场景的图画,障碍物生成,碰撞检测,音乐特效

班级 网络1912
学号 201921123042
姓名 林海斌(组员)
负责模块 贪吃蛇与食物的图片设计,食物的创建与种类设计,获得焦点与键盘事件联系蛇的移动。

二.项目简介

游戏贪吃蛇,通过键盘方向键控制小蛇的移动方向,吃掉在地图上随机出现的食物,使小蛇长大(根据食物的不同存在不同的效果),同时每次小蛇吃到食物时便会得到相应的分数,当小蛇撞到自身或者地图上的障碍物时游戏结束。

三.项目采用技术

swing

四.功能需求分析

  • 1.登录与注册功能:确认登录用户信息,便于扩展记录用户游戏分数建立游戏历史分数排名。
  • 2.贪吃蛇游戏功能:
    • (1).地图功能:创建一定大小的地图为活动场地,并存在文字对游戏的功能进行解释。
    • (2).难度功能:通过在游戏中不同难度的选择,对地图进项障碍物(墙壁的增加),满足不同玩家的需求。
    • (3).基本的移动功能,使贪吃蛇根据玩家键盘输入的方向,随着时间的进行同时进行着移动。同时若撞上不能移动的地方游戏便会结束。
    • (4).食物功能:在地图上随机出现的食物,同时种类也是随机的,根据不同的种类有着不同的效果,增加游戏的趣味性,同时贪吃蛇也虽有所长大。
  • 3音乐与图片的使用:随着游戏的开始而开始的音乐,同时进食成功时也存在特效,对贪吃蛇也增加的图片来缓解单一的游戏性。

五.项目git地址

https://gitee.com/cao-songfeng/snakebag.git

六.项目git提交记录截图



七.项目功能架构图、主要功能流程图

八.面向对象设计UML类图

九.项目运行截图






十.项目关键代码

登录模块(采用了swing编程,将登录界面图形化在读写文件时采取try…catch使代码更加健壮,使用了swing线程的invokeLater方法,该方法用来请求事件分发线程以运行某段代码,且必须将这段代码放入一个Runnable对象的reun方法中,并指定Runnable对象作为参数传递给invokeLater)


数据模块(使用URL定位图片位置,再用ImageIcon实例化图片)

蛇的移动模块(使用了Timer类,通过设计刷新的时间,实现KeyListener和ActionListener接口实现对键盘按键和变量监听的方法,实现蛇的移动)

画出界面模块

难点是判断位置的坐标,使用画图Graphics类,实现了Jpanel的paintComponent方法,用里面的paintIcon,setColor,fillRect等方法实现

音乐播放模块


贪吃蛇食物模块

代码使用了GamePanel类的wall数据与snake数据进行墙壁与贪吃蛇的当前位置的记录,通过foodflag记录食物是否存在,来确保食物被食用时立即有新食物生成,且不会与贪吃蛇与墙壁位置相重叠,且通过对食物颜色foodcolor的随机来进行种类的分别与效果的产生,通过swing编程食用图片对食物进行包装。



十一.项目总结

洪志鸿:整个项目的设计是非常困难的,第一次接触这种图形化的游戏,但是过程又是十分有趣的。我们小组完成了贪吃蛇的基本功能,但是,仍有许多可以改进的地方,比如登录系统过于简单,贪吃蛇的玩法也有限,希望能够学习更多的知识来扩展项目的功能。一开始不知道怎么实现蛇的移动,使用键盘监听可以控制蛇的方向,但是怎么让蛇动起来不知道,最后结合Timer刷新来实现,简单的说,游戏界面的实现就是监听键盘和变量,控制刷新的时间来实现的。在设置不同难度时,我一开始想直接判定蛇是否撞墙,但是这样的代码量太大了,让我望而生畏,于是我定义一个wall数组,在画墙的同时,把墙的坐标输入wall数组中,这样,只要判断蛇头是否与墙重合即可,同时,也不能忘了让食物无法绘制在墙和蛇身上。在音乐播放界面中,我一开始用的不是wav格式,导致无法播放,然后在写地址时也不是像图片那么简单,只要将图片放入类的包中即可,而是要指向绝对路径,这搞得我一头雾水,最后实现了背景音乐和吃东西发出的声音后,在自己找bug时发现,当吃了7个东西之后背景音乐就停止了,我打开任务管理器查看CPU的占用,发现应该是我实现音乐的播放方式有问题,导致线程过多,当吃了7个东西时,CPU的占用突然就上升了百分之二十。但是继续吃东西还是可以发出声音的,这让我十分疑惑。

曹松锋:在将文本写入文件时,一开始用的是随机流RandomAccessFile,但在写入文件时,总是在每个字符之间加入一个空格,后来换为了文件输出流FileOutStream。各种组件之间的应用也是较为混乱,应用非常不熟练,我通过jdk文档以及上网查询慢慢了解这些知识与操作。然而这些都是较为基础的东西,我的提升空间还很大。前文也写到我还有未完成的功能,这些功能里面,若是实现出来可以使一个简单的登录系统也变得丰富起来。这次贪吃蛇的游戏界面代码主要由其他组员编写,但是我也稍有参与,在游戏功能上也有很大的改进和提升的空间,比如多蛇对战,比如玩家可设计地图等。经过这次课设,我发现了我有许多的不足,由于时间问题,课设的功能也只有目前这些,但以后还有很长的路要走欧,还有很多东西要学。

林海斌:本次课程设计中,为了实现贪吃蛇的移动学习到了通过timer延迟代码进行时间来完成贪吃蛇以一定速度的移动,也学会了在代码中利用URL和ImageIcon来实现通过图片的替代增加代码的形象感,并学习组员对音频文件的使用,明白了绝对地址在这些引用文件的重要性。本次代码编写中与组员分工写功能时很多数据却又相互联系,彼此之间的沟通使得代码更加的简短,但是在结合的时候彼此功能的混杂使得代码需要很多的注释才能确定作用和真正的使用位置,在之后互相学习的时候各自都对自己的代码添加很多标注。

posted @ 2021-01-28 21:10  临海文卫  阅读(190)  评论(0编辑  收藏  举报