Как сохранить результат метода

0

Вопрос

Я пытаюсь нарисовать квадраты в случайных положениях и случайных значениях rgb, и я хочу, чтобы было создано 1000 из них. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда возникает цикл рисования, он снова рандомизирует все это, есть ли какой-либо способ сделать так, чтобы этого не произошло

import pygame
import sys
import random
pygame.init()
win = pygame.display.set_mode((800,600))
pygame.display.set_caption("Simulation")

def safeZone():
        #Draws a top rectangle
    pygame.draw.rect(win, (50,205,50), (0, 0, 800, 100))
    
def dot():
    width = 10
    height = 10
    spawnX = random.randrange(1, 801)
    spawnY = random.randrange(1, 601)
    r = random.randrange(1, 256)
    g = random.randrange(1, 256)
    b = random.randrange(1, 256)
    pygame.draw.rect(win, (r, g, b), (spawnX, spawnY, width, height))

def population(size):
    for x in range(size):
        dot()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    win.fill((255, 255, 255))
    safeZone() # Always draw dots after safe zone
    population(1000)
    pygame.display.update()

pygame.quit()


pygame python
2021-11-22 19:27:48
3

Лучший ответ

1

Создайте коллекцию точек, а затем просто нарисуйте эту коллекцию точек. Теперь вы можете обновить позиции точек отдельно, и они будут перерисованы в новых позициях. Здесь я заставляю каждую точку перемещать случайное количество в каждом цикле.

import pygame
import sys
import random
pygame.init()
win = pygame.display.set_mode((800,600))
pygame.display.set_caption("Simulation")

class Dot:
    def __init__(self):
        self.spawnX = random.randrange(0, 800)
        self.spawnY = random.randrange(0, 600)
        self.r = random.randrange(0, 256)
        self.g = random.randrange(0, 256)
        self.b = random.randrange(0, 256)

def safeZone():
        #Draws a top rectangle
    pygame.draw.rect(win, (50,205,50), (0, 0, 800, 100))
    
def drawdot(dot):
    width = 10
    height = 10
    pygame.draw.rect(win, (dot.r, dot.g, dot.b), (dot.spawnX, dot.spawnY, width, height))

def population(dots):
    for dot in dots:
        dot.spawnX += random.randrange(-3,4)
        dot.spawnY += random.randrange(-3,4)
        drawdot(dot)

alldots = [Dot() for _ in range(1000)]

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    win.fill((255, 255, 255))
    safeZone() # Always draw dots after safe zone
    population(alldots)
    pygame.display.update()

Стоящая модификация состоит в том, чтобы сохранить весь прямоугольник в объекте:

...
class Dot:
    def __init__(self):
        self.location = [
            random.randrange(0, 800),
            random.randrange(0, 600),
            10, 10
        ]
        self.color = (
            random.randrange(0, 256),
            random.randrange(0, 256),
            random.randrange(0, 256)
        )
    def move(self, dx, dy ):
        self.location[0] += dx
        self.location[1] += dy

def drawdot(dot):
    pygame.draw.rect(win, dot.color, dot.location)

def population(dots):
    for dot in dots:
        dot.move( random.randrange(-3,4), random.randrange(-3,4) )
        drawdot(dot)
...
2021-11-22 19:39:00

Вопрос касается pygame. Поэтому, пожалуйста, используйтеpygame.Rect. Вы также можете использоватьpygame.Color.
Rabbid76

Спасибо вам за такой быстрый ответ, это сработало чудесно! Я пытался понять, как хранить все их позиции отдельно, так что это было очень приятно
WaffleKyle

Ответ с помощью random.seed более элегантен и прост. Он может просто использовать случайное начальное значение вместо жестко заданного, что дает точно желаемое поведение.
Zada Zorg

Я думаю, я понимаю, о чем был вопрос. Размещение random.seed внутри функции dot решит проблему. В то же время, я согласен, что это не оптимально в целом.
Zada Zorg
0

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

2021-11-22 19:33:27

Правильный ответ показал бы код, демонстрирующий, как это сделать.
Tim Roberts

Я думаю, что это не имеет смысла для таких простых вещей. Но если это правила сообщества-я приму это во внимание
Anna D.

Помните, что идея здесь состоит в том, чтобы создать каталог ответов для потомков. Мы не просто отвечаем на вопрос одного человека, мы предоставляем долгосрочные услуги. Таким образом, ответы действительно должны быть как можно более полными. Такие вещи, как ваш вклад, должны быть комментарием.
Tim Roberts
0

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

import random
random.seed(10)
print(random.random())

Смотрите эту ссылку для получения более подробной информации: Случайное семя

2021-11-22 19:39:52

Нет, вы неправильно поняли проблему. Ему не нужна одна и та же случайная последовательность каждый раз. Он хочет, чтобы позиции были рандомизированы ОДИН РАЗ.
Tim Roberts

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

@ZadaZorg Это НЕ лучший подход. Вы неправильно поняли проблему. Он не хочет, чтобы одни и те же точки появлялись каждый раз при запуске игры. Он хочет другой набор позиций, НО он не хочет, чтобы они менялись в каждом цикле. ЭТО основная проблема. Инициализация должна была быть выведена из цикла. Вы отвечаете на вопрос, который не был задан.
Tim Roberts

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................