UML建模——魔兽世界

针对如下所述的魔兽世界系统进行UML建模,绘制改系统的类图及每个类的状态图。类图中要求描述每个类的名称、属性、行为以及类/对象之间的关系。

魔兽世界

魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为1,2.3N(N<=20)。红魔军的司令部算作编号为 0的城市,蓝魔军的司令部算作编号为N+1的城市。司令部有生命元,用于制造武士。

一、两军的司令部都会制造武士

武士一共有 dragon、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种属性。双方的武士编号都是从1开始计算。红方制造出来的第n个武士,编号就是n。同样,蓝方制造出来的第 几个武士,编号也是n。武士在刚降生的时候有一个初始的生命值,生命值在战斗中会发生变化,如果生命值减少到0(生命值变为负数时应当做变为0处理),则武士死亡(消失)。有的武士可以拥有武器。武器有三种,sword,bomb,和 arrow,编号分别为 0,1.2。武士降生后就朝对方司令部走,在经过的城市如果遇到敌人(同一时刻每个城市最多只可能有1个蓝武士和一个红武士),就会发生战斗。每次战斗只有一方发起主动进攻一次。被攻击者生命值会减去进攻者的攻击力值和进攻者手中 sword 的攻击力值。被进攻者若没死,就会发起反击,被反击者的生命值要减去反击者攻击力值的一半(去尾取整)和反击者手中sword 的攻击力值。反击可能致敌人于死地。如果武士在战斗中杀死敌人(不论是主动进攻杀死还是反击杀死),则其司令部会立即向其发送8个生命元作为奖励,使其生命值增加8。当然前提是司令部得有8个生命元。如果司令部的生命元不足以奖励所有的武士,则优先奖励距离敌方司令部近的武士。“如果某武士在某城市的战斗中杀死了敌人,则该武士的司令部立即取得该城市中所有的生命元。注意,司令部总是先完成全部奖励工作,然后才开始从各个打了胜仗的城市回收生命元。对于因司令部生命元不足而领不到奖励的武士,司令部也不会在取得战利品生命元后为其补发奖励。如果一次战斗的结果是双方都幸存(平局),则双方都不能堂走发生战斗的城市的生命元。城市可以插旗子,一开始所有城市都没有旗子。在插红旗的城市,以及编号为奇数的无旗城市,由红武士主动发起进攻。在插蓝旗的城市,以及编号为偶数的无旗城市,由蓝武士主动发起进攻。

当某个城市有连续两场战斗都是同一方的武士杀死敌人(两场战斗之间如果有若干个战斗时刻并没有发生战斗,则这两场战斗仍然算是连续的;但如果中间有平局的战斗,就不算连续了),那么该城市就会插上胜方的旗帜,若原来插着败方的旗帜,则败方旗帜落下。旗帜一旦插上,就一直插着,直到被敌人更换。一个城市最多只能插一面旗,旗帜没被敌人更换前,也不会再次插同颜色的旗。

二、各种武器有其特点

sword 武器的初始攻击力为拥有它的武士的攻击力的 20%(去尾取整)。但是 sword 每经过一次战斗(不论是主动攻击还是反击),就会变钝,攻击力变为本次战斗前的80%(去尾取整)。sword 攻击力变为0时,视为武士失去了sword。如果武士降生时得到了一个初始攻击力为0的sword,则视为武士没有sword.arrow 有一个攻击力值 R。如果下一步要走到的城市有敌人,那么拥有 arrow 的武士就会放箭攻击下一个城市的敌人(不能攻击对方司令部里的敌人)而不被还击。arrow 使敌人的生命值减少 R,若减至小于等于 0,则敌人被杀死。arrow 使用 3 次后即被耗尽,武士失去arrow。两个相邻的武士可能同时放箭把对方射死。拥有 bomb 的武士,在战斗开始前如果判断自己将被杀死(不论主动攻击敌人,或者被敌人主动攻击都可能导致自己被杀死,而且假设武士可以知道敌人的攻击力和生命值),那么就会使用 bomb和敌人同归于尽。武士不预测对方是否会使用bomb。武士使用 bomb 和敌人同归于尽的情况下,不算是一场战斗,双方都不能拿走城市的生命元,也不影响城市的旗帜。

三、不同的武士有不同的特点

1、dragon

dragon 可以拥有一件武器。编号为n的 dragon 降生时即获得编号为 n%3 的武器。dragon还有“士气”这个属性,是个浮点数,其值为它降生后其司令部剩余生命元的数量除以造dragon 所需的生命元数量。dragon 在一次在它主动进攻的战斗结束后,如果还没有战死,而且士气值大于 0.8,就会欢呼。dragon每取得一次战斗的胜利(敌人被杀死),士气就会增加 0.2,每经历一次未能获胜战斗,士气值就会减少0.2。士气增减发生在欢呼之前。

2、ninia

ninia 可以拥有两件武器。编号为n的 ninia 降生时即获得编号为 n%3 和(n+1)%3 的武器。ninia 挨打了也从不反击敌人。

3、iceman

iceman 有一件武器。编号为n的iceman 降生时即获得编号为 n%3 的武器。iceman 每前进两步,在第2步完成的时候,生命值会减少9,攻击力会增加20。但是若生命值减9后会小于等于 0,则生命值不减9,而是变为1。即iceman 不会因走多了而死。

4、lion

lion 有”忠诚度”这个属性,其初始值等于它降生之后其司令部剩余生命元的数目。每经过一场未能杀死敌人的战斗,忠诚度就降低K。忠诚度降至0或0以下,则该 lion 逃离战场,永远消失。但是已经到达敌人司令部的“ion 不会逃跑。Lion 在已方司令部可能逃跑。ion 若是战死,则其战斗前的生命值就会转移到对手身上。所谓“战斗前”,就是每个小时的 40 分前的一瞬间。

5、wolf

wolf 降生时没有武器,但是在战斗中如果获胜(杀死敌人),就会缴获敌人的武器,但自己已有的武器就不缴获了。被缴获的武器当然不能算新的,已经被用到什么样了,就是什么样。

四、不同时间会发生的不同事件

在每个整点,即每个小时的第0分,双方的司令部中各有一个武士降生。

红方司令部按照 iceman、lion、wolf、ninja、dragon 的顺序制造武士。

蓝方司令部按照 lion、dragon、ninja、iceman、wolf 的顺序制造武士。

制造武士需要生命元。

制造一个初始生命值为 m 的武士,司令部中的生命元就要减少 m 个。

如果司令部中的生命元不足以制造某武士,那么司令部就等待,直到获得足够生命元后的第一个整点,才制造该武士。例如,在2:00,红方司令部本该制造一个 wolf ,如果此时生命元不足,那么就会等待,直到生命元足够后的下一个整点,才制造一个wolf。

在每个小时的第5分,该逃跑的lion就在这一时刻逃跑了。

在每个小时的第 10分:所有的武士朝敌人司令部方向前进一步。即从已方司令部走到相邻城市,或从一个城市走到下一个城市。或从和敌军司令部相邻的城市到达敌军司令部。

在每个小时的第 20分:每个城市产出10个生命元。生命元留在城市,直到被武士职走。

在每个小时的第 30分:如果某个城市中只有一个武士,那么该武士取走该城市中的所有生命元,并立即将这些生命元传送到其所属的司令部。

在每个小时的第 35分,拥有arow 的武士放箭,对敌人造成伤害。放箭事件应算发生在箭发出的城市。注意,放箭不算是战斗,因此放箭的武士不会得到任何好处。武士在没有敌人的城市被箭射死也不影响其所在城市的旗帜更换情况。

在每个小时的第 38 分,拥有 bomb 的武士评估是否应该使用 bomb。如果是,就用 bomb

和敌人同归于尽。

在每个小时的第 40分:在有两个武士的城市,会发生战斗。如果敌人在5分钟前已经被飞来的arow射死,那么仍然视为发生了一场战斗,而且存活者视为获得了战斗的胜利。此情况下不会有“武士主动攻击”,"武士反击”,“武士战死”的事件发生,但战斗胜利后应该发生的事情都会发生。如 Wolf 一样能缴获武器,旗帜也可能更换,等等。在此情况下,Dragon 同样会通过判断是否应该轮到自己主动攻击来决定是否欢呼。

在每个小时的第 50分,司令部报告它拥有的生命元数量。

在每个小时的第 55分,每个武士报告其拥有的武器情况。

武士到达对方司令部后就算完成任务了,从此就呆在那里无所事事。

任何一方的司令部里若是出现了2个敌人,则认为该司令部已被敌人占领。

任何一方的司令部被敌人占领,则战争结束。战争结束之后就不会发生任何事情了。

五、绘图(基于UML)

1、总体系统的类图

2、Dragon状态图

3、Ninja状态图

4、Iceman 状态图

5、Lion状态图

6、Wolf状态图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梳子烟YAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值