Python游戏开发:满足条件时如何跳过指定函数调用
实现方案
核心目标:玩家逃跑掷点成功时跳过MOBTURN()调用,逃跑失败、其他操作正常触发怪物回合。
以下提供两种可行改法,可根据后续扩展需求选择:
方案1:最小改动版(无需修改其他函数,仅调整战斗循环逻辑)
原有代码里玩家逃跑成功时会直接将怪物血量mhp设为0,利用这个现有逻辑,只需要调整FIGHT()函数的执行顺序,把MOBTURN()放到怪物存活判断的分支里即可,同时还能修复原有代码“玩家打死怪物后仍会被怪物打一次”的原生bug。
修改后的FIGHT()代码如下:
def FIGHT(): mobalive=True while mobalive==True: PLAYERTURN() if mhp<=0: mobalive=False else: # 只有怪物存活时才执行怪物回合,自然跳过逃跑成功、怪物被击杀的场景 MOBTURN()
注意:该方案的局限是无法在战斗结束时区分“玩家击杀怪物”和“玩家成功逃跑”两种结算场景,如果后续需要做掉落奖励、经验结算等差异化逻辑,建议使用方案2。
方案2:返回值透传版(扩展性更好)
通过函数返回值明确标识玩家是否逃跑成功,逻辑更清晰,方便后续扩展不同战斗结果的结算。需要修改3个函数:
- 修改
PLAYERFLEE(),逃跑成功返回True,失败返回False - 修改
PLAYERTURN(),把玩家的操作结果透传给战斗循环 - 修改
FIGHT(),根据返回值和怪物存活状态判断是否跳过怪物回合
完整修改后相关代码如下:
def PLAYERFLEE(): fleechance=random.randint(1,10) global mhp global mgold global php if fleechance>=escapechance: mhp=int(0) mgold=int(0) print('You fled') return True # 标记逃跑成功 else: fleedmg=(random.randint(1,10)+mrdmg) php=php-fleedmg print(f'You took {fleedmg} damage!') return False # 标记逃跑失败 def MOBTURN(): mobatk=random.randint(1,10)+mdmg-parmor global php php=php-mobatk print(f'Mob HP:{mhp} Mob Damage:{mdmg} Mob Range Damage:{mrdmg} Mob Armor:{marmor} Mob Stun Status:{mstun}') print(f'You took {mobatk} damage!') def PLAYERTURN(): action=input(f'Your stats are HP: {php}, DMG: {pdmg}, Range DMG: {prdmg}, Stun Status: {pstun}. What will you do? (atk/ratk/flee/stun)') if action==str('atk'): PLAYERATTACK() return False elif action==str('ratk'): PLAYERRANGEATTACK() return False elif action==str('flee'): return PLAYERFLEE() # 透传逃跑结果 elif action==str('stun'): PLAYERSTUN() return False else: print('Please choose an option from the parentheses!') return PLAYERTURN() # 递归重选时也要透传返回值 def FIGHT(): mobalive=True while mobalive==True: flee_success = PLAYERTURN() if mhp<=0: mobalive=False # 只有没逃跑成功、且怪物仍然存活时,才执行怪物回合 if not flee_success and mhp > 0: MOBTURN()
内容的提问来源于stack exchange,提问作者Michael McCarthy
相关产品推荐
相关产品推荐

