RetroSnake课程设计团队博客

团队介绍

团队课设名称:RetroSnake(贪吃蛇)

团队成员介绍:王予平(组长)吴潮汇 陈荣灿 普建宇

团队成员课程设计博客链接

王予平:https://www.cnblogs.com/pikaaaqiu/p/12172121.html
吴潮汇:https://www.cnblogs.com/wch045/p/12171214.html
陈荣灿:https://www.cnblogs.com/crc01/p/12169274.html
普建宇:

项目需求:

i. 随着科技的飞速发展,越来越多的游戏如雨后春笋般出现,对于有选择困难症的怀旧玩家,他们没有很多时间去挑选游戏,这时候就需要一款简单,方便的游戏来娱乐。

ii. 双人模式可满足玩家偶尔想要和朋友一起玩的需求。

iii. 贪吃蛇游戏节奏快,可随时暂停或者继续,有挑战性,可在碎片时间进行游戏。

系统描述:

项目简介:
用上、下、左、右键控制蛇(Snake类)的运动方向,使之向着有食物(Food类) 的方向运动,并吞吃食物使身体增长并获得相应分数,如果蛇在移动过程中,撞到墙壁、障碍物或者身体交叉蛇头撞到自己的身体则游戏结束
1.挑战模式:选择关卡进行游戏,挑战在规定时间内达到最高分数。
2.闯关模式:选择关卡进行游戏,得到一定分数即过关,进入下一图;
3.双人模式:双人对战,玩家二通过WASD进行移动,哪方触碰到对方身体或触碰到自身身体或墙壁/障碍物即死亡,依据各个分数进行比赛。
4.娱乐模式:双人抢食,类似于"无敌版",取消所有的碰撞检测;

Git

gitee地址:

https://gitee.com/Hi_wYp/dashboard

gitee提交记录:

项目方案

主要功能框架

项目方案

UML类图

MVC模式

场地类

蛇类

碰撞检测



个人负责的主要功能展示与代码分析

王予平

主要任务:
         1. 负责实现双人模式
         2. 撰写团队博客
         3. 背景音乐设置C
         4. 代码规范和警告处理(idea与Alibaba Java Coding Guidelines)
功能与代码分析:
  1. 问题:ArrayList是我们经常在代码中使用的集合类,但是当ArrayList在执行remove方法时会出现ConcurrentModificationException。
    解决:原因是checkForComodification()方法里modCount与exceptedModCount不同造成的。比较两个值,是因为ArrayList即从List中继承了iterator(),又从AbstractList中继承了list;为了实现ArrayList的Fail-Fast机制。Fail-Fast机制的作用是避免ArrayList在迭代过程中数组结构发生变化的问题。所以会进行两个数据的判断,查看是否改变了数据结构。所以不要在foreach的循环里进行元素的add/remove操作,使用iterator的remove()方法删除元素;

  2. 问题:双人模式的实现:一条蛇继承另一条蛇并对相应方法经行覆盖,在controller(控制台)复用一个单线程时产生了线程冲突且当一条蛇死亡时蛇身没有及时消失且程序崩溃;
    解决:两条蛇为单独的两个类,拥有单独的两个线程,修改GamePanels的paint方法和recover方法使用的判断条件解决问题;

  3. 问题:背景音乐的实现;
    解决:在view包里新建一个Music类,在controller(控制台)添加新的music对象,在StartHandler监听器内并执行其start()方法;
    待改进:只能使用wav类型的无损音乐;

吴潮汇

主要任务:
  GUI界面的设计与优化
功能与代码分析:
  1. 问题:JPannel无法填满JFrame导致的背景图片无法全屏
    解决:新建一个大的JPannel1放在BorderLayout布局的JFrame的CENTER,然后在Jpannel1里面建一个GridLayout用来布置按钮。这样就能使得背景图片充满窗体了。

  2. 问题:JPannel2的空白背景遮盖住后面JPannel1的背景图
    解决:将JPannel2的背景设置为了NULL,这样就不会挡住JPannel1的背景图片了

  3. 问题:按钮圆形图片导入后,图片不能完全覆盖按钮,导致的不美观问题。
    解决:去除按钮的边框和填充,这样显示就是整个图片而不会出现按钮了。

陈荣灿

主要任务:
 负责实现闯关模式
 负责实现挑战模式
 串联GUI与信息代码
 实现排行榜功能
功能与代码分析:
  1. 问题:挑战模式的时间线程关闭后不能重启
    解决:每次在开始游戏时会创建一个时间线程,当以任何一种方式结束游戏(蛇死亡或点击结束游戏按钮),线程关闭,再次开始游戏会重新创建一个时间线程。
  2. 问题:闯关模式中如何实现到下一个关卡
    解决:当在当前关卡中达到通关条件时,会让蛇死亡以结束当前游戏,当点击弹窗的下一关卡时,会重新建立游戏,并赋予下一关卡地图
  3. 问题:排行榜的实时更新
    解决:当挑战模式或闯关模式中破纪录了,会读入文件,而每当点击排行榜时,都会从文本中读数据,再返回给界面

普建宇

主要任务:

1、负责实现娱乐模式
2、负责食物类图片实现
3、负责地图的制作

功能与代码分析:
  1. 问题:娱乐模式实现;
    解决:娱乐模式为双人模式,在ControllerAmusement类中去除了碰撞墙壁的限制,游戏模式为玩家1和玩家2吃食物,如果有一方吃到自己身体,则游戏结束,吃食物多的玩家获胜,如果吃的同样多,则平局。

  2. 问题:食物图片的实现;
    解决:先把10张食物图片放到i.foodPicture包里,在food类的drawMe方法里,使用drawImage函数,把图片重绘到游戏界面。

项目总结

测试:多次的测试过程中,有时候食物出现地点会出现点问题(会与蛇身位置重叠),但并不影响游戏的进程。
改进:娱乐模式没有真正的完成,各种特殊的食物没有派上用场,地图是固定的,大大降低了游戏的难度。
感想:经过这次的课程设计,我体会到了团队合作的重要性。让我对多线程和GUI和各种类的方法有了更深的理解和使用;其次我也感受到了代码规范以及代码警告处理的重要性。一个好的java项目一定要有严格规定的规范标准,也对java开发的游戏项目有了初步的认识与理解

原文地址:https://www.cnblogs.com/pikaaaqiu/p/12171064.html