任务系统的程序设计

news2024/11/19 10:34:29

任务是程序应用中常见的系统,它有助于用户代入角色,也有助于研发、运营和用户的互动,通常完成任务之后会给予用户一定的奖励。

1,基本数据结构

早期的任务系统设计的都很简单,大部分都是线性结构,偶尔会有环任务,我们只需要很少的数据格式遍可以存储当前任务进度,比如如下类:

  public class TaskDate
    {
        public int max;//最大进度
        public int current;//完成进度
    }

然后我们需要一个字典去存储该任务对象,既如下数据结构:

  public Dictionary<int, TaskDate> currentTaskDic = new Dictionary<int, TaskDate>();//当前显示任务
    public Dictionary<int, TaskDate> CurrentTaskDic { get => currentTaskDic; }

到此为止,我们已经完成了最基本的数据结构,同时可以处理基本的任务单元。比如:击杀指定怪物50只。

当然这都是些最基本的数据结构,对于任务的处理,我们还需要与策划确定类型与结构。某些场景中,还要存储已完成任务,以判断用户是否重复领取等。这些工作我们都可以放到之后处理。

2,基本函数

一般的任务处理,都类似于打点机制。我们拿从《永劫无间》中截图的任务举例:

以上任务实际上可以拆分为两个类型:1,在装备XX的时候使用XX武器造成击杀;2,使用XX武器造成XX点伤害。

对于第一种,则需要在造成击杀的时候,判断是否符合“装备XX”、“使用XX武器”两个条件。如果满足的话则向管理器传递完成信息。

对于第二种,需要在造成伤害的时候,判断“是否使用武器XX”,符合的话向管理器传递信息。

这一段的意思是,我们先将相同触发条件的任务抽象为一个类型,然后统一处理该类型的任务。即先将数据抽象为行为,再用某种算法去处理该行为。

于是,我们的TaskProp(任务管理器)中就需要类似这样一个总得处理函数,它负责处理种种复杂的任务进度,并负责判断处理结构:

 /// <summary>
    /// 任务类型
    /// </summary>
    enum TaskType
    {
        type2,//2,X1个X2设施达到Y级(其中X2任意X1数量即可满足)
        type3,//3,X建筑下的设施总等级达到Y级
    }

    /// <summary>
    /// 任务进度判断
    /// </summary>
    public void TaskJudgment(int _id,int _num)
    {
        //获取任务类型,通过方法计算
    }

比如ID为15的任务为“击杀100只蜘蛛”:那么每击杀一只蜘蛛的时候,我们就调用一次TaskJudgment(15,1)。在该函数体类,则会找到currentTaskDic[15].current并进行加值处理。当符合条件的时候,则进行该任务完成的判断。

最后我们需要一个完成时候领取的判断,则可以获得以上任务的奖励:

  /// <summary>
    /// 任务完成回调
    /// </summary>
    public void TaskComplateCallBack()
    { 
        //任务完成之后刷新界面
    }

至此,我们完成了一个任务完整的生命周期,即生成任务=>推进任务=>领取奖励。

3,任务红点等附属结构

当我们完成任务,或者运营推出新任务的时候,通常会使用红点来提醒玩家。虽然现在红点系统已经被滥用到一个有些令人生厌的地步,但某些场合它又是必要的。

红点一般使用树状图结构的数据来处理,即子节点有红点的时候,父节点的红点也会被点亮。

回归到基本的任务单元,我们只要判断是否符合红点条件即可。比如完成某项任务需要领取的时候出现红点,则基本代码如下:

bool _isHint = _taskD.current >= _taskD.max;

然后基于这个判断,我们可以处理UI上相应的红点系统。

4,扩展延伸

以上都是针对最基本的任务单元处理,现在游戏中的任务已经设计的比较复杂,我们需要针对具体的任务结构具体分析。比如环任务、日常任务、周任务、赛季任务、主线任务、支线任务等等,它们有这诸如时间、前置等等限制。

但万变不离其宗,我们只要搞懂基本的数据类型和数据结构,便可以处理这些看似复杂的任务系统。

另外任务系统不单单应用于游戏,硬件单元处理、操作软件这些都包含任务系统的范畴。大到国际运行,小到日常活动,任务系统与我们每个人都息息相关。

5,总结

写任务系统代码的时候,先认真分析任务的结构,然后根据表格抽象出我们需要的数据结构。最后层层处理,以保证系统的正常运行。

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

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

相关文章

负载均衡-

常见的负载均衡系统包括 3 种&#xff1a;DNS 负载均衡、硬件负载均衡和软件负载均衡。 DNS 负载均衡 DNS 是最简单也是最常见的负载均衡方式&#xff0c;一般用来实现地理级别的均衡。例如&#xff0c;北方的用户访问北京的机房&#xff0c;南方的用户访问深圳的机房。DNS 负…

【FreeRTOS】详细讲解FreeRTOS中事件(event)并通过具体示例讲述其用法

文章目录事件函数解析示例事件 事件&#xff0c;实际上是一种任务间通信的机制&#xff0c;主要用于实现多任务间的同步&#xff0c;其只能是事件类型的通信&#xff0c;无数据传输。与信号量不同的是&#xff0c;它可以实现一对多&#xff0c;多对多的同步。即可以是任意一个事…

为什么data属性是一个函数而不是一个对象?

一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象&#xff0c;也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"foo"},// 函数格式data(){return {foo:"foo"}} }) 组件中定义data属性&#x…

MACD二次金叉选股公式,零轴上下、一次三次金叉举一反三

本文介绍了MACD二次金叉选股公式编写思路&#xff0c;以MACD零轴之下二次金叉为例&#xff0c;编写选股公式&#xff0c;进行信号过滤&#xff0c;并把选股公式改编为技术指标。此外举一反三&#xff0c;介绍了三次金叉以及MACD零轴上二次金叉。 一、MACD二次金叉选股公式编写 …

ECharts线性渐变色示例演示

第003个点击查看专栏目录Echarts的渐变色采用了echarts.graphic.LinearGradient的方法&#xff0c;可以根据代码中的内容来看如何使用。线性渐变&#xff0c;多用于折线柱形图&#xff0c;前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1&#xff0c;相当于在图形包围盒中的百分…

计算机图形学 第10章 真实感图形

目录 学习目标 前情提要 # RGB颜色模型 HSV颜色模型 CMYK颜色模型/印刷颜色模型 简单光照模型&#xff08;考&#xff09;⭐⭐⭐ 简单光照模型假定&#xff1a; 材质属性 环境光模型 漫反射光模型 镜面反射光模型 Phong反射模型: 光强衰减 增加颜色 光滑着色 直线段的…

CentOS 7.9安装zabbix6.0LTS版本

环境说明 这里使用为 CentOS 7.9版本进行测试验证&#xff0c;zabbix Server 采用源码包部署&#xff0c;数据库采用 MySQL8.0版本&#xff0c;zabbix-web使用 &#xff0c;nginxphp来实现。 具体信息如下&#xff1a; 软件名版本zabbix-server6.0.12LTSzabbix-agent6.0.12LT…

MySQL数据库的常见考点

文章目录1、ACID事务原理事务持久性事务原子性MVCC基本概念MVCC基本原理undo logundo log版本链readviewMVCC实现原理RC读已提交RR可重复读MVCC实现原理总结2、并发事务引发的问题3、事务隔离级别4、索引4.1、索引概述4.2、索引优缺点4.3、索引结构二叉树B-Tree树BTree树BTree优…

测试组合生成器-allpairspy

1、前言 在我们写功能用例时&#xff0c;常常会遇到多个参数有很多的选项&#xff0c;而如果想把这些参数值都要覆盖执行的话&#xff0c;工作量可想而知。那有没有什么办法既可以减少用例数量&#xff0c;也可以保证用例质量又降低测试时间成本&#xff0c;本篇将介绍一款工具…

关于机房精密空调监控系统,你想了解的都在这里!

机房精密空调是针对现代电子设备机房规划的专用空调&#xff0c;它的作业精度和可靠性都要比一般空调高得多。在计算机机房中的设备是由很多的微电子、精细 机械设备等组成&#xff0c;而这些设备运用了很多的易受温度、湿度影响的电子元器件、机械构件及资料&#xff0c;所以精…

Unreal学习笔记2-绘制简单三角形

文章目录1. 概述2. 详论2.1. 代码实现2.2. 解析&#xff1a;Component2.3. 解析&#xff1a;材质2.4. 解析&#xff1a;包围盒2.5. 解析&#xff1a;Section3. 其他4. 参考1. 概述 之所以写这个绘制简单三角形的实例其实是想知道如何在Unreal中通过代码绘制自定义Mesh&#xf…

网页开发:MySQL和Python案例

目录 一、MySQL的概念和引入 二、MySQL指令 1、数据库管理&#xff08;文件夹&#xff09; 2、数据表的管理&#xff08;文件&#xff09; 3、数据行操作 三、常用的数据类型 四、员工管理案例 1、使用MySQL内置工具&#xff08;命令&#xff09; 2、Python代码实现 ①…

Linux学习之常用基本命令【2】

文章目录一 文件内容查看1.1 catcatcat 由第一行开始显示1.2 tactactac 由最后一行开始显示1.3 nlnlnl 显示行号1.4 moremoremore 翻页1.5 lesslessless 翻页1.6 headheadhead 显示前几行1.7 tailtailtail 显示后几行1.8 拓展&#xff1a;LinuxLinuxLinux 链接概念二 VimVimVim…

Ubuntu18.04.6 配置固定ip、ssh登录、root账号

上文讲解了如何下载安装ubuntu&#xff0c;https://blog.csdn.net/weixin_47491957/article/details/128839639 ubuntu在安装完成后&#xff0c;是不能进行ssh登录、且没有root账号&#xff0c;本文带来如何配置ssh登录及root账号 在做这些设置之前&#xff0c;我们要确定ip固…

【手写 Promise 源码】第十三篇 - Promise.allsettled 和 Promise.any 的实现

一&#xff0c;前言 上一篇&#xff0c;主要实现了 Promise 静态 API&#xff08;类方法&#xff09;&#xff1a;Promise.race&#xff0c;主要涉及以下几个点&#xff1a; 测试原生 Promise.race 的使用&#xff1b;Promise.race 的功能与特性分析&#xff1b;Promise.race…

10、声明和创建字符串

目录 一、声明字符串 二、创建字符串 &#xff08;1&#xff09;String(char a[]) &#xff08;2&#xff09;String(char a[], int offset, int length) &#xff08;3&#xff09;String(char[] value) 一、声明字符串 在Java语言中字符串必须包含在一对双引号&#xf…

记录每日LeetCode 2325.解密消息 Java实现

题目描述&#xff1a; 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐&#xff0c;形成对照表。…

【Flink】详解StreamGraph

概述 没有看上一期的小伙伴请先看上一期【Flink】浅谈Flink架构和调度&#xff0c;上一期的一个核心内容就是 Flink 中的执行图可以分成四层&#xff1a;StreamGraph → JobGraph → ExecutionGraph → 物理执行图。 今天我们好好谈论一下StreamGraph&#xff0c;StreamGraph…

WPF MaterialDesignIn 收银系统(2)主界面

前言 接上一篇&#xff0c;既然登陆页面搞定了&#xff0c;接下来就是登陆成功后跳转的主界面了。 界面 思考 到了这一步&#xff0c;我们就要开始思考&#xff0c;怎么来丰富我们的应用&#xff0c;最少需要哪些东西、功能、模块、数据等等&#xff0c;才能支撑起一个收银系统…

java分支语句

流程控制1.1流程控制语句概述1.2流程控制语句分类顺序结构顺序结构是程序中最简单最基本的结构。分支结构(if,switch)循环结构(for,while,do...while)if语句2.1if语句格式1//格式 if(关系表达式){ 语句体&#xff1b; }执行流程&#xff1a;首先计算关系表达式的值如果关系表达…