架构设计

最终架构

figure


具体模块

指令处理Slover

为了保持main函数的简洁,我们将对输入指令的处理单独拿出来.
识别指令的类型,调用相应的方法实现指令的效果.

冒险者Adventure

冒险者本身有4个属性:hitPoint,atk,def,mana
为了方便这些属性的获取和更改,我们建立相应的getset方法.

物品Item

  • Bottle:
    • HpBottle增加被使用者的hitPoint
    • AtkBottle增加被使用者的atk
    • DefBottle增加被使用者的def
    • ManaBottle增加被使用者的mana
  • Equipment
    • Armour加成被使用者的最终def
    • Weapon
      • Sword加成被使用者的最终atk
      • MagicBook消耗使用者mana,加成被使用者的最终atk
  • Spell
    • HealSpell消耗使用者mana,加成被使用者的hitPoint
    • AtkSpell消耗使用者mana,减少被使用者的hitPoint
      对于这些物品,我们在冒险者中建立相关的botList,equipList,spellList.

      Factory

      用于对冒险者的物品进行管理.侧重于实现拥有.
  • botList中添加/删除Bottle
  • equipList中添加/删除Equipment
  • spellList中添加/删除Spell

    Backpack

    用于对冒险者的物品进行管理.侧重于实现携带.
  • botTakeList(上限为10)中添加/删除Bottle
  • 设置携带的装备armourTake,weaponTake

    Store

    实现对冒险者金钱的管理.
  • 购买具有相应法力值的Bottle或者Equipment
  • 继承死亡冒险者的金钱

    Fight

    实现冒险者之间的战斗.
  • 物理攻击 WeaponTake不存在或者TypeSword
  • 魔法攻击 WeaponTakeTypeMagicBook

    雇佣关系

    实现对于冒险者之间的关系的处理.一个冒险者只能有一个直属上级,并且雇佣关系是单向的.
  • 添加/删除雇佣关系
  • 批量添加雇佣关系(递归下降)
  • 判断关系
    • 上级 直属上级,所有上级的上级
    • 下级 直属下级,所有下级的下级
    • 盟友 自己以及所有的上下级

迭代调整

hw2

  • 学会ArrayList的使用
  • 建立最基础的Adventure类,Bottle类,Equipment
  • 指令类型
    • 添加/删除冒险者
    • 为某个冒险者添加/删除药水瓶
    • 为某个冒险者添加/删除装备

      hw3

  • 继承以及接口的使用
  • 新增内容
    • 新增冒险者的4个属性
    • 引入法术Spell
    • 详细划分Bottle 4种药水瓶,继承Bottle父类.
    • 引入背包系统
    • 引入可用物品 新增接口Usage 判断物品是否可用
      • Bottle 拥有并携带
      • Spell 学习过并且冒险者mana属性大于manaCost
  • 新增指令
    • 使冒险者学习法术
    • 使冒险者携带某个物品
    • 冒险者对某一个目标使用某个物品
    • 移除物品(合并之前的移除指令)

      hw4

  • 知识学习
    • 深克隆与浅克隆
    • ==/equals?
    • String类的使用(包括substring的使用)
    • Map接口的实现如何比较key的相等性
    • 遍历容器(迭代器的删除)
    • Scanner.next()的使用
  • 与迭代作业无关

    hw5

  • 知识学习
    • HashMap与HashSet
    • 工厂模式(类创建型模式)
      • 简单工厂模式
      • 工厂模式
      • 抽象工厂模式
  • 新增内容
    • 细分Equipment,继承父类
    • 实现背包中物品的数量控制
    • 新增战斗系统
    • 新增金钱系统
  • 新增指令
    • 冒险者去商店进行一次购买操作
    • 冒险者进行一次战斗

      hw6

  • 知识学习
    • 观察者模式
  • 新增内容 雇佣关系的定义
    • 新增EmployerEmployee接口
    • 被观察者(Employer)需要援助,通知观察者(Employee)
  • 新增指令
    • 添加一个关系
    • 删除一个关系

      hw7

  • 知识学习
    • 文法
    • 词法语法分析
    • 递归下降
  • 新增内容 批量添加雇佣关系
    • 新增Expr(冒险者),Term(被雇佣者),Factor(标识符)
    • 词法分析Lexer
    • 语法分析Parser
  • 新增指令 导入一组雇佣关系

使用Junit的心得与体会

  • 最开始写觉得是一件很麻烦的事情,但是随着代码越来越复杂,涉及到的部分越来越多就会发现Junit的好处.经常在写Junit的过程中就发现了bug并解决了,节省了不少时间.
  • 测试方法
    • 先测试一个方法内部没有问题,再以这个方法为基础测试其它方法.
    • 从整体的角度测试整个代码的运行架构
    • 使用Assert比较关键部分的预期值与实际值

学习OOpre的心得体会

  • 从面向过程到面向对象的过程转变
    • 从类的角度去看,使方法的编写更加清晰
  • 从整体到局部的思维转变
    • 以递归下降为例,只关注局部,使代码编写更加简洁
  • 更深刻地理解封装的思想与内涵
    • 只关心调用,不关心内部实现

对OOpre课程的简单建议

很喜欢这门课,老师讲得非常好,助教很用心负责,作业也很有意思。