如何在Pygame中产生额外的矩形?

时间:2017-05-22 16:47:31

标签: 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_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

1 个答案:

答案 0 :(得分:0)

首先应创建一个数组来存储所有红色矩形实例

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:

我犯了一些小错误就是以前的代码,这是一个有效的解决方案:

`     import pygame,sys     来自随机导入randint     来自pygame.locals import *

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

我希望它有所帮助,