Bootstrap

【老白学 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。

这些元素的相互关系如下:

结构图
执行流程:

  1. 游戏开始后,main 方法首先创建战舰调度类的实例对象;
  2. 战舰调度类创建 GameHelper 实例对象辅助处理;
  3. 战舰调度类创建一个 ArrayList 保存所有 Warship 对象;
  4. 战舰调度类新建三个 Warship 对象放入自己的 ArrayList 中;
  5. 战舰调度类向 GameHelper 申请所有战舰位置;
  6. 战舰调度类把位置发送给每个 Warship;
  7. Warship 收到位置后保存在自己的 ArrayList 中;
  8. 战舰调度类向 GameHelper 申请玩家输入;
  9. 战舰调度类向每个 Warship 发出指令,要求各自检查是否被命中;
  10. Warship 检查自己的位置列表,并将检查结果返回给调度类;
  11. 重复执行 8~10 步骤,直到所有战舰都被「sunk」。

通过上面的关系图和流程描述,我们可以了解每个类的职能分工。 大家只做自己分内的事情,这样才不至于逻辑混乱。 下一篇,老白继续对 Warship 类进行修改,完成上述规划的目标。


《 上一篇 Warship v2.0(二)下一篇 Warship v2.0(四)
;