Cum pentru a stoca rezultatul unei metode

0

Problema

Am încercat să desenez pătrate în poziții aleatoare și aleatoare valorile rgb și vreau 1000 de ele pentru a fi creat. Problema cu care mă confrunt este că de fiecare dată când bucla pentru desen apare, se amestecă totul din nou, există vreo modalitate de a face acest lucru să nu se întâmple

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

Cel mai bun răspuns

1

A crea un punct de colectare, apoi trage doar ca punct de colectare. Acum puteți actualiza dot poziții separat, și se va aspira din nou poziții. Aici, eu sunt cu fiecare punct muta o sumă aleator în fiecare buclă.

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

Merită modificarea este de a stoca întregul dreptunghi în obiect:

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

Întrebarea este despre pygame. Deci, vă rugăm să folosiți pygame.Rect. Puteți folosi, de asemenea, pygame.Color.
Rabbid76

Vă mulțumim pentru un astfel de răspuns rapid, aceasta a lucrat minunat! Am încercat să dau seama cum de a stoca toate pozițiile lor separat, deci asta a fost foarte frumos
WaffleKyle

Răspunde cu random.sămânța este mai elegant si mai simplu. Se poate folosi doar aleatoare valoarea de semințe în loc de greu codificate, care oferă exact comportamentul dorit.
Zada Zorg

Cred că, înțeleg, ce întrebare a fost de aproximativ. Punerea la întâmplare.semințe în interiorul dot funcție va rezolva problema. În același timp, sunt de acord, că acest lucru nu este optimă, în general.
Zada Zorg
0

Apelați o funcție dot() în care trebuie atribuite hazardului. Tu ar trebui să introducă o bucată de cod care randomizes valorile in afara dot() funcția, și a le stoca într-o altă matrice, și apoi apela funcția.

2021-11-22 19:33:27

Un răspuns adecvat ar arăta cod care să demonstreze cum să facă acest lucru.
Tim Roberts

Cred că nu are sens pentru astfel de lucruri simple. Dar dacă acest lucru este reglementările legislației comunitare, voi lua în considerare acest lucru
Anna D.

Amintiți-vă că ideea aici este de a crea un catalog de răspunsuri pentru posteritate. Suntem nu doar de a răspunde la o persoană la întrebarea lui, suntem furnizarea de un serviciu pe termen lung. Astfel, răspunsurile trebuie să fie cât mai complete posibil. Lucruri cum ar fi contribuția dumneavoastră ar trebui să fie un comentariu.
Tim Roberts
0

Descrierea ta pare ca nu sunt neapărat încearcă pentru a stoca rezultatul atât de mult, după cum doriți procesul să fie același de fiecare dată, dar încă un fel de întâmplare? Ai putea folosi doar un hard-coded semințe?

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

Vezi acest link pentru mai multe detalii: Semințe Aleatoare

2021-11-22 19:39:52

Nu, ai inteles gresit problema. El nu vrea aceeași secvență aleatoare de fiecare dată. El vrea pozitii randomizate o DATĂ.
Tim Roberts

Aceasta este cea mai bună abordare pentru a rezolva problema inițială. Este nevoie de doar o linie de cod și, de asemenea, să introducă unele deterministe rezultate. Care este abordarea standard în toate jocurile care utilizează procedura lumi generate.
Zada Zorg

@ZadaZorg NU este cea mai bună abordare. Ai inteles gresit problema. El nu vrea aceleași puncte de fiecare dată când jocul se execută. El vrea un set diferit de poziții, DAR el nu vrea să le schimbi în fiecare buclă. CARE este problema de bază. Inițializarea necesar pentru a fi la curent. Răspunde-ți la o întrebare care nu a fost cerut.
Tim Roberts

În alte limbi

Această pagină este în alte limbi

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