Python在特定间隔内选择随机数

时间:2019-02-22 20:14:02

标签: python random pygame

所以我正在制作一个PyGame,棒球从上面掉下来,底部的用户必须接住球。球以随机速度下落,但是我很难让球以不同速度下落。

例如,我当前的球代码是:

def update(self):
    if self.is_falling:
        """Move the ball down."""
        self.y += random.randint(10, 200) / 100
        self.rect.y = self.y

在这里,当我运行程序时,球以不同的速度下落,但几乎没有什么不同。如果我将数字更改为(10,20000)/ 100,则每个球的掉落速度都非常快。请问是什么原因?似乎随机数不是那么随机。我使用的功能是否错误?

我想让每个球以非常不同的速度下降,例如一个非常快,而另一个非常慢。而且我希望它是随机数,以便用户可以以许多不同的速度进行游戏...

我想知道是否可以在生成的随机数之间设置特定间隔的随机函数?还是应该尝试其他方法?如果是这样,我应该怎么做?

我是Python的初学者,所以如果您能尽可能简单地进行解释,将不胜感激!

3 个答案:

答案 0 :(得分:2)

如果这是Python 2,则存在问题

random.randint(10, 200) / 100

因为除法将在整数数学中完成。 您应该使用

random.randint(10, 200) / 100.

另一个问题是,您在每次更新(可能是每帧)时都选择了随机步长,这不会给人一种速度上的错觉,而是给人一种更多的随机抖动的感觉。 最好像您一样选择随机速度,但至少在几帧甚至整个秋季动画中都将其保持不变。

答案 1 :(得分:1)

部分问题是亚像素距离。我认为您的主要问题是您的y运动。看一下self.y +=的等式,一半时间将导致只有一个像素的像素距离。将其添加到self.rect后,舍入(或截断)将使少于1个像素的数量消失。例如,生成的随机整数为99,然后除以100,即为0.99像素。在python中,int(0.99)为零。因此,自int(150/100) => 1以来,大约有一半的时间移动为零,另一半的移动仅为1个像素。 (每190个瞬间中就有一个是2像素。)

def update(self):
    if self.is_falling:
        """Move the ball down."""
        self.y += random.randint(10, 200) / 100
        self.rect.y = self.y

也正如@ 6502指出的那样,这将产生随机的随​​机运动。最好在类__init__中生成每次更新像素,并坚持这样做。

def __init__( self, ... ):
    ...
    self.fall_speed = random.randint(10, 200)   # pixels per update

def update(self):
    if self.is_falling:
        """Move the ball down."""
        self.y += self.fall_speed
        self.rect.y = self.y

我喜欢根据实时计算来推动事情发展。这需要物体速度和帧间时序来确定物体已移动了多少。我喜欢这样,因为如果您想在程序中添加重力(或其他),则很容易计算新位置。

class FallingSprite( pygame.sprite.Sprite ):
    """ A falling sprite.  Falls at a constant velocity in real-time """
    def __init__( self, image ):
        pygame.sprite.Sprite.__init__( self )
        self.image       = image
        self.rect        = self.image.get_rect()
        self.fall_speed  = random.randint(10, 200) # pixels / second
        self.last_update = int( time.time() * 1000.0 )
        self.rect.center = ( random.randrange( 0, WINDOW_WIDTH ), 0 )  

    def update( self ):
        # There may have been movement since the last update
        # so calculate the new position (if any)
        if ( self.fall_speed > 0 ):
            time_now    = int( time.time() * 1000.0 )
            time_change = time_now - self.last_update      # How long since last update?
            if ( time_change > 0 ):
                distance_moved   = time_change * self.fall_speed / 1000
                now_x, now_y     = self.rect.center        # Where am I, right now
                updated_y        = now_y + distance_moved
                # Did we fall off the bottom of the screen?
                if ( updated_y > WINDOW_HEIGHT ):
                    # sprite disappears
                    self.kill()
                else:
                    self.rect.center = ( now_x, updated_y )
                    self.last_update = time_now

答案 2 :(得分:0)

稍微调整一下数字,20000是从200跳出的一个非常大的数字。由于现在得到的值是10/100和200/100。这是0.1到2像素,所以我不认为它们会有很大的不同。您跳到10/100到20000/100,这是一个巨大的速度,相对于原始2像素,它的上限约为200像素。所以这就是您的问题。也许范围在200到2000甚至200到2500之间。您不需要大的调整,因为您说球开始非常迅速地下降。我以前做过相同类型的游戏,可以说您只需要稍微调整一下数字即可。