大型网络游戏任务系统的架构与设计

news2024/11/18 22:34:37

在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:

任务配置表设计与管理;

游戏任务的解锁与生成;

任务完成判定;

任务完成后的奖励生成;

奖励的领取;

客户端的界面展示;

对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。

任务配置表设计与管理

任务配置表主要是给策划来编辑游戏任务的具体内容,同时程序根据策划编辑的任务配置来生成游戏的任务,获取任务描述, 获取奖励描述, 任务完成判定,游戏奖励领取。对于程序而言,要充分的调研游戏任务系统的功能需求,并设计出管理代码+策划编辑游戏任务的工作方式。我们拿一个比较通用的任务配置表的需求来进行分析,将一个任务配置设计下列字段:

  任务ID:唯一代表该任务类型的ID号;
  任务解锁的条件: 解锁该任务的条件(这里有N种完全不同的规则)
  任务的文字描述: 描述改任务的内容,主要用于客户端UI界面的显示;
  任务完成达成的条件: 完成该任务要达成的条件(这里有N种不同的规则);
  任务完成获得的奖励: 完成该任务可获的奖励(这里有N种不同的奖励规则);
  任务奖励描述: 完成任务后可获得哪些奖励的文字描述,主要用户客户端UI展示;

任务解锁条件,任务达成条件,任务奖励,不同任务都有不同的规则,那么这个如何设计呢?这里就需要充分的调查任务系统的需求,然后总结出规则,做一个规则描述表给策划,方便策划填写数据,同时方便程序按照规则解析条件表达式,例如解锁任务A,需要达到10等级。解锁任务B,需要收集10张卡, 这里解锁任务就有2种不同的规则,就需要定规则给策划填写,给程序解析,就可以生成一个这样的解锁条件表:

解锁方式ID  解锁条件描述,                          解锁参数解析模板,如
  10000      策划填写ulevel=10, 达到等级10后解锁,    type=10000, ulevel=%d
  20000      策划填写cards=10, 收集10张卡后解锁,    type=20000, ucards = %d  
  …

在策划的任务配置表里面就可以按照这个规则来填写,程序根据type类型来对应解析规则,解析解锁条件。如下:

 任务ID   任务解锁条件           任务文字描述       任务完成条件, 达成奖励
 10001    type=10000,ulevel=10    挖10个宝石,        …
 10002    type=10000,ulevel=20    挖10个水晶,        …
 10003    type=10000,uelvel=30    挖10个金币,        … 
 20001    type=20000,ucards=10   合成初级战衣        …
 20002    type=20000,ucards=20   合成中级战衣        …

任务完成条件与达成奖励条件也可以按照解锁条件类似的方式来编写和制定规则。所以这里在设计的时候一定要充分的调研任务系统的需求,程序根据type类型来解析规则的参数获得对应的条件规则。

游戏任务的解锁与生成

任务配置表的设计完成后,策划就会给游戏编辑好任务配置表,在游戏运行中要给每个玩家来解锁对应的任务并生成任务,这个时候还需要有一个玩家任务表,这个表描述了所有玩家的所有任务,这个表的设计如下:

ID: 任务的唯一ID号
uid: 这个任务对应的玩家ID号
tid: 标识玩家正在进行的任务,根据tid可在任务配置表里面找到对应的任务和描述;
status: 当前任务的状态: 
未解锁【0】
已解锁,待执行【1】
进行中【2】
已结束【3】
奖励未领取【4】
奖励已领取【5】
例如: 
ID   uid     tid   status
玩家A  10001  1
玩家B  10001  1
玩家C  20001  2
…

玩家任务表定义好后,任务系统监听与任务解锁触发相关的游戏事件,比如玩家升级了,升级的同时通过事件订阅模块抛出一个事件出来,任务系统监听到这个事件后根据事件类型,玩家的游戏数据,以及策划编辑的任务配置表看是否有新任务被触发解锁(根据解锁规则表里面配置的判定),如果有,就往任务表里面插入一条记录,这样该玩家解锁了某个任务。当玩家打开任务列表的时候,就从这个表里面检索出来属于这个玩家的所有正在进行中的任务。

任务进行中与任务完成判定

玩家解锁了任务以后,在任务表里面就有这个玩家所对应的任务记录了,状态也改成了正在进行中,当玩家触发一个游戏事件后抛出一个事件,任务系统监听对任务判定有影响的事件。当有这样的事件抛出后,就去看下是哪个玩家触发的,然后根据任务配置表中任务的完成判断条件规则进行判断,如果条件成立,修改任务的状态。

任务完成后的奖励生成

达到任务的判定条件后, 如果这个任务的类型是有奖励的,这个时候根据任务类型的描述配置表的奖励规则来生成对应的奖励。任务配置表里面有奖励的类型,以及奖励的数据,程序根据奖励规则表中奖励的类型来解析对应的奖励数据生成奖励。如果是直接给奖励,根据任务的奖励内容给玩家的数据加上对应的奖励即可,并通知前端来播放奖励动画。并标记任务已完成。如果奖励需要玩家自己去领取,可以将任务的状态改成”奖励未领取”,这样玩家拉去任务列表的时候,就可以根据这个”奖励未领取”状态来显示还有奖励可以领取,客户端显示领取按钮。

奖励的领取

奖励分为直接奖励与玩家主动领取的奖励,这个根据游戏的需求来就可以了,对于任务系统而言,如果是直接奖励,那么直接给玩家加上对应的数据属性就可以了,比如奖励金币,奖励宝石等,奖励的时候可以通知客户端,这样客户端可以播放一个奖励动画出来让玩家知道自己获得了奖励,如果奖励需要玩家主动领取,当玩家拉取任务列表的时候,可以根据任务的状态”奖励未领取”,把没有领取奖励的任务拉去下来,并展示一个”领取”按钮。当玩家点击领取的时候,服务器根据任务ID来获取任务数据,检查任务的状态是否为”奖励未领取”,如果是,再获取任务的ID号,根据任务的ID号获取具体的奖励数值,给对应的数值加上对应的奖励,并修改任务的状态未奖励已领取,并通知客户端展示动画。

客户端的界面展示

任务系统的后台逻辑设计好了以后,剩下的就是任务系统的界面展示。客户端登录以后向服务器拉取这个玩家的所有任务,一般状态包含”已解锁待执行”,”正在进行中”与”奖励未领取”的任务。拉取下来,客户端显示的时候还需要显示任务的描述和奖励描述等,所以需要把策划的任务配置表从服务端拉取下来,或者通过资源更新的方式来更新下来,这样我们就能根据任务的tid来从描述表里面获取任务描述与奖励描述,这样客户端就完整的展现出任务来了。当有”领取奖励”,”领取任务”按钮的时候,通过向服务端发送对应的请求来做对应的处理,服务端来更新任务的状态即可。

以上就从6个维度详细的描述了一个大型网络游戏的任务系统应该如何设计,关注我可以学习到更多的大型网路游戏的架构与设计相关知识分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将本地的word文档转为markdown(带图片)发布到CSDN

文章目录一、前言二、word转为markdown三、自动发布本地md文件一、前言 背景:早期很多学习笔记都是记在word上(那一年,还不知道有markdown),现在想将早期的一些资料都发布到CSDN上(本地学习资料我都懒得打…

数据中心灾备通用基础

1.灾备的定义 没有灾备会带来的问题 一旦数据中心的数据遭到破坏,随之而来的是很多棘手的问题 灾备可以提供全面数据保护 IT行业中的备份 在当今IT行业中,数据量急剧增长,并且新的法规不断出台,对备份时间、恢复时间目标&#…

Linux应用编程---4.pthread_create函数

Linux应用编程—4.pthread_create函数 ​ 之前学习了进程有关的东西,现在学习如何创建一个线程。 4.1 pthread_create()函数详情 ​ 线程创建函数是:pthread_create()。在Linux终端下,输入man pthread_create,查看函数定义以及…

Python基础(二十三):面向对象之继承介绍

文章目录 面向对象之继承介绍 一、继承的概念 二、单继承 三、多继承

IntelliJ IDEA安装教程(超详细)

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:实用工具 💬个人格言:不断的翻越一座又一…

Java学习(44)new关键字

new关键字 对象实例化 实例化对象的过程可以分为两部分: (1) 声明对象:Cat one (2) 实例化对象:new Cat()JVM可以被理解为Java程序与操作系统之间的桥梁 每次使用new关键字,就相当于在内存中开辟了一块新的存储空间。 package c…

CPU概述

CPU 概述 1. CPU 基础 CPU 的概念 CPU 是最重要的计算机组件,由控制器和运算器组成,通过总线与其它设备连接。 CPU 与南北桥 所谓的桥,都是 cpu 和其它设备连接这样的一个桥梁。分为南北桥。 什么是南桥? 南桥主要是用来连接…

【北邮果园大三上】运筹学期中后

运筹学后半段 第五章 动态规划 最优化原理,可以归结为一个递推公式 现实应用:比如最优路径、资源分配、生产计划和库存等 5.1 动态规划的最优化原理及其算法 5.1.1 求解多阶段决策过程的方法 例如:最短路径问题 求A到B的最短路径&#xff…

SpringBoot3.0集成SpringDoc2.0

SpringBoot3.0集成SpringDoc1. pom配置2. OpenApi配置类3. 使用4. SpringDoc注解与SpringFox对比5. 演示项目这里为什么要使用SpringDoc呢?是因为集成SpringFox只支持SpringBoot2.x, 而基于Swagger的SpringDoc的社区现在十分活跃,代码也在不断…

excel 设置双坐标轴柱状图

思路:通过添加辅助列来调整。 步骤1 选中数据,插入柱状图,这时候会得到原始的柱状图 选中“设计”-“更改图表类型”-“组合”,调整图表类型均为柱状图,可以得到初始双坐标轴图表…

Linux应用编程---7.有名管道

Linux应用编程—7.有名管道 7.1 mkfifo函数详情 ​ 无名管道用于具有亲缘关系的进程之间通讯,比如:父子进程、兄弟进程。有名管道用于非亲缘关系进程之间的通讯。创建有名管道使用到的库函数是:mkfifo(),这里强调是库函数的原因…

Elasticsearch连续剧之基础篇

目录一、前言二、Elasticsearch数据结构三、安装1.配置最大可创建文件数大小2.由于ES不能以root用户运行,我们需要创建一个非root用户,此处创建一个名为es的用户3.安装es4.启动es服务四、常用操作1.创建没有结构的索引2.创建有结构的索引3.删除索引4.文档…

【迅为iMX6Q】开发板 u-boot 2020.04 RTL8211E 以太网驱动适配

相关参考 【迅为iMX6Q】开发板 u-boot 2015.04 SD卡 启动 【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动 【迅为iMX6Q】开发板 u-boot 2022.04 SD卡 启动 开发环境 win10 64位 VMware Workstation Pro 16 ubuntu 22.04 【迅为imx6q】开发板, 2G DDR 目标 …

SAP Webservice 发布外网SAP端代理配置

前言 SAP Webservice接口发布外网的需求不算少见,一般是通过代理形式替换Webservice地址中的域名,但是完整的Webservice接口发布外网还需要以下步骤(如果调用方在不做这些配置的情况下可以正常调用,则无需处理。) 1. 配…

gravity 安装部署

gravity是由膜拜公司自主研发的不同数据库间数据同步工具。 官方介绍:https://github.com/moiot/gravity/blob/master/README-cn.md Gravity 是一款数据复制组件,提供全量、增量数据同步,以及向消息队列发布数据更新。 DRC 的设计目标是&a…

有电脑就可以干的工作有哪些?试试这些项目

现在几乎人人都有手机,吃饭时候看,睡觉的时候看,上个厕所也在看,有次坐地铁,发现很多上学的初中生、小学生都拿着手机,手机档次还挺高,都是最新的苹果、华为款的手机。反之再看看使用电脑的人又…

Linux——信号知识归纳(上)

一.信号概念(一).大致认识信号是操作系统控制进程的一种方式,比如ctrl C、栈溢出程序崩溃、kill -9命令等底层都是操作系统发送信号给进程执行特定操作。因此,所有信号就底层而言都是操作系统发出的。同时,进程接收到信…

Java设计模式中桥接模式是什么/桥接模式有什么用,怎么运用桥接模式

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 5.5 桥接模式 5.5.1 定义 将抽象与实现分离,使他们可以独立变化,即用组合关系来代替继承关系实现,从而降低抽象与实现两个可变…

相参雷达(CSDN_0004_20220909)

文章编号:CSDN_0004_20220909 雷达信号处理中的一个基本操作是对样本进行积累,以提高SNR。积累的方式包括相参积累和非相参积累。相参积累是对复数信号(既包括幅度又包括相位)相加积累;非相参积累是对信号的幅度&#…

【时间复杂度与空间复杂度】衡量算法的标准,这篇文章让大家更深刻的理解时间复杂度和空间复杂度

前言: 大家好,我是良辰丫,今天和大家一起讨论一下时间复杂度与空间复杂度,往往来说,这两者是衡量算法好坏的标准,举个简单的例子,你想吃核桃了,用牙能弄开,用夹子也能弄开…