
1) 【一句话结论】通过分层任务数据结构(任务节点+条件树)+配置驱动开发+状态机管理,结合任务状态追踪与奖励机制校验,实现任务逻辑正确性与高可维护性。
2) 【原理/概念讲解】老师口吻,解释核心逻辑:任务系统核心是“数据驱动+状态管理”。任务节点是基本单元,包含id、类型(主线/支线/日常)、前置条件、奖励等;条件树是任务逻辑的“流程图”,用and/or节点组合子条件(如“通关关卡A且收集道具X”是and节点,包含“通关关卡A”和“收集道具X”两个子条件);配置驱动开发是指任务逻辑通过配置文件定义(而非硬编码),比如JSON配置文件,方便修改;状态机管理任务状态(未开始/进行中/已完成/失败),确保条件触发时状态正确流转。类比:条件树像做菜时的“步骤清单”,每个步骤(子条件)必须完成才能进入下一步(父条件);配置驱动像“菜谱本”,修改菜谱(配置)就能改变菜的做法(任务逻辑),不用改厨房(代码)。
3) 【对比与适用场景】
| 任务类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 主线任务 | 游戏核心剧情流程 | 线性、高优先级、条件严格(如“通关第1关”) | 剧情推进、核心玩法解锁 | 需严格保证流程正确,避免断档 |
| 支线任务 | 剧情分支或额外挑战 | 分支逻辑、可重复、条件灵活(如“收集10个道具”) | 增加游戏深度、玩家探索 | 条件组合复杂,需优化条件树 |
| 日常任务 | 周期性循环任务 | 周期触发、条件简单(如“每日登录”)、奖励固定 | 保持玩家活跃度、循环收益 | 需考虑重做机制(如重做后奖励清零) |
4) 【示例】
任务节点结构(JSON):
{
"id": "main_1",
"type": "主线",
"name": "初入江湖",
"pre_conditions": [
{
"type": "and",
"children": [
{"type": "level_completed", "level_id": "intro_1"},
{"type": "item_collected", "item_id": "key_1"}
]
]
],
"rewards": {
"exp": 100,
"gold": 50,
"item": "sword_1"
}
}
条件树(伪代码):
class ConditionNode:
def __init__(self, type, children=None):
self.type = type # "and"/"or"/"level_completed"/"item_collected"
self.children = children or []
def evaluate(self, player_state):
if self.type == "and":
return all(child.evaluate(player_state) for child in self.children)
elif self.type == "or":
return any(child.evaluate(player_state) for child in self.children)
elif self.type == "level_completed":
return player_state.completed_levels.get(self.level_id, False)
elif self.type == "item_collected":
return player_state.collected_items.get(self.item_id, False)
return False
# 示例条件树
condition_tree = ConditionNode(
"and",
children=[
ConditionNode("level_completed", level_id="intro_1"),
ConditionNode("item_collected", item_id="key_1")
]
)
配置文件管理(JSON示例):
{
"tasks": [
{
"id": "main_1",
"type": "主线",
"name": "初入江湖",
"conditions": {
"type": "and",
"children": [
{"type": "level_completed", "level_id": "intro_1"},
{"type": "item_collected", "item_id": "key_1"}
]
},
"rewards": {
"exp": 100,
"gold": 50,
"item": "sword_1"
}
},
{
"id": "side_1",
"type": "支线",
"name": "收集道具",
"conditions": {
"type": "or",
"children": [
{"type": "item_collected", "item_id": "prop_1"},
{"type": "item_collected", "item_id": "prop_2"}
]
},
"rewards": {
"exp": 20,
"gold": 10
}
}
]
}
5) 【面试口播版答案】
面试官您好,针对2D动作游戏任务系统设计,我的核心思路是通过数据驱动+状态机管理,确保任务逻辑正确性与高可维护性。首先,任务数据结构采用任务节点+条件树:任务节点包含id、类型(主线/支线/日常)、前置条件、奖励等;条件树用and/or节点组合子条件(比如“通关intro_1关卡且收集key_1道具”是and节点),清晰定义任务逻辑。其次,配置驱动开发:任务逻辑通过JSON配置文件定义,而非硬编码,比如主线任务“初入江湖”的条件是“通关intro_1关卡且收集key_1道具”,奖励是经验100、金币50、武器sword_1。这样修改配置就能快速调整任务逻辑,提升可维护性。然后,状态机管理任务状态(未开始/进行中/已完成/失败),比如当玩家满足条件树时,状态从“未开始”转为“进行中”,完成后发放奖励,避免逻辑错误。主线任务强调线性流程,支线任务支持分支逻辑,日常任务采用周期触发,通过配置区分不同任务类型。最后,通过条件树校验与状态机追踪,保证任务条件触发和奖励发放的正确性,比如玩家完成条件后,系统自动检查状态机,确保奖励及时发放,避免遗漏或重复发放。这样设计既保证了任务逻辑的正确性,又通过配置驱动实现了高可维护性。
6) 【追问清单】
7) 【常见坑/雷区】