目录
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{
@Override
public 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、总结
设计还是挺简单的,
通过一个固定的前缀查表获得不同的条件检查,
逻辑且通过过个条件进行组合
逻辑或通过多个配置,当然也可以同一个一个前缀解决