依赖注入那些事儿 --看到的一篇不错的文章
|
1 IGame游戏公司的故事 1.1 讨论会 话说有一个叫IGame的游戏公司,正在开发一款ARPG游戏(动作&角色扮演类游戏,如魔兽世界、梦幻西游这一类的游戏)。一般这类游戏都有一个基本的功能,就是打怪(玩家攻击怪物,借此获得经验、虚拟货币和虚拟装备),并且根据玩家角色所装备的武器不同,攻击效果也不同。这天,IGame公司的开发小组正在开会对打怪功能中的某一个功能点如何实现进行讨论,他们面前的大屏幕上是这样一份需求描述的ppt: 图1.1 需求描述ppt 各个开发人员,面对这份需求,展开了热烈的讨论,下面我们看看讨论会上都发生了什么。 1.2 实习生小李的实现方式 在经过一番讨论后,项目组长Peter觉得有必要整理一下各方的意见,他首先询问小李的看法。小李是某学校计算机系大三学生,对游戏开发特别感兴趣,目前是IGame公司的一名实习生。 经过短暂的思考,小李阐述了自己的意见: “我认为,这个需求可以这么实现。HP当然是怪物的一个属性成员,而武器是角色的一个属性成员,类型可以使字符串,用于描述目前角色所装备的武器。角色类有一个攻击方法,以被攻击怪物为参数,当实施一次攻击时,攻击方法被调用,而这个方法首先判断当前角色装备了什么武器,然后据此对被攻击怪物的HP进行操作,以产生不同效果。” 而在阐述完后,小李也飞快的在自己的电脑上写了一个Demo,来演示他的想法,Demo代码如下。 Code:怪物 1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace IGameLi 7: {
8: /// <summary> 9: /// 怪物 10: /// </summary> 11: internal sealed class Monster 12: {
13: /// <summary> 14: /// 怪物的名字 15: /// </summary> 16: public String Name { get; set; }
17: 18: /// <summary> 19: /// 怪物的生命值 20: /// </summary> 21: public Int32 HP { get; set; }
22: 23: public Monster(String name,Int32 hp) 24: {
25: this.Name = name; 26: this.HP = hp; 27: } 28: } 29: } Code:角色 1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace IGameLi 7: {
8: /// <summary> 9: /// 角色 10: /// </summary> 11: internal sealed class Role 12: {
13: private Random _random = new Random(); 14: 15: /// <summary> 16: /// 表示角色目前所持武器的字符串 17: /// </summary> 18: public String WeaponTag { get; set; }
19: 20: /// <summary> 21: /// 攻击怪物 22: /// </summary> 23: /// <param name="monster">被攻击的怪物</param> 24: public void Attack(Monster monster) 25: {
26: if (monster.HP <= 0) 27: {
28: Console.WriteLine("此怪物已死");
29: return; 30: } 31: 32: if ("WoodSword" == this.WeaponTag)
33: {
34: monster.HP -= 20; 35: if (monster.HP <= 0) 36: {
37: Console.WriteLine("攻击成功!怪物" + monster.Name + "已死亡");
38: } 39: else 40: {
41: Console.WriteLine("攻击成功!怪物" + monster.Name + "损失20HP");
42: } 43: } 44: else if ("IronSword" == this.WeaponTag)
45: {
46: monster.HP -= 50; 47: if (monster.HP <= 0) 48: {
49: Console.WriteLine("攻击成功!怪物" + monster.Name + "已死亡");
50: } 51: else 52: {
53: Console.WriteLine("攻击成功!怪物" + monster.Name + "损失50HP");
54: } 55: } 56: else if ("MagicSword" == this.WeaponTag)
57: {
58: Int32 loss = (_random.NextDouble() < 0.5) ? 100 : 200; 59: monster.HP -= loss; 60: if (200 == loss) 61: {
62: Console.WriteLine("出现暴击!!!");
63: } 64: 65: if (monster.HP <= 0) 66: {
67: Console.WriteLine("攻击成功!怪物" + monster.Name + "已死亡");
68: } 69: else 70: {
71: Console.WriteLine("攻击成功!怪物" + monster.Name + "损失" + loss + "HP");
72: } 73: } 74: else 75: {
76: Console.WriteLine("角色手里没有武器,无法攻击!");
77: } 78: } 79: } 80: } Code:测试代码 1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace IGameLi 7: {
8: class Program 9: {
10: static void Main(string[] args) 11: {
12: //生成怪物 13: Monster monster1 = new Monster("小怪A",50);
14: Monster monster2 = new Monster("小怪B",50);
15: Monster monster3 = new Monster("关主",200);
16: Monster monster4 = new Monster("最终Boss",1000);
17: 18: //生成角色 19: Role role = new Role(); 20: 21: //木剑攻击 22: role.WeaponTag = "WoodSword"; 23: role.Attack(monster1); 24: 25: //铁剑攻击 26: role.WeaponTag = "IronSword"; 27: role.Attack(monster2); 28: role.Attack(monster3); 29: 30: //魔剑攻击 31: role.WeaponTag = "MagicSword"; 32: role.Attack(monster3); 33: role.Attack(monster4); 34: role.Attack(monster4); 35: role.Attack(monster4); 36: role.Attack(monster4); 37: role.Attack(monster4); 38: 39: Console.ReadLine(); 40: } 41: } 42: } 程序运行结果如下: 图1.2 小李程序的运行结果 1.3 架构师的建议 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
