塔防游戏敌我单位1v1配对目标选择技术问题咨询
1v1对位锁定的塔防目标选择实现方案
嘿,这个需求完美贴合Kingdom Rush那种“死磕到底”的对位战斗感,我之前做类似塔防项目时也踩过交叉攻击的坑,给你梳理几个落地性强的实现思路:
核心思路:双向绑定+队列匹配
要彻底避免交叉攻击和目标堆叠,关键是给友方和敌方建立唯一的双向绑定关系,再通过“待匹配队列”来管控新单位加入或旧单位战败后的配对逻辑。
1. 单位属性扩展
给每个友方/敌方单位添加几个关键状态:
target:友方专属,存储当前锁定的敌方单位(null表示未锁定)engagedAlly:敌方专属,存储当前锁定自己的友方单位(null表示未被锁定)isAlive:标记单位是否存活
2. 初始化与动态匹配逻辑
维护两个全局的待匹配队列,每次有单位状态变化(新生成/战败)时触发匹配:
availableAllies:未锁定目标且存活的友方单位availableEnemies:未被友方锁定且存活的敌方单位
匹配流程伪代码示例(用JS编写,可适配你使用的开发语言):
function handleUnitStateChange() { // 刷新可用队列:过滤掉已绑定或死亡的单位 availableAllies = allies.filter(ally => !ally.target && ally.isAlive); availableEnemies = enemies.filter(enemy => !enemy.engagedAlly && enemy.isAlive); // 按1:1配对,取两个队列长度的最小值 const matchNum = Math.min(availableAllies.length, availableEnemies.length); for(let i = 0; i < matchNum; i++) { const currentAlly = availableAllies[i]; const currentEnemy = availableEnemies[i]; // 双向绑定,互相标记 currentAlly.target = currentEnemy; currentEnemy.engagedAlly = currentAlly; } }
如果需要更智能的配对(比如优先匹配距离最近的单位),可以先对两个队列按「距离己方最近」排序,再进行一一绑定,这样更贴合实战逻辑。
3. 战斗中的状态维护
每个友方单位的攻击逻辑要严格遵守以下规则:
- 攻击前先检查
target是否存活:- 存活则正常攻击,完全忽略其他敌方单位
- 若
target已战败:- 清空自身
target,同时让战败敌方清空engagedAlly - 将自己重新加入
availableAllies队列 - 触发一次匹配流程,等待新的可对战目标出现(没有新目标就保持 idle 状态)
- 清空自身
4. 避免堆叠的额外保障
可以加一个全局的engagementMap(键为友方ID,值为敌方ID),用来快速查询绑定关系,防止重复匹配:
const engagementMap = new Map(); // 配对时存入 engagementMap.set(currentAlly.id, currentEnemy.id); // 解除绑定删除 engagementMap.delete(currentAlly.id);
每次匹配前先查这个Map,确保不会出现一个敌方被多个友方锁定的情况。
贴合Kingdom Rush的细节优化
Kingdom Rush里的塔锁定目标后非常“专一”,你可以给友方加一个isWaiting状态:当目标战败后设置为true,直到成功匹配到新目标再改为false,期间完全不触发攻击逻辑,完美符合“等待新目标”的需求。
内容的提问来源于stack exchange,提问作者segev
相关产品推荐
相关产品推荐

