You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言实现宝可梦对战功能:如何循环攻击直到一方宝可梦昏厥

问题核心原因

你当前的代码只打印了伤害计算结果,但没有将剩余HP值更新到全局存储的宝可梦HP变量中,每次调用函数都是用初始满HP值计算,自然每次都从头开始,陷入无限循环。

修改方案

1. 先明确全局基础属性定义和伤害函数调整

先把固定属性、初始HP明确定义在全局环境,同时给伤害函数加最低HP为0的边界处理,避免出现负HP异常:

# 全局基础属性(数值可替换为你数据集里的实际值)
hpMewTwo <- 106
hpRayquaza <- 150
speedM <- 130
speedR <- 95

# 调整伤害函数,增加0HP边界处理
Mhighdamage <- function(x){
  pain = hpMewTwo - x/1.8
  return(max(pain, 0))
}
# 其余Rextremedamage、Rdamage、Rlowdamage、Mdamage都按照相同逻辑调整,统一加max返回0的处理

2. 重构单回合对战逻辑

把开场提示从回合函数里抽出来,同时用<<-赋值符更新全局HP变量,保证每回合伤害都被记录:

fight_round <- function(){
  # 双方随机选择技能
  M_skill <- sample(c("Psystrike", "Aura Sphere", "Ice Punch", "Solar Beam"))
  R_skill <- sample(c("Outrage", "Dragon Ascent", "Crunch", "Brutal Swing"))
  
  # 超梦先攻逻辑
  if (speedM > speedR && hpMewTwo > 0){
    if (M_skill == "Ice Punch"){
      hpRayquaza <<- Rextremedamage(75)
      cat(paste0("烈空坐剩余HP:", hpRayquaza, "\n"))
      print("Ice Punch is hyper effective!")
    } else if (M_skill == "Psystrike"){
      hpRayquaza <<- Rdamage(100)
      cat(paste0("烈空坐剩余HP:", hpRayquaza, "\n"))
      print("Psystrike has normal efficiency.")
    } else if (M_skill == "Aura Sphere"){
      hpRayquaza <<- Rlowdamage(80)
      cat(paste0("烈空坐剩余HP:", hpRayquaza, "\n"))
      print("Aura Sphere is not very effective...")
    } else if (M_skill == "Solar Beam"){
      hpRayquaza <<- Rlowdamage(100)
      cat(paste0("烈空坐剩余HP:", hpRayquaza, "\n"))
      print("Solar Beam is not very effective...")
    }
  }
  
  Sys.sleep(1.4)
  
  # 烈空坐攻击逻辑(先判断自身是否昏厥)
  if (hpRayquaza > 0){
    for (a in c("Rayquaza is angry...", "Go!")){
      print(a)
      Sys.sleep(1.2)
    }
    if (R_skill == "Outrage"){
      hpMewTwo <<- Mdamage(120)
      cat(paste0("超梦剩余HP:", hpMewTwo, "\n"))
      print("Outrage has normal efficiency.")
    } else if (R_skill == "Dragon Ascent"){
      hpMewTwo <<- Mdamage(120)
      cat(paste0("超梦剩余HP:", hpMewTwo, "\n"))
      print("Dragon Ascent has normal efficiency.")
    } else if (R_skill == "Crunch"){
      hpMewTwo <<- Mhighdamage(80)
      cat(paste0("超梦剩余HP:", hpMewTwo, "\n"))
      print("Crunch is super effective!")
    } else if (R_skill == "Brutal Swing"){
      hpMewTwo <<- Mhighdamage(60)
      cat(paste0("超梦剩余HP:", hpMewTwo, "\n"))
      print("Brutal swing is super effective!")
    }
  }
  Sys.sleep(1)
}

3. 编写主循环逻辑

循环条件设置为双方HP都大于0才继续,有一方昏厥就自动终止循环输出结果:

# 开场提示仅执行一次
for (i in c("Ready", "Set", "Go!")){
  print(i)
  Sys.sleep(1.2)
}

# 对战循环
while(hpMewTwo > 0 && hpRayquaza > 0){
  fight_round()
}

# 输出对战结果
if (hpMewTwo <= 0) {
  print("超梦昏厥,烈空坐获得胜利!")
} else {
  print("烈空坐昏厥,超梦获得胜利!")
}
关键逻辑说明
  • <<-是R中的全局赋值符,会直接修改全局环境中的HP变量,而不是在函数内部生成临时变量,保证每回合的伤害结果都会被持久记录
  • 所有伤害函数都增加了max(计算值, 0)的处理,避免出现负HP的异常情况
  • 循环条件明确判断双方HP状态,只要有一方HP归0就自动终止,不会出现无限循环

内容的提问来源于stack exchange,提问作者Håki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:24:04