python - 如何在pygame的while循环中更改/获取矩形的值
问题描述
在我的游戏中,我试图让一个正在下降的矩形在三个列表中具有随机生成的颜色,并且每次生成一个新矩形时,颜色都会随机更改为列表中这三个中的一个。使用我现在拥有的代码,它会在这三种颜色之间快速循环,一次又一次地不停地循环。我还想弄清楚如何获取块的任何颜色并使相邻的相同颜色的块消失,但我没有运气尝试编写代码。
我尝试将颜色设置为 while 循环之外的变量,但它只从列表中随机选择一次颜色,并且不会再次更改。
解决方案
矩形列表是不够的。你也需要一个颜色列表。
colors = [red,green,blue]
colorChoice = random.choice(colors)
player = pygame.Rect(x,y,width,height)
copylist = []
colorList = []
每次产生新块时,都必须将当前颜色附加到颜色列表中,并且必须将当前矩形附加到块列表中。此外,必须设置新的随机颜色。
创建一个完成这项工作的函数并使用global
语句在全局范围内设置变量:
def newBlock():
global player, copylist, colorList, colorChoice
copylist.append(player.copy())
colorList.append(colorChoice)
player.y = 50
colorChoice = random.choice(colors)
调用newBlock
以生成一个新块并以其颜色绘制 ech 块:
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == moveDownEvent:
if player.y >= 390 or player.move(0, vel).collidelist(copylist) >= 0:
newBlock() # <--- spawn new block
else:
player.y += vel
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player.x > 168 and player.move(-vel, 0).collidelist(copylist) < 0:
player.x -= vel
if keys[pygame.K_RIGHT] and player.x < 330 and player.move(vel, 0).collidelist(copylist) < 0:
player.x += vel
if keys[pygame.K_DOWN] and player.y < 390:
if player.move(0, vel).collidelist(copylist) >= 0:
newBlock() # <--- spawn new block
else:
player.y += vel
win.fill((128,128,128))
pygame.draw.line(win,(0,0,0),(148,100),(148,410),2)
pygame.draw.line(win,(0,0,0),(350,100),(350,410),2)
pygame.draw.line(win,(0,0,0),(148,410),(350,410),2)
for i in range(len(copylist)):
pygame.draw.rect(win, colorList[i], copylist[i]) # <--- draw block with its color
pygame.draw.rect(win, colorChoice, player)
pygame.display.update()
clock.tick(24)
pygame.quit()
推荐阅读
- python - numpy 的负数 where 的预期效果是什么?
- python - 屏幕管理器中的屏幕更新
- algorithm - 如何计算机器学习训练计算时间,参考值是多少?
- vim - 如何防止在vim中保存文件
- excel - 在下拉按钮中从列表或表格中添加数据
- javascript - 输出空数组 - (异步)
- apache-spark - 在case语句中使用spark sql中的滞后
- visual-studio - Visual Studio 中是否有任何方法可以在提交时为注释添加前缀?
- sql-server - sql server 将兼容级别从 100 更改为 120
- testing - console.log(Wrapper.debug()) 没有显示反应组件