`

从魔兽世界看状态模式

阅读更多
     有学过物理课的同学都知道物理课本里面有固态,液态,气态,用来描述物体的形态。但在面向对象的软件世界中,状态可以用来描述各种各样的对象。比如你想在淘宝买一个商品,此时商品肯定是在售状态,如果这个商品已经售完;如果这个商品已经被买家购买一空,那么商品变成了售空状态;如果中途这个商品被发现质量有问题,于是变成了下架状态。当然真正的商品状态肯定不止这些,这里只是举了些例。
     网络上有把状态模式说成是策略模式的孪生兄弟。从实现角度来讲他们确实非常类似。但它们的应用场景却略有不同。
     我想接着上一节策略模式的例子,继续用魔兽世界这款游戏来讲解状态模式和策略模式的区别。
     组队模式已经在策略模式篇中有详细介绍。
     游戏设计者很聪明的选择了队长选定难度的方式来决定进入哪个地下城。把选择权交给玩家是典型的策略模式的应用场景。
     让我们来给设计者们增加一些难度。假设说游戏里并没有队长选定难度的方法,而是根据玩家队伍里的人数来决定进入哪个地下城。游戏设计者们该如何设计这种方式呢?下面的图说明了这种方式的不同。可以明显地看到这两种方式的区别,此种方式选择权已经不在队长手上。



    那么,如果说还需要增加难度,则会如下图所示。


 
 
    如果把人数的变化看成队伍状态的一种变化,合格的设计者会提前定义出针对每种状态的算法
    比如: 队伍人数10人或以下             状态一
               队伍人数10人以上至25人     状态二
               队伍人数25人以上至40人     状态三
     
    针对每种状态的算法,如下图所示。


 
这样做的好处是如果以后要加入60人(状态四)或者80人(状态五)的地下城,程序的结构会非常清晰。
上面的结构其实就是状态模式的典型应用,当然到这里还没有结束。可以从上图看到状态模式和策略模式在实现上何其类似。
 

 我想用伪代码的形式来说明状态模式的应用,分为不使用模式和使用模式:

     1、应用状态模式之前,看到的应该是这样的逻辑:

 

     //如果队伍人数在10人或以下 

     //初始化10人地下城

     //如果队伍人数在10人以上至25人 

     //初始化25人地下城

     .....

 

     2、应用状态模式之后,看到的应该是这样的逻辑:

     //根据玩家人数初始化对应的地下城(统一入口)

   

 

    不使用模式的做法在算法不是非常多的情况下非常适合。套用程序员的白话讲就是把代码逻辑写死。

    但第二种更灵活,并且很方便扩展。因为人数是动态的,状态模式带来的好处是明显的,就是在程序运行时动态地替换算法。而不用把代码写死。

 

     以上的表述和策略模式基本相同,从一个侧面也证明了状态模式和策略模式的相似之处。

 

     关于如何用代码实现状态模式,网上有很多文章,使了用各种语言,不管是C++,C#,Java还是动态语言来说明和讲解。都讲的很多,这里就不再重复。

   

  总结一下状态模式的使用,大体实现都是两步:

  第一步:针对每种状态抽象各自的算法。使各算法可以互不影响。

  第二步:提供统一入口。用于根据指定状态来替换算法。

 

  最后来总结一下状态模式和策略模式的区别:

  1、策略模式把选择权交给了玩家,而状态模式则封闭选择权。

  2、策略模式是根据不同的选择选取对应的算法,而状态模式是根据状态的变化来选取对应的算法。

 

  确实,可以把状态模式看成是一种自我封闭的策略模式

 

  
版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 大小: 19.1 KB
  • 大小: 34 KB
  • 大小: 10.5 KB
分享到:
评论

相关推荐

    国服魔兽世界精灵最新插件

    5. **插件更新维护**:保持插件的最新状态对于享受《魔兽世界》至关重要,因为游戏的每次更新都可能影响到插件的兼容性。这款"国服魔兽世界精灵最新插件"提供了最新的代码,确保与游戏的同步,避免因插件过时导致的...

    魔兽世界快捷键大全.pdf

    魔兽世界快捷键大全 魔兽世界是一款非常受欢迎的网游,游戏中有很多的快捷键和宏,可以提高玩家的游戏体验。下面是魔兽世界中的快捷键大全,这些快捷键可以帮助玩家更好地游戏。 移动和基本操作 * W:向前移动 * ...

    Hurricane:用C#编写的《魔兽世界》游戏服务器

    【飓风:C# 编写的《魔兽世界》游戏服务器】 在编程领域,尤其是游戏开发中,使用 C# 语言创建高效、稳定的服务器已经成为一种常见趋势。本项目名为“飓风”,是一个用 C# 实现的《魔兽世界》游戏服务器,它展示了 ...

    SimpleCombatLogger:一个简单的魔兽世界战斗记录器插件

    《SimpleCombatLogger:深入解析魔兽世界战斗记录器插件》 在魔兽世界这款大型多人在线角色扮演游戏中,玩家在战斗中的每一个动作、技能释放、伤害输出、治疗量以及受到的伤害都被详细记录下来。为了更好地分析战斗...

    AllTheThings:ALL THINGS-魔兽世界中追踪收藏和帐户完成的插件

    《AllTheThings:魔兽世界中的收藏与成就追踪插件详解》 在大型多人在线角色扮演游戏《魔兽世界》中,玩家经常会面临各种挑战,包括收集稀有物品、完成任务线、达成成就等。为了帮助玩家更好地追踪这些进度,众多...

    wow:Golang的《魔兽世界》社区API客户端

    魔兽世界Golang社区API客户端提供Golang结构和API客户端,以使用WoW社区API数据请参阅以获取可用数据的概述,然后查看以获取用于检索所述数据的功能。支持的所有API: 成就拍卖战斗宠物挑战模式角色简介物品公会简介...

    魔兽世界中获取行会信息的php应用程序WoW Roster Live US-开源

    WoW Roster Live US的核心功能是抓取并更新魔兽世界行会的会员信息,包括角色名、等级、职业、在线状态等。通过PHP语言实现,它利用暴雪提供的API接口,确保数据的实时性和准确性。开源特性使得任何人都可以查看、...

    world edit 魔兽编辑器使用说明

    《World Edit 魔兽编辑器使用说明》 在魔兽争霸III:冰封王座的世界里,游戏的无限可能性很大程度上归功于其强大...通过熟悉其基本操作和触发器函数,初学者可以逐步掌握地图编辑的技巧,踏上探索魔兽世界的创新之路。

    wow自动施法按键助手NextActions.zip

    非MaxDPS和非战斗状态时, 自动切换到猎豹守护提高奔跑速度非战斗状态时,自动治疗宠物兽王猎人配置5分钟测试数据: 射击天赋: 目前暂时还不支持6.0.2生存天赋: 目前暂时还不支持6.0.2武器战:不可用死亡骑士双手冰DK:...

    shmammered-text:将常规文本转换为醉酒文本。 受魔兽世界的启发

    【shmammered-text】是一个基于JavaScript的文本处理工具,它能将普通的文本转换成一种模拟“醉酒”状态的语言风格,这种风格让人联想到网络游戏《魔兽世界》中的幽默元素。在编程领域,这样的工具通常被称作文本...

    网络游戏-通过幻像模式使用数据传输建立的幻像网络.zip

    在实际的网络游戏开发中,许多著名的作品如《魔兽世界》、《英雄联盟》等都采用了类似幻像模式的技术。通过对这些成功案例的研究,我们可以学习到如何在不同类型的游戏中灵活应用幻像模式,以提高网络效率和用户...

    TrinityCore核心的SmartAI编辑器

    TrinityCore是一个开源的、基于World of Warcraft (WoW) 的游戏服务器软件,它允许玩家在自己的服务器上运行魔兽世界。在TrinityCore的核心中,SmartAI系统是用于创建和管理游戏内非玩家角色(NPC)行为的重要组件。...

    Node.js-STORMHEARTNETWORK是一个多人Minecraft社区的java游戏服务器

    游戏的核心特色是其无限的开放世界、自由的建造系统和多样化的游戏模式,包括生存、创造和冒险等。多人游戏服务器是Minecraft社区的重要组成部分,它们为玩家提供了定制规则、挑战和社交环境。 Node.js是一个开源的...

    js 模仿魔兽争霸

    在JavaScript的世界里,模仿经典游戏"魔兽争霸"是一项挑战性的任务,它涉及到多个技术领域,如前端开发、游戏逻辑、用户交互以及动画效果等。在这个项目中,我们将深入探讨如何利用JavaScript来实现这一目标。 首先...

    WowUSBProtector-0.72-zh

    3. 防护模式:软件提供了多种防护模式,用户可以根据自己的需求选择最合适的保护级别,有效防止未知威胁。 4. 自动更新:WowUSBProtector会定期自动更新病毒库,确保对最新病毒有防御能力,保持防护效能的最新状态...

    .netframework游戏编程入门——模拟魔兽学院永远的羁绊

    其中,.NET Framework的类库包含了大量的预先编写好的代码,可以帮助开发者快速实现功能,减少从零开始编写的代码量。 VB.NET(Visual Basic .NET)是.NET Framework下的一个面向对象的编程语言,以其简单易学、...

    WowClassicGrindBot:WOW经典研磨机器人,魔兽世界研磨机器人-无需DLL注入或内存监视,只需截屏并单击鼠标和键盘即可

    WowClassicGrindBot是一款专为《魔兽世界》经典怀旧服设计的游戏自动化工具,它采用了一种独特的技术,使得玩家无需使用DLL注入或内存监视就能实现自动打怪、采集等任务。这款机器人通过屏幕截图识别游戏画面,再...

    数据库开发参考数据库文件IDB

    从压缩包的文件名来看,我们有两个与魔兽世界相关的文件: 1. **World of Warcraft[MAC13914执行程序].rar**:这可能包含的是魔兽世界游戏的某个特定版本的Mac版客户端程序。数据库在这里的作用可能包括存储玩家...

    简单的连连看游戏代码

    本项目是一个以魔兽世界主题图片为元素的连连看游戏,采用Microsoft Foundation Classes (MFC) 框架进行开发。MFC是微软提供的一套C++库,用于构建Windows应用程序,它封装了许多Windows API,使得开发者可以更方便...

    Beginning Lua with World of Warcraft Add-ons

    魔兽世界(World of Warcraft, 以下简称WoW)是一款风靡全球的大型多人在线角色扮演游戏(MMORPG),它允许玩家通过各种插件来扩展或修改游戏的界面和功能。插件是通过脚本语言Lua开发的,因此,对于想要为WoW开发...

Global site tag (gtag.js) - Google Analytics