分享一下队列的妙用

队列系统 · 0.5可视化

让游戏流程清晰到如同水洗过一样!

最近在折腾自己的游戏框架,最初我想把项目流程做成一张流程图——用节点加连线,搞点可视化展示。
实践下来却发现:

  • 项目太简单时,画图纯属多余;
  • 项目一复杂,连线多到吓死人,根本理不清。

后来试着用了队列,瞬间觉得“真香”!于是干脆在队列上做文章,把整个流程串起来。


举个实际例子:回合制战斗

假设角色 A 攻击怪物 B

1. 最简流程

A 攻击 B → 造成伤害 → 死亡判定
若 B 没死,继续循环回合。

2. 加一点复杂度:B 有反伤能力

A 攻击 B → 伤害计算 → 死亡判定 → 反伤计算 → 再判定 A 是否被反伤击杀。

3. 再加一点:A 有吸血能力

A 攻击 B → 伤害计算 → 吸血计算 + 反伤计算
问题来了:吸血和反伤谁先算?
如果反伤先算,A 被反到血量归零,还能靠吸血起死回生吗?

4. 再再复杂一点:多段攻击 + 概率吸血

  • A 的一次攻击可能是多段的;
  • 吸血效果可能是概率触发的。

那么:

  • 前几段就击杀敌人时,后续攻击还继续吗?
  • 前几段就被反伤弹死时,后续攻击触发的回血能把自己拉回来吗?

老练的开发者会仔细推敲这些细节,但现实往往是——“先这样试试”,几天后让你改机制。


队列机制如何优雅解决?

队列的核心思想很简单:将任务封装、入队、依次执行
因为任务都在队列里,所以可以方便地插队——这是最强大的功能。

示例队列 ①(吸血无法起死回生)

攻击任务 → 伤害计算 → 反伤计算 → 敌人死亡判定 → 玩家死亡判定 → 吸血计算

吸血在死亡判定之后,所以无法起死回生。

示例队列 ②(吸血先于反伤)

攻击任务 → 伤害计算 → 吸血计算 → 反伤计算 → 敌人死亡判定 → 玩家死亡判定

吸血在反伤之前,先吸血再计算反伤。

示例队列 ③(多轮攻击,允许鞭尸和弹后复活)

攻击任务 → 攻击轮次计数 → 伤害计算 → 反伤计算 → 吸血计算 → 轮次切换任务
(轮次未满时,插入 伤害计算、反伤计算;满了就跳过)→ 死亡判断任务

死亡判断在多轮攻击之后,所以多轮攻击不会中断,允许鞭尸,也可能被弹死后靠后续回血起死回生。


更进一步:任务嵌套与子任务

为了更好地处理插队和清除,我将任务队列本身也设计成任务类,允许一个任务拥有子任务
这样结构更清晰,也便于批量移除某一条子队列。

举个实际结构:

battle_task
 └─ player_turn_task
     ├─ player_attack
     │   ├─ 单段攻击任务
     │   │   ├─ damage_task
     │   │   │   ├─ (vampire_task 可插入此处)
     │   │   │   └─ (反伤 task 可插入此处)
     │   │   └─ check_dead_task
     │   │       └─ 若敌人死亡 → battle_task 清空
     │   │          (非单一敌人时,增加 check_win_task)
     │   └─ 段数切换任务
     │       └─ 递增段数,未满则再插入一轮单段攻击
     └─ turn_switch_task
         └─ 切换阵营,插入 player_turn_task 或 enemy_turn_task + turn_switch_task

根据角色是否吸血/敌人是否反伤,player_attack 中会动态插入 vampire_task 或反伤判定任务。
也可以固定插入,然后在任务内部根据条件跳过。


更复杂的场景也能 Hold 住

在实际工作中,我还遇到过:

  • 反击:敌人被攻击后可能触发反击,反击带有攻击附带的各类效果判定,比单纯反伤复杂得多;
  • 援击:你攻击时,队友有概率触发援击,帮你补一发。

这些机制在任务队列系统下,都能清晰地拆分和插入
你只需要考虑 任务拆到什么粒度,以及 在哪个位置插入 即可。


0.5 可视化的含义

任务执行时,每一步的任务树结构都可以通过命令逐步打印出来,运行流程一目了然。

相比传统的流程图,你无法一眼看到完整的全貌,但你可以逐步看到当前正在执行和准备执行的任务——这就是我所说的 “0.5 可视化”


适用场景

这种方法特别适合:
:white_check_mark: 流程复杂
:white_check_mark: 需要频繁修改机制
:white_check_mark: 希望快速调整执行顺序和插入新逻辑

如果你也在纠结复杂的游戏流程,不妨试试队列思路,或许会让你豁然开朗 :smile:

吸血是第一次伤害的附带性质。反伤是在承受了第一次伤害没死以后的第二次伤害流程。

没有先反伤再吸血这种设定的。肯定是伤害同时加血-没死反伤。这样才是合理的。

关于战斗,可以参考知乎这篇 https://zhuanlan.zhihu.com/p/416805924?share_code=nwg0oFTg2ZYR&utm_psn=2080638912100307801

我觉得它的设计是相对比较合理的。

你的看法我赞同,不过我不是和你讨论怎么设计合理。 吸血可能是先吸再反伤合理。如果换一个,击杀敌人触发回血,你觉得是先被弹死还是回血回回来? :yum: 实际工作中,很容易出现这类设计上不明确的问题。虽然这主要是策划的工作,不过往往会因为策划设计时无法预先考虑好具体情况,导致中途要改。 甚至有时候,预先考虑好的机制大家都觉得是对的,但是实际游玩的时候,这种机制玩家不喜欢。

刚刚我反思了一下,确实有些游戏设计是可以先反伤再吸血,这是游戏机制设计的取舍。

不过话题跑偏了,队列能支持这种设计的改动。

嗯,你说的是方案的鲁棒性问题。