《游戏系统设计十二》灵活且简单的条件检查系统

目录

1、序言

2、需求

3、实现

3.1 思路

3.2 代码实现

4、总结


1、序言

每个游戏都有一些检查性的任务,在做一些判断的时候,判断等级是不是满足需求。

比如如下场景:在进入副本的时候需要检查玩家等级是否满足,满足之后才可以开启关卡,否则则需要你提升等级。

怎么设计一个灵活的条件系统,方便策划进行配置?

在之前的工作中很熟悉,一段时间没有做,有点忘记了,今天记录分享一下。

2、需求

实现条件的动态配置

实现且的逻辑

可以支持多种判断条件

3、实现

3.1 思路

实现逻辑很简单

通过前缀决定条件类型

通过多个条件一组实现逻辑且

通过多个配置实现逻辑或

配置举例:

LV_1_100 表示 等级 大于等于1 小于100,没有第三个参数的时候可以表示1级以上

C_1 表示结婚判断,1 表示需要结婚

逻辑且:

LV_1_100;C_1 表示 上述两个条件逻辑且

总之:前缀表达了条件,策划在配置的时候选择对的类型就可以了。

如果不够可以继续扩展

3.2 代码实现

定义接口

public interface ICondition {boolean check(int roleId, String[] conditionArr);
}

定义实现

//  A_1_100
public class AgeCondition implements ICondition{@Overridepublic boolean check(int roleId, String[] conditionArr) {int ageMin = Integer.parseInt(conditionArr[1]);int ageMax = Integer.MAX_VALUE;if (conditionArr.length == 3) {ageMax = Integer.parseInt(conditionArr[2]);}// 获取玩家等级int age = getUserAge(roleId);return age >= ageMin && age <= ageMax;}
}

定义表,方便查询

public class ConditionMgr {static Map<String, ICondition> conditionMap = new HashMap<>() {{put("A", new AgeCondition());}};public static boolean checkCondition(int roleId, String conditionStr) {String[] split = conditionStr.split(";");for (String s : split) {String[] conditionArr = s.split(":");ICondition condition1 = conditionMap.get(conditionArr[0]);if (condition1 == null) {continue;}boolean result = condition1.check(roleId, conditionArr);if (!result) {return false;}}return true;}}

注:这里只是做了一个示意,conditionMap可以自己设计,总之能查到实现就行,甚至你写if else 或者Switch都行。

在配置的时候策划只要查询前缀和格式就可以配置了

4、总结

设计还是挺简单的,

通过一个固定的前缀查表获得不同的条件检查,

逻辑且通过过个条件进行组合

逻辑或通过多个配置,当然也可以同一个一个前缀解决

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

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

相关文章

【npm淘宝源最新解决方案】 https://registry.npm.taobao.org此地址已失效

【npm淘宝源最新解决方案】 https://registry.npm.taobao.org此地址已失效 最新淘宝源&#xff1a; npm config set registry https://registry.npmmirror.com

YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 / RTDETR -gui界面-交互式图形化界面

往期热门博客项目回顾&#xff1a;点击前往 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上…

js-pytorch:开启前端+AI新世界

嗨&#xff0c; 大家好&#xff0c; 我是 徐小夕。最近在 github 上发现一款非常有意思的框架—— js-pytorch。它可以让前端轻松使用 javascript 来运行深度学习框架。作为一名资深前端技术玩家&#xff0c; 今天就和大家分享一下这款框架。 往期精彩 Nocode/Doc&#xff0c;可…

JWT和Redis比较选型

一、Session 二、JWT 三、比较 基于JWT&#xff08;JSON Web Token&#xff09;和Session身份验证之间的争论是现代 Web 开发中的一个要点。 JWT 身份验证&#xff1a;无状态。服务器生成一个令牌&#xff0c;客户端存储该令牌并随每个请求一起提供&#xff0c;服务端仅需按照…

LeetCode in Python 200. Number of islands (岛屿数量)

岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决&#xff0c;本文给出两种方法的代码实现。 示例&#xff1a; 图1 岛屿数量输入输出示意图 方法一&#xff1a;广度优先搜索(bfs) 代码&#xff1a; class Solution:def numIslands(self, grid):if not grid:return 0…

IO综述·

阻塞模式 读写数据会发生阻塞现象。当用户线程发起IO请求之后&#xff0c;内核会查看数据检查就绪。如果没有就绪就会等待数据就绪。而用户线程会处于阻塞状态&#xff0c;用户线程交出CPU。当数据就绪之后&#xff0c;内核会将数据拷贝到用户线程&#xff0c;并返回结果给用户…

使用MyBatis插入数据并返回自动生成的ID

在使用MyBatis进行数据库操作时&#xff0c;经常会遇到需要插入数据并返回自动生成的主键ID的情况。为了解决这个问题&#xff0c;我们可以使用MyBatis提供的useGeneratedKeys和keyProperty属性。本文将介绍这两个属性的作用以及如何使用它们来实现插入数据并返回自动生成的ID。…

KMP算法(Python)

进阶的做法就是KMP算法&#xff0c;当然暴力也能ac。 KMP主要用一个nex列表&#xff0c;nex[i]存储&#xff08;模式串needle中&#xff09;从第0个到i个字符串s中的一个相等前后缀的最大长度。比如说对于aabaa来说&#xff0c;最大长度应该是&#xff08;前缀aa&#xff09;和…

Android12中JAVA项目中proto文件的编译方式

一. 起因 最近的工作有涉及到将原来Android9平台下的java工程防到Android12中编译&#xff0c;结果发现在Android9中可以编译的工程&#xff0c;没有修改Android.bp&#xff0c;在Android12中编译失败了&#xff0c;原因是java文件中以来项目中的proto文件生成的java类&#xf…

Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能

一. 简介 前面文章实现了 SPI设备驱动框架&#xff0c;并在此基础上添加了字符设备驱动框架&#xff0c;实现了读 / 写SPI设备中数据的函数&#xff0c;文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;向SPI驱动框架中加入字符设备驱动框架代码-CSDN博客 Linux下…

算法打卡day51|单调栈篇02| Leetcode 503.下一个更大元素II、42. 接雨水

算法题 Leetcode 503.下一个更大元素II 题目链接:503.下一个更大元素II 大佬视频讲解&#xff1a;503.下一个更大元素II视频讲解 个人思路 这道题和之前496.下一个更大元素 I 差不多&#xff0c;只是这道题需要循环数组&#xff0c;那就在遍历的过程中模拟走两遍nums就行&a…

mac修改/etc/profile导致终端所有命令不可使用

原因&#xff1a;配置docker环境的时候修改了/etc/profile&#xff0c;没想到导致悲惨事情&#xff0c;输入什么命令都是 Command not found 可恶&#xff01;&#xff01;&#xff01;试了好久&#xff0c;最终这样搞定&#xff01; 1-终端输入命令 因为sudo命令也不能直接…

本地主机搭建服务器后如何让外网访问?快解析内网端口映射

本地主机搭建应用、部署服务器后&#xff0c;在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的&#xff0c;但在外网电脑和设备如何访问呢&#xff1f;由于内网环境下&#xff0c;无法提供公网IP使用&#xff0c;外网访问内网就需要一个内外网转换的介质。这里介绍…

使用Python实现时间序列预测模型

时间序列预测是一种重要的数据分析技术&#xff0c;它可以帮助我们预测未来的趋势和模式。在本文中&#xff0c;我们将介绍时间序列预测的基本原理和常见的预测模型&#xff0c;并使用Python来实现这些模型。 什么是时间序列预测&#xff1f; 时间序列预测是根据过去的观测数…

在PostgreSQL中如何创建和使用自定义函数,包括内置语言(如PL/pgSQL)和外部语言(如Python、C等)?

文章目录 一、使用内置语言 PL/pgSQL 创建自定义函数示例代码使用方法 二、使用外部语言 Python 创建自定义函数安装 PL/Python 扩展示例代码使用方法 三、使用外部语言 C 创建自定义函数编写 C 代码编译为共享库在 PostgreSQL 中注册函数注意事项 总结 PostgreSQL 是一个强大的…

前端数据类型大全及其区别总结

前端数据类型大全及其区别总结 基本数据类型引用数据类型Null 与 Undefined 的区别Map 与 Object 的区别Set 与 Array 的区别WeekMap 与 Map 的区别WeekSet 与 Set 的区别 基本数据类型 Number&#xff08;数值类型&#xff09;&#xff0c;用于表示数字&#xff0c;包括整数和…

CSS基础:table的4个标签的样式详解(6000字长文!附案例)

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

记一次中间件宕机以后持续请求导致应用OOM的排查思路(server.max-http-header-size属性配置不当的严重后果)

一、背景 最近有一次在系统并发比较高的时候&#xff0c;数据库突然发生了故障&#xff0c;导致大量请求失败&#xff0c;在数据库宕机不久&#xff0c;通过应用日志可以看到系统发生了OOM。 二、排查 初次看到这个现象的时候&#xff0c;我还是有点懵逼的&#xff0c;数据库…

项目二:学会使用python爬虫请求库(小白入门级)

上一章已经了解python爬虫的基本知识&#xff0c;这一次让我们一起来学会如何使用python请求库爬取目标网站的信息。当然这次爬虫之旅相信我能给你带来不一样的体验。 目录 一、安装requests 库 简介 安装 步骤 1.requests的基本使用3步骤 2.查看所使用编码 3.设置编码…

Redis中BitMap在钉钉机器人中的应用

性能分析 数据库中有1000w用户&#xff0c;每个用户签到一次&#xff0c;对应两个字段 连续签到多少次 、签到时间。 签到时间字段占用10个字节&#xff0c;连续签到多少天 占用5个字节&#xff08;假设一个用户能活100年&#xff0c;每天都签到&#xff0c;一个用户最多签到3…