0

我正在制作一个简单的基于文本的游戏,它使用while循环进行战斗。它询问玩家他们想做什么,并提供使用武器或库存(药水等)的选项。如果他们选择库存来查看他们拥有的东西,我怎样才能让他们选择回去选择武器并进行攻击?我试图创建一个调用back它的唯一代码的函数pass,如果用户键入back它会将它们发送到菜单的开头。但它只会无休止地循环敌人的攻击,而不让用户做任何事情。有任何想法吗?这是我的战斗代码:

我希望能够在print "what will you do?"线路之后将它们送回

 def combat():

    hero_hp = 1000000
    enemy_hp = randint(5, 10)
    enemy_name_test = randint(1,5) 
    enemy_weapon_test = randint(1,5)   
    enemy_name = list_of_enemys[enemy_name_test]
    enemy_weapon = list_of_weapons[enemy_weapon_test]
    while hero_hp > 0 and enemy_hp > 0:
        print "The %s swings at you with a %s" % (enemy_name, enemy_weapon)
        damage = randint(0, 10)
        if damage == 0 :
            print "the %s misses" %enemy_name
        else : 
            hero_hp -= damage
            print "The %s hits you with a %s for %d hit points you have %d hit points left" % (enemy_name, enemy_weapon, damage, hero_hp)
            hero_hp -= damage
        if hero_hp <= 0 :
            print "you have been slain!"
            close()
        else :  
            print "What will you do?"


        print inventory 
        player_choice = raw_input("> ") 
        if player_choice == '1' :
            print hero_weapons
            player_choice2 = raw_input("> ")
            weapon = hero_weapons[player_choice2]


            damage = randint(0, 10)
            enemy_hp -= damage
            print "You attack with %s for %d hit points" % (weapon, damage)
            print "%s has %d hit points left" % (enemy_name, enemy_hp)
            if enemy_hp <= 0 :
                print "You have slain the %s" % enemy_name 
            else :
                pass


        else :
            print hero_equipment
            player_choice2 = raw_input("> ")
            heal = randint(1, 10)
            hero_equipment.pop(player_choice2)
            print "you drink a potion and heal %s hit points" % heal
4

2 回答 2

0

我希望这个答案不会超出您的想象,但是您的程序正在变得复杂,很快就会变成一团糟。

我建议你研究一下有限状态机,这是一种收集的好方法

  1. 我的播放器现在在做什么
  2. 玩家的选择从这里开始
  3. 每个选择带给玩家的新状态

您的代码已经描述了一个 FSM,它只是通过 if 语句和选择变量的组合来实现。这是一个与您尝试用代码描述的状态表接近的状态表

              |choice
state         |attack        potion        inventory       back
--------------+--------------------------------------------------------
combat_begin  |combat_begin  combat_begin  show_inventory
show_inventory|              combat_begin                  combat_begin 

如果玩家已经开始战斗,她可以攻击,然后她会开始战斗。她可以使用一种药水,这也使她回到战斗开始(并且具有药水的任何效果)。她可以要求查看她的库存,这使她处于新状态(show_inventory)。她在战斗开始时不能做的一件事就是“返回”,因为那个牢房是空的。

如果玩家处于 show_inventory 状态,她可以“返回”或使用药水,这两者都会重新开始战斗。她在这里不能做的是攻击或显示库存。

显然,我把这个例子写得非常简单,希望能让你知道这需要去哪里。

于 2013-09-11T03:58:01.750 回答
0

创建一个单独的函数,其中包含您想要循环的内容,然后每当要循环时,调用该函数。

例如:

def example(example_item):
    if example_a == example_b:
        example(example_item) #calling the function again
    else: 
        return(false)

当然这不是你会使用的,但它只是一个例子。确保每次都发生变化,否则它将是一个无限循环。例如,您可以添加1example_a,这最终会在某个时候停止循环。

于 2013-09-11T05:14:13.730 回答