【问题标题】:Using recursion in pygame在 pygame 中使用递归
【发布时间】:2021-12-06 14:15:06
【问题描述】:

我是 python 和一般编程的新手,我正在为一个以 python 为中心的类做一个最终项目。我似乎无法弄清楚如何进行工作的要求之一是将递归集成到我们的代码中以显示工作知识。我使用 pygame 制作了一个简单的“子弹地狱”风格游戏。

我的目标是,当子弹与敌人接触时,会从玩家位置发射一系列子弹,作为一种短期修饰符。

每当子弹击中敌人时,这段代码就会在主循环中运行:

     for i in reversed(range(len(bullets))):
            for j in reversed(range(len(enemies))):
                if bullets[i].collided(enemies[j].rect):
                    del enemies[j]
                    del bullets[I]

                    s.global_score += 100
                    more_bullets(10)

                    #print("Hit!")
                    #print(s.global_score)
                    break

“more_bullets”函数是我递归的重点,并称之为:

def more_bullets(n):
    if(n > 0):

        spawnx = sq.rect.x+10 + sq.rect.width/2 - 10
        b = Square(s.red, spawnx,sq.rect.y, 10,30)
        b.direction = 'N'
        b.player_speed = 10
        bullets.append(b)

        spawnx = sq.rect.x-10 + sq.rect.width/2 - 10
        b = Square(s.red, spawnx,sq.rect.y, 10,30)
        b.direction = 'N'
        b.player_speed = 10
        bullets.append(b)

        pygame.display.update()

        more_bullets(n-1)

        print(f"Fired x {n}")

目前的结果是我的调试确实打印了 10 次,这让我认为递归运行正常,但是在发生碰撞时只有一组子弹在发射。我在想所有 10 颗子弹的发射速度比我注册它的速度还要快,只是在屏幕上堆积。

是否有一个易于使用的功能可以减慢子弹的发射速度?还是在这里搞砸了一些更根本的事情?

【问题讨论】:

  • 你能在每发子弹后强制一个动画刻度吗?

标签: python


【解决方案1】:

我在想,所有 10 颗子弹的发射速度都快于我无法记录的速度,并且只是堆积在屏幕上。

你是对的。

我不相信有一种“简单的方法”可以按照你的想法去做。递归是立即的,这意味着函数在被调用时会立即运行 10 次。要让它发出一连串交错的子弹,您需要某种计时器或队列或沿着主循环运行的那些线路的东西,而递归实际上并不适合这样做。这同样适用于任何类型的游戏逻辑函数,它会在一段时间内发挥作用。

这不是被问到的,但这里有一个关于你可以做什么的想法,即使它是对递归的一种冗余使用:向该函数添加一个参数,该参数指示子弹发射的角度。然后,在每次递归调用时向该参数添加一点点。这样一来,子弹就会同时射出。

【讨论】:

  • 太棒了。所以我没有完全使用你的建议,但你肯定提示了我需要找出解决方法的上下文。通过使用 n 作为变量来修改项目符号的生成位置,我创建了一行项目符号创建了类似的效果,并展示了递归的使用,感谢一堆评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多