如何制作orange的randomizefall python?

2024-06-26 00:14:23 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我一直在尝试使我的橙色在100-650宽和-200高之间随机下降,但我输入的代码不起作用,我正在尝试的代码使我的橙色只保持随机化正确我如何使它随机化而不只是随机化正确https://gyazo.com/928b117fb01d9050ac2c50cb1d2f269f

我的随机代码

run = True
while run:
# [...]


    for Platform in platforms:
        if orange1.rect.colliderect(Platform.rect):
            orange1.speed += 1
            orange1.x = random.randint(Orange.rect.x,Orange.rect.x + Orange.rect.width)
            orange1.y = random.randrange(0, 1 + 12)

我的完整代码

https://pastebin.com/aiWMQ5b5


Tags: run代码inhttpsrectcomtruefor
1条回答
网友
1楼 · 发布于 2024-06-26 00:14:23

这是因为您正在orange_rect矩形处绘制位图,而不是对象的位置self.rect。稍后更改self.rect以移动橙色,但这不会影响Orange.orange位图的.get_rect()返回的rect。问题的根源是当只需要一个矩形时,有两个矩形

class Orange:
    # [...]

    def draw(self):
        self.rect.topleft =(self.x,self.y)                             # < here
        pygame.draw.rect(window,self.color,self.rect)
 
        orange_rect = self.orange.get_rect(center = self.rect.center)  # << HERE
        orange_rect.centerx -= 2
        orange_rect.centery += 2
        window.blit(self.orange,orange_rect)                           # < HERE

我将对此进行重新处理,以仅使用单个矩形:

WINDOW_WIDTH=500
WINDOW_HEIGHT=700

class Orange:
    def __init__(self,x,y,width,height,color):
        self.width = width
        self.height = height
        self.color = color
        self.speed = 6
        self.orange = pygame.image.load("Orange_1.png")
        self.orange = pygame.transform.scale(self.orange,(self.orange.get_width()//25, self.orange.get_height()//25))

        self.rect = self.orange.get_rect()   # get the rect, and set the position
        self.rect.x = x
        self.rect.y = y

    def draw( self ):
        pygame.draw.rect( window, self.color, self.rect)
        window.blit( self.orange, self.rect )

    def fall( self, amount ):
        self.rect.y += amount
        if ( self.rect.y > WINDOW_HEIGHT ):
            self.randomReset()  # restart at the top

    def randomReset( self ):
        """ Reposition the fruit somewhat randomly """
        self.speed += 1
        self.x = random.randint( self.rect.x, self.rect.x + self.rect.width)
        self.y = -self.rect.height   # start just off-screen
        # keep on-screen
        if ( self.x < 0 or self.x > WINDOW_WIDTH ):
            screen_eighth = WINDOW_WIDTH // 8
            self.x = random.randint( screen_eighth, WINDOW_WIDTH-screen_eighth )

当您编写面向对象的代码时,其中一个主要思想是代码中包含的数据是对象的“属性”,外部代码不应该触及Orange.x之类的内容。考虑到这一点,我创建了函数来支持Orange类上的必要操作

因此,与其打电话:

for Orange in oranges:
    Orange.y += playerman.speed

for Platform in platforms:
    if orange1.rect.colliderect(Platform.rect):
        orange1.speed += 1
        orange1.x = random.randint(Orange.rect.x,Orange.rect.x + Orange.rect.width)
        orange1.y = random.randrange(0, 1 + 12)

我们要求Orange类对自身进行更改,调用成员函数:

for Orange in oranges:
    Orange.fall( playerman.speed )

for Platform in platforms:
    if orange1.rect.colliderect( Platform.rect ):
        orange1.randomReset()

这会将所有Orange功能保留在类中。这有助于防止副作用的错误

相关问题 更多 >