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
相关产品推荐
相关产品推荐

