Python 如何在Pygame中生成额外的矩形?
我正在制作一个简单的游戏,但我遇到了一个问题 游戏是这样的: “白色方块”吃“绿色方块” 问题:Python 如何在Pygame中生成额外的矩形?,python,python-3.x,random,pygame,Python,Python 3.x,Random,Pygame,我正在制作一个简单的游戏,但我遇到了一个问题 游戏是这样的: “白色方块”吃“绿色方块” 问题: 如何生成“新的红色方块”并在每次“白色方块”吃掉“绿色方块”时都留在屏幕上 代码如下: import pygame, sys from random import randint from pygame.locals import* pygame.init() gameDisplay = pygame.display.set_mode((800, 600)) pygame.display.set
如何生成“新的红色方块”并在每次“白色方块”吃掉“绿色方块”时都留在屏幕上 代码如下:
import pygame, sys
from random import randint
from pygame.locals import*
pygame.init()
gameDisplay = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Square-it")
clock = pygame.time.Clock()
"Green Square"
green_x = randint(10, 780)
green_y = randint(10, 580)
green_width = 15
green_height = 15
green_color = pygame.Color("green")
green = pygame.Rect(green_x, green_y, green_width, green_height)
"Red Square"
red_x = randint(20, 780)
red_y = randint(20, 580)
red_width = 10
red_height = 10
red_color = pygame.Color("red")
red = pygame.Rect(red_x, red_y, red_width, red_height)
"White Square"
white_x = 400
white_y = 300
white_width = 10
white_height = 10
white_color = pygame.Color("white")
white = pygame.Rect(white_x, white_y, white_width, white_height)
while True:
clock.tick(60)
gameDisplay.fill((0, 20, 5))
gameDisplay.fill(white_color, white)
gameDisplay.fill(green_color, green)
gameDisplay.fill(red_color, red)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
'''When White eats Green, Green regenerates'''
if white.colliderect(green):
green = pygame.Rect(randint(10, 780), randint(10, 580), green_width, green_height)
'''White Square Movement'''
keys = pygame.key.get_pressed()
if keys[K_LEFT]:
white.left = white.left - 10
if keys[K_RIGHT]:
white.right = white.right + 10
if keys[K_UP]:
white.top = white.top - 10
if keys[K_DOWN]:
white.bottom = white.bottom + 10
您应该首先创建一个数组来存储所有红色矩形实例
red_square_list = []
当白色矩形与绿色矩形碰撞时,应提取绿色矩形的x、y位置,并在此位置创建红色矩形的实例
为此,我建议使用类,但首先可以创建一个函数来创建一个红色矩形:
def create_red_square(x, y)
red_width = 10
red_height = 10
red_color = pygame.Color("red")
red = pygame.Rect(red_x, red_y, red_width, red_height)
return red
现在,每次白色与绿色碰撞时,必须提取绿色矩形位置,并使用上面的函数显示红色矩形:
if white.colliderect(green):
pos_x, pos_y = green.left, green.top
green = pygame.Rect(randint(10, 780), randint(10, 580), green_width, green_height)
red_square_list.append(create_red_square(pos_x, pos_y))
最后一行仅用于存储红色矩形,如果您以后想使用它们(就像您对绿色/白色矩形所做的那样)
我希望有帮助
编辑#1:
我犯的一些小错误是前面的代码,这是一个可行的解决方案:
`
导入pygame,sys
从随机导入randint
从pygame.locals导入*
red_square_list = []
pygame.init()
gameDisplay = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Square-it")
clock = pygame.time.Clock()
red_color = pygame.Color("red")
"Green Square"
green_x = randint(10, 780)
green_y = randint(10, 580)
green_width = 15
green_height = 15
green_color = pygame.Color("green")
green = pygame.Rect(green_x, green_y, green_width, green_height)
def create_red_square(x, y):
"""Return one instance of Rect at position x, y"""
red_width = 10
red_height = 10
red = pygame.Rect(x, y, red_width, red_height)
return red
"White Square"
white_x = 400
white_y = 300
white_width = 10
white_height = 10
white_color = pygame.Color("white")
white = pygame.Rect(white_x, white_y, white_width, white_height)
while True:
clock.tick(60)
gameDisplay.fill((0, 20, 5))
gameDisplay.fill(white_color, white)
gameDisplay.fill(green_color, green)
for each in red_square_list: #display all red rect
gameDisplay.fill(red_color, each)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
'''When White eats Green, Green regenerates'''
if white.colliderect(green):
# extract green rect position
pos_left, pos_top = green.left, green.top
# store the new red rectangle in the array
red_square_list.append(create_red_square(pos_left+2, pos_top+2))
# +2 is required as red square are 10x10 and green 15x15
# new rect green
new_left = randint(10, 780)
new_top = randint(10, 580)
green = pygame.Rect(new_left, new_top, green_width, green_height)
'''White Square Movement'''
keys = pygame.key.get_pressed()
if keys[K_LEFT]:
white.left = white.left - 10
if keys[K_RIGHT]:
white.right = white.right + 10
if keys[K_UP]:
white.top = white.top - 10
if keys[K_DOWN]:
white.bottom = white.bottom + 10
我希望这会有所帮助,谢谢Nicolas M。感谢你的努力,不幸的是,我尝试了它,但它对我仍然不起作用:/有没有办法,当白色与绿色碰撞时,在屏幕上随机生成一个新的红色方块并保持其位置?对不起,我犯了两个错误(方块位置不正确,移动了2px),我忘了添加一个循环来显示它们并声明函数的颜色。现在它工作了!