Como armazenar o resultado de um método

0

Pergunta

Eu estou tentando desenhar quadrados em posições aleatórias e aleatória de valores rgb e eu quero 1000 deles para ser criado. O problema que eu estou enfrentando é que toda vez que o loop de desenho ocorre, ele embaralha tudo de novo, existe alguma maneira de fazer isso não acontecer

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

Melhor resposta

1

Criar um ponto de coleta, em seguida, basta desenhar o ponto de coleta. Agora você pode atualizar o ponto de cargos, separadamente, e eles vão redesenhar em novas posições. Aqui, eu estou tendo cada ponto de mover uma quantidade aleatória em cada loop.

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()

Uma pena modificação é o armazenamento de todo o retângulo no objeto:

...
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

A questão é sobre o pygame. Então, por favor, use pygame.Rect. Você também pode usar pygame.Color.
Rabbid76

Obrigado por uma resposta tão rápida, isso funcionou maravilhosamente! Eu estava tentando descobrir como armazenar todos os seus cargos, separadamente, então isso foi muito bom
WaffleKyle

Resposta aleatória.semente é mais elegante e simples. Ele pode apenas usar o semente aleatória de valor, em vez de rígido codificado, o que dá exatamente o comportamento desejado.
Zada Zorg

Eu acho, eu entendo, que a pergunta era sobre. Colocando de forma aleatória.semente dentro de ponto de função vai resolver o problema. No mesmo tempo, eu estou de acordo, que isto não é o ideal em geral.
Zada Zorg
0

Você chamar uma função dot() em que você tiver atribuído a randomização. Você deve introduzir um pedaço de código que embaralha os valores fora da dot() função, e armazená-los em uma matriz separada e, em seguida, chamar a função.

2021-11-22 19:33:27

Uma resposta adequada seria show de código que demonstra como fazer isso.
Tim Roberts

Eu acho que não faz sentido para coisas tão simples. Mas se isso for regras da comunidade-eu vou levar isso em conta
Anna D.

Lembre-se de que a idéia aqui é criar um catálogo de respostas para a posteridade. Nós não estamos apenas respondendo a uma pessoa que pergunta, estamos fornecendo um serviço a longo prazo. Assim, as respostas precisam, realmente, de ser o mais completo possível. Coisas como a sua contribuição deve ser um comentário.
Tim Roberts
0

Sua descrição parece que você não são, necessariamente, tentando armazenar o resultado tanto quanto você quer que o processo seja o mesmo o tempo todo, mas ainda classificar de forma aleatória? Você poderia usar apenas um hard-coded semente?

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

Veja este link para mais detalhes: Semente Aleatória

2021-11-22 19:39:52

Não, você não ter compreendido o problema. Ele não quer a mesma sequência aleatória de cada vez. Ele quer que as posições randomizados uma VEZ.
Tim Roberts

Esta é a melhor abordagem para resolver o problema original. É requer apenas uma linha de código e, também, apresentar alguns deterministas resultados. Qual é a abordagem padrão em todos os jogos que utiliza procedimento gerado mundos.
Zada Zorg

@ZadaZorg NÃO é a melhor abordagem. Você não ter compreendido o problema. Ele não quer que o mesmo pontos de cada vez que o jogo é executado. Ele quer um diferente conjunto de posições, MAS ele não quer que eles mudam em cada loop. Esse é o problema básico. A inicialização necessária para fora do loop. Você está respondendo a uma pergunta que não foi perguntado.
Tim Roberts

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................