Python выбирает случайное число в определенном интервале - PullRequest
0 голосов
/ 22 февраля 2019

Итак, я делаю 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 голосов
/ 25 февраля 2019

Часть проблемы - это субпиксельные расстояния.Я думаю, что ваша главная проблема - ваше y движение.Посмотрите на это уравнение для self.y +=, половину времени оно приведет к расстоянию в пиксель только в один пиксель.Когда это добавлено к self.rect, округление (или усечение) приведет к исчезновению величин менее 1 пикселя.Например, сгенерированное случайное целое число равно 99, затем разделенное на 100, равно 0,99 пикселя.В питоне int(0.99) это ноль.Таким образом, примерно в половине случаев движение равно нулю, а в другой половине - только 1 пиксель, начиная с int(150/100) => 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
0 голосов
/ 25 февраля 2019

Просто немного подкорректируйте числа, 20000 - это очень большой скачок с 200. Сейчас вы получаете значения 10/100 и 200/100.Что составляет от 0,1 до 2 пикселей, поэтому я не думаю, что они будут сильно отличаться. Вы прыгнули с 10/100 до 20000/100, что является огромной скоростью, которая составляет около 200 пикселей по сравнению с оригиналом 2. Так что это вашевопрос.Возможно диапазон от 200 до 2000 или даже от 200 до 2500. Вам не нужен такой большой твик, как вы сказали, шары начали очень быстро падать.Я уже делал такую ​​же игру раньше, и могу сказать, что вам просто нужно немного подправить цифры.

0 голосов
/ 22 февраля 2019

Если это Python 2, есть проблема с

random.randint(10, 200) / 100

, потому что деление будет выполнено в целочисленной математике.Вы должны использовать

random.randint(10, 200) / 100.

Другая проблема заключается в том, что вы выбираете случайный шаг при каждом обновлении (вероятно, в каждом кадре), и это не даст иллюзии скорости, а скорее случайного движения.Вероятно, было бы лучше выбрать произвольную скорость, как вы делаете, но сохраняйте ее одинаковой, по крайней мере, для нескольких кадров или даже для всей анимации падения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...