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

目录

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://xiahunao.cn/news/2968979.html

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

相关文章

Nginx莫名奇妙返回了404

描述 nginx作为反向代理&#xff0c;代理python的服务&#xff0c;但是通过代理访问服务的时候&#xff0c;报了404的错误。 难受的是客户现场没有查看日志的权限&#xff0c;只有查看配置文件的权限&#xff0c;我们检测了几遍配置文件也没有找到问题&#xff0c;哎~ 问题引…

vue里面事件修饰符.stop使用案例

Vue.js 事件修饰符 .stop 用于阻止事件继续传播&#xff0c;即阻止事件冒泡。这在处理父子组件之间的事件通信时特别有用&#xff0c;可以防止事件从子组件冒泡到父组件&#xff0c;或者在一个元素上绑定多个事件处理函数时&#xff0c;阻止后续事件处理函数的执行。 下面是一个…

nodejs工具模块学习

util 是一个Node.js 核心模块&#xff0c;提供常用函数的集合&#xff1b; util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法&#xff0c;通常用于调试和错误输出&#xff1b; 如果只有一个参数 object&#xff0c;是要转换的对象&…

Web前端 Javascript笔记6

BOM 前面的笔记讲的都是DOM&#xff08;文档对象模型&#xff09;&#xff0c;DOM几乎被所有浏览器支持&#xff0c;是DOM的作用为操作HTML文档的重要手段。利用DOM可以对HTML文档中的所有元素&#xff0c;节点进行获取与访问&#xff0c;对标签属性与样式进行设置。 下面是一…

Linux下SPI设备驱动实验:创建SPI节点及SPI设备子节点

一. 简介 SPI 驱动框架和 I2C 很类似&#xff0c;都分为主机控制器驱动和设备驱动。主机控制器驱动一般由半导体厂商写好&#xff0c;我们来编写SPI设备驱动代码。 前一篇文章分析了 IMX6U系列芯片的 SPI中片选信号的处理&#xff0c;文章如下&#xff1a; I.MX6ULL SPI 主机控…

学习Python先从了解Python开始

Python是一种高级编程语言&#xff0c;它的语法简洁易读&#xff0c;功能强大&#xff0c;应用领域广泛。Python不仅适用于数据科学、机器学习、Web开发等领域&#xff0c;还可以用于自动化脚本编写、游戏开发等。在本文中&#xff0c;我们将探讨Python的特点、应用领域以及未来…

噪声系数测试之增益法

提到增益法测试噪声系数,大家并不陌生,这是一种简洁的测试方法,精度不如Y因子法,但是在某些测试场合,比如只有频谱仪而没有噪声头时,且待测件具有非常高的增益时,就可以使用增益法测试噪声系数。 增益法测试噪声系数的连接示意图如图1所示,其思路为:DUT输入端端接50 …

【UE 材质】雨水流淌效果

在上一篇&#xff08;【UE 材质】雨滴效果&#xff09;基础上继续实现雨水从顶部沿着墙壁侧面向下流淌的效果 效果 步骤 1. 下载所需纹理 2. 新建一个材质函数&#xff0c;这里命名为“MF_Weather_Drips”&#xff0c;在材质函数中添加如下节点 其中输入节点的默认值分别为…

【leetcode面试经典150题】61. 反转链表 II(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

【MIT6.824】lab2C-persistence, lab2D-log compaction 实现笔记

引言 lab2C的实验要求如下 Complete the functions persist() and readPersist() in raft.go by adding code to save and restore persistent state. You will need to encode (or “serialize”) the state as an array of bytes in order to pass it to the Persister. Us…

WebLogic 数据源连接泄露

编码时&#xff0c;有时会忘记释放使用的数据源连接&#xff0c;造成连接泄露&#xff0c;没有连接资源可用。 现象 java.sql.SQLException: Cannot obtain XAConnectionat weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1691)at weblogic.jdbc.jta.…

hackthebox - Redeemer

2024.4.19 TASK 1 Which TCP port is open on the machine? 6379 TASK 2 Which service is running on the port that is open on the machine? redis TASK 3 What type of database is Redis? Choose from the following options: (i) In-memory Database, (ii) Traditiona…

logisim 图解超前进位加法器原理解释

鄙人是视频作者&#xff0c;文件在视频简介的网盘链接。 找规律图解超前进位加法器与原理解释_哔哩哔哩_bilibili 一句话就是“把能导致进位到这个位置的情况全都穷举一遍。” 穷举情况看图中算式。 视频讲解比较啰嗦。

JavaFX--基础简介(1)

一、介绍 中文官网&#xff1a;JavaFX中文官方网站OpenJFX 是一个开源项目,用于桌面、移动端和嵌入式系统的下一代客户端应用程序平台。openjfx.cn是OpenJFX(JavaFX)的标准中文翻译网站&#xff0c;致力于方便开发者阅读官方文档和教程。https://openjfx.cn/ JavaFX 是一个开…

GUI04-深入分析基于框架窗口的应用

复杂应用最常见的桌面程序&#xff0c;基本都使用框架式的主窗口。本节涉及&#xff1a; 常见的应用中&#xff0c;哪些使用了框架窗口&#xff1f;wxWidgets 项目配置详解&#xff08;为将来手工写wxWigets项目配置打基础&#xff09;&#xff1b;复习如何使用Code::Blocks的向…

javaagent使用

Java Agent是什么&#xff1f; Java Agent是Java平台提供的一个强大工具&#xff0c;它可以在运行时修改或增强Java应用程序的行为。是在JDK1.5以后引入的&#xff0c;它能够在不影响正常编译的情况下修改字节码&#xff0c;相当于是在main方法执行之前的拦截器&#xff0c;也叫…

MySQL高级(索引-性能分析-profile)

show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪去了。通过 have_profiling参数&#xff0c;能够看到当前MySQL 是否支持 profile 操作&#xff1a; select have_profiling 默认 profiling 是关闭的 select profiling; 可以通过 set 语句在 session / global 级…

unordered系列关联式容器和开散列与闭散列的模拟实现

文章目录 unordered系列关联式容器底层结构哈希的概念哈希冲突哈希函数常见哈希函数 哈希冲突的解决闭散列开散列 闭散列模拟实现基本框架基本函数 开散列模拟实现 unordered系列关联式容器 之前我们讲到&#xff0c;STL提供了底层为红黑树的一系列关联式容器&#xff0c;可以…

java项目连接sqlserver时报ssl相关错误,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

MySQL数据库-优化慢查询

1、什么是慢查询&#xff1f; 慢查询就是SQL执行时间过长&#xff0c;严重影响用户体验的SQL查询语句。当它频繁出现时数据库的性能和稳定性都会受到威胁 慢查询是数据库性能瓶颈的常见原因&#xff0c;是指SQL执行时间超过阈值&#xff1b;可能由于复杂的连接、缺少索引、不恰…