Jak uložit výsledek metoda

0

Otázka

Snažím se kreslit čtverce v náhodné pozice a náhodné hodnoty rgb a chci 1000 z nich, které mají být vytvořeny. Problém jsem čelí, je, že pokaždé, smyčky pro kreslení dochází, je náhodně znovu, je tam nějaký způsob, jak se to nestalo

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

Nejlepší odpověď

1

Vytvořit dot kolekce, pak jen kreslit, že dot kolekce. Nyní můžete aktualizovat dot pozice odděleně, a oni budou překreslení v nových pozicích. Tady, budu mít každá tečka pohybovat náhodné množství v každé smyčce.

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

Užitečné modifikace je ukládat celý obdélník v objektu:

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

Otázkou je, o pygame. Takže prosím, použijte pygame.Rect. Můžete také použít pygame.Color.
Rabbid76

Děkuji za tak rychlou reakci, to fungovalo skvěle! Snažil jsem se přijít na to, jak ukládat všechny své pozice samostatně, takže to bylo velmi pěkné
WaffleKyle

Odpověď s náhodné.semeno je více elegantní a jednoduché. To může jen používat náhodnou počáteční hodnotu, místo pevně dané, což dává přesně požadované chování.
Zada Zorg

Myslím, že jsem pochopit, co to bylo za otázku. Uvedení náhodné.semeno uvnitř dot funkce bude řešit problém. Ve stejné době, já souhlasím, že to není optimální obecně.
Zada Zorg
0

Volání funkce dot() ve které jste přiřadili randomizace. Měli byste se seznámit kus kódu, který náhodně hodnoty mimo dot() funkce, a uložit je do samostatného pole, a pak volání funkce.

2021-11-22 19:33:27

Správná odpověď by ukázat kód ukazuje, jak to udělat.
Tim Roberts

Myslím, že to nemá smysl pro takové jednoduché věci. Ale pokud je to pravidly společenství -- vezmu to v úvahu
Anna D.

Pamatujte si, že nápad tady je vytvořit katalog odpovědi pro příští generace. Nejsme jen odpovědět na jednu osobu je otázka, jsme se poskytovat dlouhodobý servis. Tak, odpovědi, opravdu musíme být tak úplná, jak je to možné. Věci, jako je váš příspěvek by měl být komentář.
Tim Roberts
0

Tvůj popis zní, jako jste vy nejsou nutně snaží ukládat výsledek tak moc, jak chcete, proces musí být pokaždé stejný, ale přesto tak nějak náhodné? Můžete jen použít hard-kódované semen?

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

Viz tento odkaz pro více detailů: Náhodný Seed

2021-11-22 19:39:52

Ne, to jsi špatně pochopil problém. Nechce stejné náhodném pořadí pokaždé. Chce pozic randomizované JEDNOU.
Tim Roberts

To je nejlepší přístup k řešení původního problému. To vyžaduje pouze jeden řádek kódu a také představí některé deterministické výsledky. Což je standardní postup ve všech hrách, které používá postup generované světy.
Zada Zorg

@ZadaZorg To NENÍ nejlepší přístup. Jste nepochopil problém. Nechce, aby stejné body pokaždé, když hra běží. Chce jinou sadu pozic, ALE nechce je měnit se v každém obraze. TO je základní problém. Inicializace musí být venku smyčky. Odpovídáte na otázku, která nebyla položena.
Tim Roberts

V jiných jazycích

Tato stránka je v jiných jazycích

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