Bir yöntemin sonucunu nasıl saklayabilirim

0

Soru

Rastgele konumlarda ve rastgele rgb değerlerinde kareler çizmeye çalışıyorum ve bunların 1000'inin oluşturulmasını istiyorum. Karşılaştığım sorun şu ki, çizim döngüsü her gerçekleştiğinde, hepsini tekrar randomize ediyor, bunun gerçekleşmemesinin bir yolu var mı

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

En iyi cevabı

1

Bir nokta koleksiyonu oluşturun, sonra o nokta koleksiyonunu çizin. Artık nokta konumlarını ayrı ayrı güncelleyebilirsiniz ve bunlar yeni konumlarda yeniden çizilecektir. Burada, her noktanın her döngüde rastgele bir miktar hareket etmesini sağlıyorum.

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

Değerli bir değişiklik, tüm dikdörtgeni nesnede saklamaktır:

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

Soru pygame ile ilgili. Bu yüzden lütfen kullanınpygame.Rect. Ayrıca şunları da kullanabilirsinizpygame.Color.
Rabbid76

Böyle hızlı bir yanıt için teşekkür ederiz, bu harika çalıştı! Tüm konumlarını ayrı ayrı nasıl saklayacağımı anlamaya çalışıyordum, bu yüzden bu çok güzeldi
WaffleKyle

Rastgele cevap verin.tohum daha zarif ve basittir. Tam olarak istenen davranışı veren sabit kodlanmış yerine rastgele tohum değeri kullanabilir.
Zada Zorg

Sanırım, sorunun ne olduğunu anlıyorum. Rastgele koyuyorum.nokta işlevinin içindeki tohum sorunu çözecektir. Aynı zamanda, bunun genel olarak optimal olmadığını kabul ediyorum.
Zada Zorg
0

Bir işlevi çağırırsınız dot() randomizasyon atadığınız yer. Dışındaki değerleri randomize eden bir kod parçası tanıtmalısınız. dot() işlev ve bunları ayrı bir dizide saklayın ve işlevi çağırın.

2021-11-22 19:33:27

Doğru bir cevap, bunun nasıl yapılacağını gösteren kodu gösterecektir.
Tim Roberts

Bence bu kadar basit şeyler için mantıklı değil. Ama eğer bu topluluk kurallarıysa -- Bunu dikkate alacağım
Anna D.

Buradaki fikrin, gelecek nesiller için bir cevap kataloğu oluşturmak olduğunu unutmayın. Sadece bir kişinin sorusuna cevap vermiyoruz, uzun vadeli bir hizmet veriyoruz. Bu nedenle, cevapların gerçekten mümkün olduğunca eksiksiz olması gerekir. Katkınız gibi şeyler bir yorum olmalı.
Tim Roberts
0

Açıklamanız, işlemin her seferinde aynı olmasını istediğiniz kadar sonucu saklamaya çalışmıyormuşsunuz gibi geliyor,ancak yine de rastgele mi? Kodlanmış bir tohum kullanabilir misin?

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

Daha fazla ayrıntı için bu bağlantıya bakın: Rastgele Tohum

2021-11-22 19:39:52

Hayır, sorunu yanlış anladınız. Her seferinde aynı rastgele sırayı istemiyor. Pozisyonların bir kez randomize edilmesini istiyor.
Tim Roberts

Bu, orijinal sorunu çözmek için en iyi yaklaşımdır. Sadece bir kod satırı gerektirir ve ayrıca bazı deterministik sonuçlar getirir. Prosedür tarafından oluşturulan dünyaları kullanan tüm oyunlarda standart yaklaşım budur.
Zada Zorg

@ZadaZorg Bu en iyi yaklaşım değil. Sorunu yanlış anladınız. Oyun her başladığında aynı noktaları istemiyor. Farklı pozisyonlar istiyor AMA her döngüde değişmelerini istemiyor. Temel sorun. Başlatmanın döngünün dışında olması gerekiyordu. Sorulmamış bir soruya cevap veriyorsunuz.
Tim Roberts

Diğer dillerde

Bu sayfa diğer dillerde

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