《贪吃蛇》课程案例指导书Word文档格式.docx
《《贪吃蛇》课程案例指导书Word文档格式.docx》由会员分享,可在线阅读,更多相关《《贪吃蛇》课程案例指导书Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
Snake:
提供游戏中蛇相关的数据(如节点集和移动方向等)和行为(如蛇的生长、移动、碰撞检测等)的封装。
Node:
游戏中最小组成单元,可表示蛇的节点、食物、障碍物。
包含节点位置信息及节点类型,为配合Java集合类的操作需要重写equals方法。
GameServer:
业务模型对外公开接口(满足迪米特法则),即提供中介服务,包括蛇的创建和管理、食物的创建、分数监听机制、游戏结束监听机制等。
NodeType:
节点类型枚举,分为Node、Food、Rock三种。
Direction:
游戏方向枚举,分为Left、Up、Right、Down四个。
OverListener:
游戏结束监听接口。
ScoreListener:
分数监听接口。
3.添加界面模型包game.view,并添加如下类:
FrameGame:
游戏主界面
PanelGame:
游戏画布,即游戏区域
PanelInfo:
游戏信息面板,包括分数显示、计时显示、开始按钮。
MenuGame:
游戏菜单,包括Game、View、Help等。
4.添加控制器模型包game.control,并添加如下类:
GameController:
游戏中控
PlayerController:
玩家控制器,实现键盘监听和开始按钮监听。
5.添加游戏工具包game.util,并添加如下类:
DigitIamge:
动态生成数字图片
GameImage:
集中管理游戏中所有图片
GameConfig:
集中管理游戏配置信息
6.添加游戏国际化资源包game.i18n,并添加如下文件(菜单选项中的File):
base.properties:
默认资源文件,特定资源或本地资源找不到时用。
base_zh_CN.properties:
中文资源文件。
7.在项目下添加配置文件config.properties
8.在项目下添加图片文件夹imgs,添加节点、食物、logo、开始按钮、0-9数字图片。
最终完成的项目组织结构如下:
实现细节:
为了减少代码的修改,我们将按工具类、业务类、界面类、控制类的顺序进行实现,这种方式的缺点是不能及时看到GUI界面,因此不能边写边运行边测试。
请保持耐心,坚持到底!
1.GameImage类的实现:
图片集中管理的好处是方便查找和修改,因此本类的主要功能就是统一加载游戏中所有图片,并按需对外提供get访问器。
鉴于外界使用该类的方便,其中成员变量全部设定为static(类成员),并提供静态初始化块来加载图片。
其中splitImage方法的作用为:
将加载的0-9数字整张图片切割为10张单独的数字图片,用到内存图片及包含10个参数的drawImage方法,请仔细理解处理过程。
源代码GameImage.java
2.DigitImage类的实现:
根据指定位数、指定数值动态生成相应数字图片,位数不足则前面补0,超出则截断高位。
例如指定位数为3,数13的图片为
,而数1234的图片为
。
完成该功能的算法为:
从右至左依次绘制数字,直到指定位数为止,具体实现如下:
源代码DigitImage.java
3.GameConfig类实现:
该类主要作用是完成游戏配置信息的管理。
使用配置文件保存游戏信息的方式,可以避免程序代码中的硬编码问题,达到程序动态修改配置信息而不用修改代码的目的,满足面向对象原则中的开关原则(对扩展开放,对修改关闭)。
Java提供的Properties类可以从配置文件中读取信息,然后以字典结构进行存储(key-value对),访问时可以根据键值查找相应的值。
配置文件的扩展名为.properties,本游戏中的配置文件config.properites如下:
本程序中主要是体验配置管理的好处,因此管理的配置信息比较少,真实项目中可以进行扩展。
有了配置文件,GameConfig的实现如下:
源代码GameConfig.java
4.NodeType枚举定义:
Java中提供的枚举类型表示一组命名常量,常用于三个及以上状态信息的表示。
游戏中的节点类型可以包括蛇节点、食物节点、障碍物节点,可以扩展出蛇头节点、蛇尾节点等,定义如下:
源代码NodeType.java
5.Node类实现:
包含节点位置信息(节点所处位置的行列号)及节点类型,为配合Java集合框架中的集合类使用,需要重写Object的equals方法,具体实现如下:
源代码Node.java
6.Direction枚举的定义:
蛇的移动方向包括上下左右四个方向。
源代码Direction.java
7.Snake类的实现:
提供游戏中蛇相关的数据和行为封装。
信息包括蛇的节点集、移动方向等,功能包括蛇的绘制、移动、增长、吃食物及检测等。
数据结构采用Java集合框架中的顺序表ArrayList,考虑到顺序表的操作效率,具体功能实现时只在顺序表的尾部进行以减少顺序表中的元素移动,因此将蛇的头部保存在顺序表的尾部,蛇增长的时候也从顺序表尾部追加并修改蛇头部为新增节点。
实现中还使用到Java提供的第四种循环结构:
foreach循环,专门用于集合性质的数据进行从头到尾依次遍历的循环操作,如数组、顺序表等,其语法结构为:
for(集合元素类型变量名:
集合或数组){通过变量从头到尾依次访问集合元素;
}。
Snake的具体实现代码如下:
源代码Snake.java
8.Java中的事件机制:
面向对象语义中的事件是描述对象之间的一种通信关系,涉及事件、事件定义者、事件使用者三个对象。
事件本身是一个中介,即委托,其中只进行调用规范的定义
,Java中本身未提供相应语法,需要使用接口进行模拟实现。
事件定义者是事件源,其中持有事件的引用,并提供事件定制方法
以及事件触发时机的实现
事件使用者需要完成事件定制
和事件调用规范的实现(即提供事件处理程序)
一个完整的事件机制包括上述5个步骤才能实现,而前面介绍JavaSwing中的事件处理时,我们只需完成4、5两个步骤,而前三个步骤由JavaAPI完成。
本游戏中游戏结束和游戏得分需要使用事件机制进行实现,业务模型中完成前三步,控制模块中完成后两步。
此处完成第1步即事件监听器接口的定义:
源代码OverListener.java
源代码ScoreListener.java
9.GameServer类的实现:
游戏服务器,采用外观模式(满足迪米特法则)封装业务模型,是业务模型对外提供的唯一接口。
包含蛇对象、食物对象、游戏得分、游戏结束监听器引用、游戏得分监听器引用,对外提供游戏开始、游戏绘制、游戏进行等方法,并提供事件定制方法及事件触发的时机实现。
该类实现时主要是进行简单处理后通知其他业务对象执行相应的操作,具体代码如下:
源代码GameServer.java
10.PanelInfo类的实现:
游戏信息面板,继承于JPanel,包括游戏计时、计分的显示及开始图片按钮,内部组件使用Box进行组织,容器本身的布局方式设置为BorderLayout,并为容器添加立体(凹陷效果)的边框,具体实现代码如下:
源代码PanelInfo.java
11.PanelGame类的实现:
游戏绘制面板,继承于JPanel,持有游戏服务器对象的引用,重绘的时候通知该对象进行自身的绘制操作。
为该容器添加了立体(凹陷效果)的边框,具体实现代码如下:
源代码PanelGame.java
12.Java中国际化和本地化的支持:
国际化与本地化的意思是软件中的文本、日期、数字等和区域文化相关的信息,可以根据当前的区域设置进行动态自适应。
Java中通过Locale区域文化类、ResourceBundle资源包和相应的格式化对象对国际化与本地化进行支持,其执行步骤如下:
1)提供扩展名为.properties的不同区域资源文件,命名要求为“资源名_语言_地区.properties”,如无语言和区域信息则为默认资源文件,程序中必须提供这个默认文件。
以中文为例,至少有base.properties、base_zh_CN.propertes两个资源文件。
资源文件中每行以键值对的方式提供,如”title=标题”。
将资源文件放入到项目的java包中,建议用单独的package保存。
2)使用指定语言和区域信息创建Locale对象
3)使用ResourceBundle类,提供资源文件名(不包含语言和区域信息)和Locale对象加载资源文件。
不提供Locale对象则使用当前电脑的区域设置。
加载时顺序为指定语言区域的资源文件,未找到则加载当前区域设置的资源文件,再找不到则加载默认资源文件。
因此默认资源文件必须提供。
4)使用ResourceBundle对象的getString方法获取本地化文本信息。
游戏中对菜单中文本信息进行了国际化处理,资源文件保存在game.i18n包中,默认资源文件base.properties如下:
中文资源文件base_zh_CN.propertes如下:
在Eclipse中,中文显示为其unicode编码方式。
如果要用中文方式进行编辑,则编辑后需要使用native2ascii这个JDK工具进行转换,详情自己XX解决。
13.MenuGame类的实现:
游戏菜单,继承于JMenuBar,持有ResourceBundle对象的引用和GameController(游戏中控)对象的引用,菜单组只有游戏和帮助两个。
游戏菜单可以理解为另一个玩家控制器,玩家进行菜单操作通知游戏中控执行相应功能,由于游戏中控类还未完成,所以该类也有未实现的地方,回头再修改。
游戏菜单文本实现了国际化与本地化的支持,具体实现如下:
源代码MenuGame.java
14.FrameGame类的实现:
游戏主界面,组装PanelInfo和PanelGame,采用Box进行布局,负责通知PanelInfo对象完成相应操作。
界面中间单元格为游戏信息显示和游戏界面,使用JPanel及BorderLayout进行布局,其具体实现如下:
源代码FrameGame.java
15.PlayerController类的实现:
玩家控制器,实现开始按钮点击事件及键盘事件,持有游戏中控对象的引用。
具体实现需要等GameController完成后才能补全。
源代码PlayerController.java
16.GameController类的实现:
游戏中控,负责界面、业务模型的创建和组装,负责创建玩家控制器和玩家菜单并组装,负责游戏线程和时间线程的管理,最后开启游戏、显示游戏、进行游戏方向操作。
该类所起的主要作用就是完成游戏各个模块的创建及安装(这里的意思是就是在对象间建立联系),其具体实现如下:
源代码GameController.java
17.MenuGame代码补全:
按如下显示完成代码
18.PlayerController代码补全:
19.GameEntry类实现:
程序入口方法实现,创建游戏中控对象,并显示界面。
源代码GameEntry.java
大功告成!
希望你的贪吃蛇已经可以玩了!