Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python挑战:僵尸_Python_Python 3.x_Algorithm_If Statement_While Loop - Fatal编程技术网

Python挑战:僵尸

Python挑战:僵尸,python,python-3.x,algorithm,if-statement,while-loop,Python,Python 3.x,Algorithm,If Statement,While Loop,我试图解决以下挑战,但无济于事: 僵尸的移动速度为每秒0.5米。每秒钟,你先射杀一个僵尸,然后剩下的僵尸蹒跚前行0.5米 如果有僵尸爬到0米,你就会被吃掉。如果你在射杀所有僵尸之前弹药耗尽,你也会被吃掉。为了简单起见,我们可以忽略任何重新加载的时间 编写一个函数,该函数接受僵尸总数、以米为单位的范围以及您拥有的子弹数 如果你射杀了所有僵尸,返回“你射杀了所有X个僵尸”。如果你在杀死所有僵尸之前被吃掉,在弹药耗尽之前,返回“你在被吃掉之前射杀了X个僵尸:不知所措”。如果你在射杀所有僵尸之前弹药耗尽

我试图解决以下挑战,但无济于事: 僵尸的移动速度为每秒0.5米。每秒钟,你先射杀一个僵尸,然后剩下的僵尸蹒跚前行0.5米

如果有僵尸爬到0米,你就会被吃掉。如果你在射杀所有僵尸之前弹药耗尽,你也会被吃掉。为了简单起见,我们可以忽略任何重新加载的时间

编写一个函数,该函数接受僵尸总数、以米为单位的范围以及您拥有的子弹数

如果你射杀了所有僵尸,返回“你射杀了所有X个僵尸”。如果你在杀死所有僵尸之前被吃掉,在弹药耗尽之前,返回“你在被吃掉之前射杀了X个僵尸:不知所措”。如果你在射杀所有僵尸之前弹药耗尽,返回“你在被吃掉之前射杀了X个僵尸:弹药耗尽。”

(如果你在剩余僵尸到达你身边的同时弹药耗尽,返回“你在被吃掉之前射杀了X个僵尸:不知所措”。)

到目前为止,我的代码是:

def zombie_shootout(zombies, distance, ammo):
    if ammo >= zombies:
        ammo -= 1
        zombies -= 1
        distance -= 0.5
    elif ammo < zombies:
        print("You shot ",zombies,"zombies before being eaten: ran out of ammo.")
    elif distance == 0:
        print("You shot ",zombies,"zombies before being eaten: overwhelmed.")
    else:
        print("You shot all ", zombies,"zombies.")
def zombie_枪战(僵尸、距离、弹药):
如果弹药>=僵尸:
弹药-=1
僵尸-=1
距离-=0.5
elif弹药<僵尸:
打印(“你开枪了”,僵尸,“被吃掉前的僵尸:弹药用完了。”)
elif距离==0:
打印(“你开枪了”,僵尸,“被吃掉前的僵尸:不知所措。”)
其他:
打印(“你射杀了所有人”,僵尸,僵尸。”)

我知道对于那些无法解决这个难题的人来说,有一些解决方案,但它们很可能更加简洁和优雅,我想知道如何(如果可能的话)按照我的方式去做(很多ifs和ELIF,可能还会在某处加上一段时间).

让我们看看你的代码:你在评论中说你知道你需要一个
while
循环,所以让我们考虑一下我们应该在这个循环上设置什么条件。我们想继续射击,直到弹药耗尽,僵尸吃掉我们,或者僵尸耗尽。我们可以使用
all()
来检查所有变量是否大于0:

while all(x > 0 for x in (distance, ammo, zombies)):
这相当于:

while distance>0 and ammo>0 and zombies>0:
虽然这个条件是
真的
,但我们想在你的问题中应用你在if语句中已经使用过的逻辑。您还需要打印被拍摄的僵尸数量,因此让我们添加一个
zombies\u shot
变量,并在函数开始时将其设置为
0
,并在每次运行
while
循环时将其递增。我们现在有:

def zombie_shootout(zombies, distance, ammo):
    zombies_shot = 0
    while all(x>0 for x in (distance, ammo, zombies)):
        ammo -= 1
        zombies_shot += 1
        zombies -= 1
        distance -= 0.5
所以现在我们需要在中断
while
循环后检查条件。你几乎也有这个,但是让我们也检查一下是否还有僵尸,否则如果我们在最后一个僵尸到达之前射杀它,例如,你的函数仍然会说我们被吃掉了。我们还可以使用新的
zombies\u shot
变量

if ammo <= 0 and zombies > 0:
    print("You shot",zombies_shot,"zombies before being eaten: ran out of ammo.")
elif distance <= 0 and zombies > 0:
    print("You shot",zombies_shot,"zombies before being eaten: overwhelmed.")
else:
    print("You shot all", zombies_shot,"zombies.")

虽然@CDJB的答案非常好,但我想指出另一种方法,它也可以工作,但速度稍快一些(从计算角度来说)。这可能很重要的原因是,如果整个世界都被咬了一口,你就有大约7000.000.000.000个僵尸需要处理,所以一段时间的循环将需要很长时间

我们知道僵尸从距离
x
m的地方开始,我们每移动0.5米就可以射杀一个僵尸。这意味着我们可以拍摄:

 zombies_shot_distance = int(distance * 2)
我们也知道我们不能射出比弹药还多的僵尸,所以:

 zombies_shot_ammo = ammo
僵尸射击的最大数量是两个中最低的:

 zombies_shot_max = min(zombies_shot_distance, zombies_shot_ammo)
如果最大僵尸数量低于僵尸数量,我们知道我们将无法拍摄所有僵尸:

if zombies > zombies_shot_max:
    print("You shot", zombies_shot_max, "zombies")
    if zombies_shot_ammo <= zombies_shot_distance:
         print("because you ran out of ammo")
    else:
         print("because you were overwhelmed")
else:
    print("You shot all the zombies")
if zombies>zombies\u shot\u max:
打印(“你开枪了”,僵尸,僵尸)

如果zombies_shot_ammo有一个简短的递归解决方案,但是由于您想要跟踪僵尸射击的数量,我们需要编写一个递归帮助程序来跟踪这个数量

def zombie_rec(zombies, distance, ammo, shot):
    if zombies <= 0:
        return f"You shot all {shot} zombies."
    elif ammo <= 0:
        return f"You shot {shot} zombies before being eaten: ran out of ammo."
    elif distance <= 0:
        return f"You shot {shot} zombies before being eaten: overwhelmed."

    else:
        return zombie_rec(zombies - 1, distance - 0.5, ammo - 1, shot + 1)

def zombie(zombies, distance, ammo):
    print(zombie_rec(zombies, distance, ammo, 0))
def zombie_rec(僵尸、距离、弹药、射击):

如果是僵尸,你知道while循环是什么吗?(这听起来可能有点刺耳,但这是真心的,我保证)哈哈,是的,我想把“whiledistance>0”放进去,但在这种情况下不行,我不知道如何继续迭代我的程序(可能是“for I in range(distance)”?),你很接近了。为什么你认为距离>0时
不起作用?我应该补充一点,作为一名新程序员,你可能对学习橡皮鸭编程感兴趣,我认为它可以帮助解决你的问题,我是不是遗漏了什么?这个拼图不需要循环或任何类似的东西。这是一个简单的算法:
返回弹药>=僵尸和距离(单位:米)>僵尸*0.5
@Nathan fair,补充说明:)正如我在回答下面的评论中所指出的,我不明白为什么要使用循环。@KonradRudolph显然,这个问题可以通过简单的计算来解决-我认为这个练习的目的是教授基本的循环和函数,OP在问题的最后承认了这一点。@JohnDoe使用类似于:return'You shot'+zombies_shot+'zombies'的东西。如果您使用的是Python 3.6+,您还可以使用f-strings使用return f'you shot{zombies_shot}zombies:)是的,我昨天终于找到了答案。:)非常感谢你的帮助!F-strings是令人惊讶的,旧的python要复杂得多(%-formatting和str.format())。我喜欢这个递归函数的例子。你能解释一下这些是如何工作的,以便@John Doe也能清楚地看到吗?出于某种原因,这在网站上不起作用,但我用相同的参数在ide中进行了尝试,效果很好,谢谢!工作与回报(最后一行),非常感谢!谢谢,知道解决问题的不同方法总是很好的!
def zombie_rec(zombies, distance, ammo, shot):
    if zombies <= 0:
        return f"You shot all {shot} zombies."
    elif ammo <= 0:
        return f"You shot {shot} zombies before being eaten: ran out of ammo."
    elif distance <= 0:
        return f"You shot {shot} zombies before being eaten: overwhelmed."

    else:
        return zombie_rec(zombies - 1, distance - 0.5, ammo - 1, shot + 1)

def zombie(zombies, distance, ammo):
    print(zombie_rec(zombies, distance, ammo, 0))