Jak zapisać wynik metody

0

Pytanie

Staram się rysować kwadraty w losowych lokacjach i losowych wartościach rgb, i chcę, aby powstało 1000 z nich. Problem, z którym spotykam, polega na tym, że za każdym razem, gdy występuje cykl rysowania, znowu рандомизирует to wszystko, czy jest jakiś sposób zrobić tak, aby do tego nie doszło

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

Najlepsza odpowiedź

1

Utwórz zbiór punktów, a następnie narysuj tę kolekcję punktów. Teraz możesz zaktualizować pozycje punktów oddzielnie, i będą dostosowane do nowych pozycjach. Tu nie zmuszam każdy punkt przenosić losową liczbę w każdym cyklu.

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

Stojąca modyfikacja polega na tym, aby zapisać cały prostokąt w obiekcie:

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

Pytanie dotyczy pygame. Więc proszę, użyjpygame.Rect. Można również korzystać zpygame.Color.
Rabbid76

Dziękuję ci za tak szybką odpowiedź, to wyszło cudownie! Próbowałem zrozumieć, jak przechowywać wszystkie ich pozycje osobno, więc to było bardzo miłe
WaffleKyle

Odpowiedź z pomocą random.seed jest bardziej elegancki i prosty. Może po prostu użyć losową wartość początkowa zamiast sztywno określony, co daje dokładnie pożądane zachowania.
Zada Zorg

Myślę, że wiem, o czym był problem. Noclegi random.seed wewnątrz funkcji dot rozwiąże problem. W tym samym czasie, zgadzam się, że nie jest to optymalne ogólnie.
Zada Zorg
0

Wywołasz funkcję dot() w którym wyznaczono рандомизацию. Trzeba wpisać fragment kodu, który рандомизирует wartości poza dot() opcje i zapisz je w osobnej tablicy, a następnie wywołać funkcję.

2021-11-22 19:33:27

Poprawna odpowiedź pokazywał kod, pokazując, jak to zrobić.
Tim Roberts

Myślę, że to nie ma sensu do takich prostych rzeczy. Ale jeśli to zasady społeczności-wezmę to pod uwagę
Anna D.

Pamiętaj, że tutaj chodzi o to, aby utworzyć katalog odpowiedzi dla potomnych. Możemy nie tylko odpowiedzieć na pytanie jednego człowieka, oferujemy długoterminowe usługi. W ten sposób odpowiedzi naprawdę powinny być jak najbardziej kompletne. Takie rzeczy jak twój wkład, powinny być komentarzem.
Tim Roberts
0

Twój opis brzmi tak, jakby nie koniecznie spróbować zapisać wynik tak bardzo, jak chcesz, aby proces za każdym razem było tak samo, ale i tak losowo? Można po prostu użyć ustalony nasienie?

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

Zobacz ten link, aby uzyskać więcej informacji na: Losowe ziarno

2021-11-22 19:39:52

Nie, źle zrozumiałeś problemu. Nie potrzebuje jedna i ta sama losowa sekwencja za każdym razem. On chce, aby pozycje były randomizowane JEDEN RAZ.
Tim Roberts

Jest to najlepszy podejście do rozwiązania pierwotnego problemu. Do tego potrzebny jest tylko jeden wiersz kodu, a także niektóre przewidywalne wyniki. Co jest standardowym podejściem we wszystkich grach, w których używane są generowane procedurą światy.
Zada Zorg

@ZadaZorg To NIE jest najlepsze podejście. Źle zrozumiałeś problemu. On nie chce, aby te same punkty pojawiały się przy każdym uruchomieniu gry. Chce inny zestaw pozycji, ALE on nie chce, aby one się zmieniały w każdym cyklu. TO jest główny problem. Inicjalizacja powinna być wycofana z cyklu. Odpowiedzieć na pytanie, który nie został ustawiony.
Tim Roberts

W innych językach

Ta strona jest w innych językach

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