pygame 矩形绘制问题

问题遇到的现象和发生背景

使用pygame画移动的矩形时想要实现:当矩形碰到边界时,矩形改变颜色并保留。

我的解答思路和尝试过的方法

在触碰边界时,矩形改变为负速度并转向的条件下加入随机改变颜色,但是不知道该颜色如何保留

我想要达到的结果

当矩形碰到边界时,矩形改变颜色并保留。

以下是我的代码

import pygame,sys
from pygame.locals import *
import random
pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption('game')
#矩形的初始位置
pos_x = 300
pos_y = 250
val_x = 2
val_y = 1
#退出游戏快捷键设置
while True:
    for event in pygame.event.get():
        if event.type in (QUIT,KEYDOWN):
            sys.exit()
    screen.fill((255,255,255))
#矩形绘制参数设置
    color = 0,0,0
    pos= pos_x,pos_y,50,50
    width =8
    pos_x += val_x
    pos_y += val_y

#检验矩形是否触碰边界
    if pos_x >750 or pos_x <0:
        val_x = -val_x
#这是我尝试的解决方法
       ** color = ((random.randint(1, 255), random.randint(1, 255), random.randint(1, 255)))**
    if pos_y >550 or pos_y < 0:
        val_y = -val_y
       ** color= ((random.randint(1, 255), random.randint(1, 255), random.randint(1, 255)))**

    pygame.draw.rect(screen, color, pos, width)
    pygame.display.update()


你可以在检测矩形是否触碰边界的 if 语句中,对矩形的颜色进行修改。

  • 可以在矩形触碰到右边界时,使用随机颜色修改矩形的颜色,并在后续的迭代中保留这个颜色,如下代码:
import pygame,sys
from pygame.locals import *
import random

pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption('game')

# 矩形的初始位置和移动方向
pos_x = 300
pos_y = 250
val_x = 2
val_y = 1

# 矩形的初始颜色
color = (0, 0, 0)

while True:
    for event in pygame.event.get():
        if event.type in (QUIT, KEYDOWN):
            sys.exit()

    screen.fill((255,255,255))

    # 矩形绘制参数设置
    pos = pos_x, pos_y, 50, 50
    width = 8
    pos_x += val_x
    pos_y += val_y

    # 检测矩形是否触碰边界
    if pos_x > 750 or pos_x < 0:
        # 如果矩形触碰到右边界或左边界,改变矩形的颜色
        color = (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
        val_x = -val_x
    if pos_y > 550 or pos_y < 0:
        # 如果矩形触碰到上边界或下边界,改变矩形的颜色
        color = (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
        val_y = -val_y

    pygame.draw.rect(screen, color, pos, width)
    pygame.display.update()