【老白学 Java】Warship v2.0(三)
Warship v2.0(三)
文章来源:《Head First Java》修炼感悟。
上一篇文章中,老白为大家演示了使用 ArrayList 列表解决 Warship 类「重复命中」的问题,体会到了列表带给我们的空前便利。 本篇文章正式进入 v2.0 的开发工作,首先分析设计思路以及主要的实现技术。
项目进度:
- 解决 v1.0 遗留问题
- 分析 v2.0 的设计思路及实现技术
- 重新设计的 Warship 战舰类
- 更加专业的 WarshipManager 调度类
- 功能更强的 GameHelper 辅助类
任务二、分析 v2.0 的设计思路及实现技术
1、v2.0 有什么不同
相对于 v1.0 简单的 1x7 棋盘格,正在开发的 v2.0 版本使用了 7x7 方阵,并且把战舰数量提升到了 3 艘,每艘战舰拥有不同的名字,位置,以及朝向。
1.1 游戏目标
玩家使用最少次数打掉方阵中的所有战舰,电脑根据玩家表现进行评分。
1.2 初始设置
游戏启动后,电脑会在虚拟的 7x7 棋盘格中随机安排 3 艘战舰,然后要求玩家开始猜测战舰位置。
1.3 游戏操作
电脑会提示玩家输入猜测的位置,玩家输入「列+行」的编号组合,如 A3、C5 这样的符号。 电脑会根据输入的位置反馈攻击结果,比如没命中「miss」、命中「hit」、击沉「sunk」这样的信息。 当玩家打掉所有战舰后,电脑给出评分并结束游戏。
2、设计思路
v2.0 需要改动三个类:
- Warship
在原来战舰类的基础上,增加了舷号的实例变量。 如果被「sunk」就会显示被击沉的战舰舷号。 - WarshipManager
因为要管理多艘战舰,所以新建了战舰调度类,与战舰相关的指令都由它发出。 v1.0 类似功能都是在测试类main
方法中完成的,v2.0 把它独立出来,可以使逻辑划分更加清晰。 WarshipManager 类主要负责以下任务:- 创建所有战舰
- 指定战舰舷号
- 布置战舰到棋盘格中
- 战舰命中检测
- 游戏评分
- GameHelper
继续使用 v1.0 的辅助工具类,不过新增加了几个方法。 其中布置战舰的算法比较复杂,需要考虑是否重叠等问题,所以放到这个类中实现,这样就不会干扰到游戏的主要逻辑。
3、实现技术
这次更新涉及到以下元素:
- 3 个类:Warship、WarshipManager、GameHelper;
- 5 个对象:WarshipManager x 1,Warship x 3,GameHelper x 1;
- 4 个 ArrayList:战舰调度类 x 1,战舰类 x 3。
这些元素的相互关系如下:
执行流程:
- 游戏开始后,
main
方法首先创建战舰调度类的实例对象; - 战舰调度类创建 GameHelper 实例对象辅助处理;
- 战舰调度类创建一个 ArrayList 保存所有 Warship 对象;
- 战舰调度类新建三个 Warship 对象放入自己的 ArrayList 中;
- 战舰调度类向 GameHelper 申请所有战舰位置;
- 战舰调度类把位置发送给每个 Warship;
- Warship 收到位置后保存在自己的 ArrayList 中;
- 战舰调度类向 GameHelper 申请玩家输入;
- 战舰调度类向每个 Warship 发出指令,要求各自检查是否被命中;
- Warship 检查自己的位置列表,并将检查结果返回给调度类;
- 重复执行 8~10 步骤,直到所有战舰都被「sunk」。
通过上面的关系图和流程描述,我们可以了解每个类的职能分工。 大家只做自己分内的事情,这样才不至于逻辑混乱。 下一篇,老白继续对 Warship 类进行修改,完成上述规划的目标。
《 上一篇 Warship v2.0(二) | 下一篇 Warship v2.0(四) |
---|