PHP实现游戏内随从PVP攻击逻辑遇阻,求方向与示例指引
攻击结算功能落地逻辑参考
之前跑不通大概率是没有按「先预处理数据→再分配武器→最后进入回合结算」的顺序走,不要把所有逻辑揉在一个循环里写。
第一步:数据标准化预处理
所有原始数组先做清洗,不要带着无效值直接进逻辑:
- 过滤无效随从:比如测试数据里攻击方随从数组的索引0位置值为0,直接剔除,不参与后续计算
- 临时给每个有效随从绑定调试属性:固定
HP=10 - 统计有效武器数量:同样过滤掉武器数组里值为0的无效项,只算实际拥有的武器数量,别直接用数组长度当武器数(攻击方武器数组长度是7,但实际有效武器只有2把,按长度算会直接算错)
第二步:按规则做武器分配
双方的武器分配独立计算,不要混在一起:
- 把己方清洗后的有效随从,按HP从高到低排序,匹配「优先给高HP随从发武器」的规则
- 按排序顺序给随从发武器,直到有效武器用完为止
- 没拿到武器的随从直接标记阵亡,移出战斗队列,不参与后续攻击
用提供的测试数据演算这一步的结果:
- 攻击方有效随从共4个,有效武器共2把,排序后发完2把武器,剩余2个随从无武器直接阵亡,最终2个存活随从进战斗队列
- 防守方有效随从共5个,有效武器共7把,数量超过随从总数,5个随从全部能拿到武器,无直接阵亡,5个存活随从全进战斗队列
第三步:回合制攻击结算
战斗队列全部准备好后,按「优先攻击对方HP最低随从」的规则走循环:
- 把双方进战斗的存活随从,统一按HP从低到高排序,队头永远是当前最薄弱的目标
- 每一轮的出手顺序固定:
- 攻击方所有存活随从,依次对防守方队头的最低HP目标造成伤害(调试值为每个随从5点伤害)
- 目标HP被打空就从队列移除,自动顺位下一个最低HP的目标
- 防守方所有存活随从,用同样的逻辑打攻击方队列的最低HP目标
- 循环直到某一方没有存活随从,结算战斗结果
最小可落地逻辑参考(伪代码,无需全抄)
// 清洗数据+分配武器的通用函数 function initBattleQueue($followerIds, $gunIds) { // 过滤无效随从和无效武器 $validFollowers = array_filter($followerIds, fn($id) => $id > 0); $validGunCount = count(array_filter($gunIds, fn($id) => $id > 0)); // 给随从绑定临时HP,按HP从高到低排序准备发武器 $sortedFollowers = array_map(fn($id) => ['id' => $id, 'hp' => 10], $validFollowers); usort($sortedFollowers, fn($a, $b) => $b['hp'] <=> $a['hp']); // 发完武器后,把存活队列按HP从低到高排序,方便打最薄弱目标 $aliveQueue = array_slice($sortedFollowers, 0, $validGunCount); usort($aliveQueue, fn($a, $b) => $a['hp'] <=> $b['hp']); return $aliveQueue; } // 初始化双方战斗队列 $attackerQueue = initBattleQueue($attackerFollowers, $attackerGuns); $defenderQueue = initBattleQueue($defenderFollowers, $defenderGuns); // 循环结算直到一方队列清空 while (count($attackerQueue) > 0 && count($defenderQueue) > 0) { // 攻击方集火打防守方队头的最低HP目标 $defenderQueue[0]['hp'] -= 5 * count($attackerQueue); if ($defenderQueue[0]['hp'] <= 0) array_shift($defenderQueue); // 防守方集火打攻击方队头的最低HP目标 $attackerQueue[0]['hp'] -= 5 * count($defenderQueue); if ($attackerQueue[0]['hp'] <= 0) array_shift($attackerQueue); }
常见踩坑点
- 不要把武器的强弱排序逻辑混到分配流程里,当前规则只要求武器数量够覆盖高HP随从,没要求武器伤害和随从匹配
- 不要把无武器的随从留在战斗队列里,规则明确这类随从直接阵亡、不能造成伤害,留到后面结算会混进无效计算
- 攻击目标的选择不要随机,必须按HP从低到高排序,保证永远先打最薄弱的
内容的提问来源于stack exchange,提问作者xion360
相关产品推荐
相关产品推荐

