论可复用的游戏服务器端开发框架(三)

引导类系统的可复用模型

说到游戏中的“引导类系统”,最常见的就是所谓“新手引导”,这些专门设计的游戏流程,让玩家一步步的按规定顺序去操作游戏。而“任务系统”,也是最著名的引导类系统,这个最初只是基于NPC机关的小玩法,现在已经成为几乎所有游戏的标配。并且后续还出现了“每日奖励”,“日常任务”,“活动任务”,甚至“成就系统”等各种变种。这几个系统的核心逻辑,都是策划预设了一条“任务链”,让玩家通过操作,来改变自己在“任务链”上的位置。另外一种很特别的引导类系统,就是商店。最古老的游戏中都会有商店,到现在的游戏,商店系统的形态变得更加多样化,比如专门使用某种货币的兑换系统(使用人民币的商城系统)。拍卖行作为玩家的物品互动系统,实际上也是一种商店系统,只不过其价格和商品不是系统设置,而是玩家操作的而已。

虽然从产品角度来说,都是引导玩家进行某些行为,但是以上两类系统的核心逻辑是有所不同的,因此我打算分成两个部分来描述。

任务系统族:

任务系统的基础数据模型,是一个预设的任务库,存放着大量的任务链以及具体任务。而玩家则有一个任务列表,存放着已经完成的任务、接受后但未完成的任务。具体的任务最重要的是包含着任务完成条件和完成进度的数据,这些任务条件一般来说都是必须全部完成的。因此我们可以抽象出任务系统的基本数据模型:

“任务项”中的“接受条件容器”和“完成条件容器”中,都应该分别对应着两类对象,即“接受条件”和“完成条件”。“接受条件”可以有多个不同的子类型,如判断前置任务是否完成的,玩家是否符合等级,是否具备某个道具等等。而“完成条件/进度”也应该有多个子类型,如“对话操作”“杀怪操作”“物品收集操作”……游戏中一切的操作都应该可以成为完成条件,具体实现则由游戏的操作中,添加钩子处理程序,对玩家身上的完成条件的检索,然后根据游戏操作的逻辑,对这些玩家身上的“完成条件/进度”做修改。这些模型的方法应该有:

  • 任务项
    • 用ID从持久化中load出来并构造
    • 各属性的getter/setter
    • 返回此玩家是否能接受
    • 更新并返回此任务的完成状态
  • 玩家任务集
    • 根据玩家ID,从持久化设备中save/load出玩家任务集
    • 接受任务
    • 放弃任务
    • 输入一个“完成条件”的类型,返回所有符合此类型的“完成条件和进度”对象
  • 接受条件
    • 输入玩家对象,返回是否满足此条条件
  • 完成条件和进度
    • 返回已完成进度
    • 返回总进度
    • 修改已完成进度

由于任务系统的变种种类繁多,所以可能会导致设计大量的“接受条件”和“完成条件进度”类型,所以这些对象的部分属性如“描述文字”等静态内容,应该采用共享数据的形式出现,而不应该反复拷贝。下图初步描述了任务系统族类型的关系:

商店系统族:

商店系统的数据核心模型,是一系列可供展示、销售的商品,用于购买商品的货币,以及为这些商品提供展示之地的商店模型。当然这里的商品可能不一定对应于RPG系统里面的物品道具,因为有些商品是权限、等级等不能放入背包里的东西,也有可能是某种属性、状态等等。但是我们还是推荐用RPG系统中的道具来承载,这样编程的复杂度会比较低。

商店系统看起来非常简单,但是最复杂的地方在于“购买”环节,因为购买得到的商品,不一定是放入背包的货品,所以商品的“被购买”应该是一个可扩展的虚方法函数。这样商品也可以扩展为背包货品类商品和其他商品类。需要注意的是,买入玩家销售的物品,这个功能并不是非常容易重用,这涉及到如何对玩家物品的估价的问题,因此这个能力应该从最基本的“商店”系统扩展,而不应该加入商店系统中。商品系统的对象方法应该有:

  • 商品
    • 属性的getter/setter
    • 以id从持久化设备中构造
    • 被购买行为(虚方法)
  • 商店
    • 列出商品,可能带分页接口
    • 卖出商品

商店系统的表现形式非常多样,但是核心逻辑关系却异常简单:

至此,已经描述完主要的引导类系统的设计。这些设计本身可能并不能完成非常复杂的游戏逻辑,但是其基础逻辑却足够简洁。这样基于其开发的上层代码,就具备了一个比较统一的实现结果,便于构造出更多能重用或修改使用的系统。

明天接着讲:

战斗系统的模型构建思考

感谢大家的阅读,如觉得此文对你有那么一丁点的作用,麻烦动动手指转发或分享至朋友圈。如有不同意见,欢迎后台留言探讨。

原文发布于微信公众号 - 韩大(handa1740168)

原文发表时间:2016-01-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

对5种主流编程语言的吐槽

不可否认,想要成为一名优秀的程序员确实是需要掌握多种编程语言。通过这几年的自虐式学习,小编也慢慢的掌握了这些编程语言。接下来要为大家,介绍五款让人又爱又恨的编程...

1867
来自专栏老九学堂

与程序打交道的九年里,我的爱恨情仇...

一次做规划局的项目,规划局的职员很是钦佩地说:“你们真了不起,在电脑上敲敲键盘就能做出软件来。”

660
来自专栏大数据文摘

王昊奋:大规模知识图谱技术

3075
来自专栏顶级程序员

虽然全世界都在误解程序员,但我还是希望你能了解我…

对于相关的计算机和代码知识,通常说来程序员比一般人要了解得多,下面我将为大家揭晓一些业内人士不会诉诸于口的真相。

753
来自专栏玄魂工作室

Python黑帽编程 2.0 第二章概述

于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一...

3377
来自专栏Sign

月千之夜

这个是2012年做的一个游戏。 ======== 主角的控制方式: 右键移动, 按Q键角色会朝鼠标方向冲刺,冲刺位移距离大,但是冲刺过程不是无敌的,且伤害一般...

26311
来自专栏服务端技术杂谈

我用 Rust 重写了博客,谈谈我眼中的 Rust.

我已经学习 Rust 有挺长的一段时间了,一直想用 Rust 来写点东西,但是缺乏好的想法; 有些想法自我感觉良好,但是又没有能力实现 (比如,写一个操作系统?...

1072
来自专栏web前端教室

对于零基础同学来讲,javascript有多难掌握?

你是零基础,那么你用什么方式,可以快速的实现js的运用自如呢? Javascript是一门脚本语言,它没有复杂的内存管理,只有一个进程,变量随便什么都可以储存...

1629

不应面向对象地针对业务行为建立模型!

在过去的几年中,我看到许多项目将几乎任何类型的业务需求都喜欢建立与需求原因无关的技术对象模型(后面可能简称对象模型)。在很多情况下,针对技术对象建立业务需求模型...

1252
来自专栏逸鹏说道

程序员的核心竞争力是什么?为什么?

姚冬回答的非常好,我狗尾续貂的说几句。 我们都知道学习能力很重要,那么学习能力从何而来,除了去看书上课这种,如何在实践工作中学习成长? 我之前微博说了一个笼统...

2766

扫描关注云+社区