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

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个函数:

  1. 修改PLAYERFLEE(),逃跑成功返回True,失败返回False
  2. 修改PLAYERTURN(),把玩家的操作结果透传给战斗循环
  3. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:51:23