1

我正在尝试从LPTHW的练习 36 中获得一个游戏来工作。

我可以让游戏的整个部分正常工作,除非它进入战斗。这就是我认为问题所在。

def combat_engine():    
    global wins, hit_points, current_hp
    if monster_current_hp or current_hp > 0:
        print "You can type 'a' for attack, or 'q' for quit, choose one."
        answer = raw_input(":> ")
        if 'a' in answer:
            attack(monster)
            attack('player')
            combat_engine()
        elif 'q' in answer:
            print t.white_on_red("You give up and are devoured by the %s.") % monster
            exit(0)
        else:
            print "I dont understand %s." % answer
            next()
            combat_engine() 
    elif monster_hp == 0:
        print "You defeated the %s, congradulations %s!" % monster, name
        wins = wins + 1
        if wins == 5:
            you_win()
        elif victim == 'player':
            hit_points = hit_points + d6()
            current_hp = hit_points
            print "You feel hardier."
            next()
            barracks()
    elif current_hp == 0:
        print "You have been deafeted by the %s, better luck next time." % monster
        next()
        exit(0)

    else: 
        print "Bug Somewhere"

我相信这个错误是在这个函数的某个地方。当我打印出每个角色的HP值时,怪物已经减少到-2 hp后战斗仍在继续。也许这是布尔值的问题?

我希望它做的是要么为获胜而进行所有的统计调整,如果你输了就退出游戏。我只是想克服这个问题,这样我就可以开始学习类和字典,这应该会让我的生活更轻松。如果我应该发布更多信息,请告诉我,我是新手,还不是在这里发布问题的最佳人选。

提前致谢!

4

2 回答 2

2

if monster_current_hp or current_hp > 0:在两个方面存在缺陷:首先,它只是测试 Monster_current_hp 是否评估为 true,而不是针对 0 进行测试;其次,即使该问题已修复,如果任一战斗机具有正 HP,该语句仍将继续程序,而当任一战斗机具有负 HP 时,您可能想停止。试试这个:if monster_current_hp > 0 and current_hp > 0:

一旦你这样做了,在大多数情况下,你将开始进入“某处的错误”行。这是因为当 HP 直接从正面变为负面elif monster_hp == 0:elif current_hp == 0:不会触发。<=在这两种情况下都使用以捕获 HP 为负数的情况。

于 2012-10-11T21:40:11.867 回答
1

在代码的最后一部分中,您不调用函数d100(),而是调用值 d100。这肯定不是你想要做的。

   if d20() >= monster_to_hit and d100() <= monster_crit:
        print "The %s scored a critical hit against you!" % monster
        hit_points = hit_points - (monster_dmg * 3)
        next()
    elif d20 >= monster_to_hit and d100() > crit:
        print "The %s strikes you!"
        hit_points = hit_points - monster_dmg
        next()

在python中调试时,主要是“打印”。您应该尽可能多地打印,以便了解发生了什么。

例子:

# attack function
def attack(victim):
    dice20 = d20()
    dice100 = d100()

    print "victim == monster", victim == monster    

    print dice20
    print dice100
    print to_hit
    print crit
    print monster_current_hp
    print mod_dmg 
    print mod_dmg * 3
    print monster_to_hit
    print monster_crit
    print hit_points
    print monster_dmg
    print monster_dmg * 3

    global monster_current_hp, current_hp, to_hit, crit, hit_points
    if victim == monster:
        if dice20 >= to_hit and dice100 <= crit:
            print "You scored a critical hit against the %s!" % monster
            monster_current_hp = monster_current_hp - (mod_dmg * 3)
            next()
        elif dice20 >= to_hit and dice100 > crit:
            print "You strike the %s!" % monster
            monster_current_hp = monster_current_hp - mod_dmg
            next()
        else:
            print "The %s evades your attack!" % monster
            next()
    else:
        if dice20 >= monster_to_hit and dice100 <= monster_crit:
            print "The %s scored a critical hit against you!" % monster
            hit_points = hit_points - (monster_dmg * 3)
            next()
        elif dice20 >= monster_to_hit and dice100 > crit:
            print "The %s strikes you!"
            hit_points = hit_points - monster_dmg
            next()

在战斗引擎中做同样的事情,以看到无限循环出现。然后删除那些用无用信息使你的跟踪膨胀的无用打印,直到你清楚地看到它循环的原因,因为某些值,因为布尔 if 测试的行为不符合你的预期......类似的事情。

于 2012-10-11T21:10:46.540 回答