Python 在多次冲突后追加项

Python 在多次冲突后追加项,python,arrays,list,pygame,Python,Arrays,List,Pygame,我该如何重新编码,以使块在第一次命中时被追加,而不是在命中五次后被追加/删除-每当我对这行代码进行任何小的编辑时,我的游戏部分就会消失 我试图创建一个变量,“easy\u block\u hits”,然后说,当easy\u block\u hits==5时,从列表中追加block,但它会使所有内容消失 easy_kept_blocks = [] for block in easy_blocks: if block.colliderect(ball)

我该如何重新编码,以使块在第一次命中时被追加,而不是在命中五次后被追加/删除-每当我对这行代码进行任何小的编辑时,我的游戏部分就会消失

我试图创建一个变量,“easy\u block\u hits”,然后说,当easy\u block\u hits==5时,从列表中追加block,但它会使所有内容消失

    easy_kept_blocks = []    
    for block in easy_blocks:    
        if block.colliderect(ball):
            speed[1] = -speed[1]
            easy_block_hits += 1

        else:
            easy_kept_blocks.append(block)
    easy_blocks = easy_kept_blocks
我尝试更改它和消除块行的示例

如果我试着把它重新表述给你

    easy_kept_blocks = []    
    for block in easy_blocks:    
        if block.colliderect(ball):
            speed[1] = -speed[1]
            easy_block_hits += 1

        elif easy_block_hits == 5:
            easy_kept_blocks.append(block)
    easy_blocks = easy_kept_blocks
蓝色的方块线消失了

这是完整的代码,我有一种感觉,如果你给我一个解决方案,它将不工作,所以可能它与我的代码的其余部分

#December 16, 2019
#Final Project - Breakout

#IMPORTING LIBRARIES-----
import pygame
import sys
import time

#INITIALIZING SCREEN SIZE-----
pygame.init()
screen_size = (597, 700)
screen = pygame.display.set_mode((screen_size),0)
pygame.display.set_caption("BREAKOUT")

#retrieve screen measurements
screen_w = screen.get_width()
screen_h = screen.get_height()

#retrieve position of center of screen
center_x = int(screen_w/2)
center_y = int(screen_h/2)

#COLOURS-----
WHITE = (255,255,255)
BLACK = (0, 0, 0)
GREEN = (0,255,0)
RED = (255,0,0)
BLUE = (0,0,255)
PURPLE = (154, 136, 180)

#BACKGROUND-----
screen.fill(BLACK)
pygame.display.update()


#PICTURES-----
background_image = pygame.image.load("space_background.png")
easy_block_image = pygame.image.load("easy_block.png")
medium_block_image = pygame.image.load("medium_block.png")
hard_block_image = pygame.image.load("hard_block.png")
metal_block_image = pygame.image.load("metal_block.png")
paddle_image = pygame.image.load("paddle.png")
ball_image = pygame.image.load("ball.png")
#title_image = pygame.image.load("S4.png")
#block/paddle/ball pictures were created on pixilart.com by myself
#background - https://www.wallpaperflare.com/dragon-flying-above-sky-artwork-wallpaper-181535
#title made from fontmeme.com

#SPEED-----
clock = pygame.time.Clock()
FPS = 60 #set frames per second
speed = [4,4]
paddle_speed = 6

#VARIABLES-----

#paddle
paddle_x = center_x
paddle_y = 600
paddle_w = 78
paddle_h = 10

paddle_dx = 0
paddle_dy = 0

#ball
ball_x = center_x
ball_y = center_y
ball_w = 12
ball_h = 12

#blocks
block_x = 5
block_w = 40
block_h = 10

#severity block positions
easy_block_y = 172
medium_block_y = 148
hard_block_y = 124
metal_block_y = 100

#severity block hits
easy_block_hits = 0

#lives displayed
lives_displayed_h = 10
lives_displayed_x = 4
lives_displayed_y = screen_h - (lives_displayed_h + 5)
lives_displayed_w = 79

#title
title_x = 5
title_y = 5
title_w = 240
title_h = 50

#test rect
rx = 0
ry = 700
rw = 700
rh = 1

#RECTS-----
paddle = pygame.Rect(paddle_x, paddle_y, paddle_w, paddle_h)
ball = pygame.Rect(ball_x, ball_y, ball_w, ball_h)
title = pygame.Rect(title_x, title_y, title_w, title_h)
lives_displayed_rect = pygame.Rect(lives_displayed_x,lives_displayed_y,lives_displayed_w,lives_displayed_h)
testrect = pygame.Rect(rx, ry, rw, rh)


#FUNCTIONS-----

#https://nerdparadise.com/programming/pygameblitopacity
def blit_alpha(target, source, location, opacity):
        x = location[0]
        y = location[1]
        temp = pygame.Surface((source.get_width(), source.get_height())).convert()
        temp.blit(target, (-x, -y))
        temp.blit(source, (0, 0))
        temp.set_alpha(opacity)        
        target.blit(temp, location)

#ARRAYS-----

#empty array to store rects for each block row of level
easy_blocks = []
medium_blocks = []
hard_blocks = []
metal_blocks = []
lives_displayed = []

#layout of blocks for each level
easy_block_array = [
"B B B B B B B B B B B B B B",
"B B B B B B B B B B B B B B",
]

medium_block_array = [
"P P P P P P P P P P P P P P",
"P P P P P P P P P P P P P P",
]

hard_block_array = [
"I I I I I I I I I I I I I I",
"I I I I I I I I I I I I I I",
]

metal_block_array = [
"G G G G G G G G G G G G G G",
"G G G G G G G G G G G G G G",
]

lives_displayed_array = [
"L L L",
]

#read the array and create the appropriate Rects FOR EACH LEVEL, store them in the walls array
for row in easy_block_array: #easy/blue
    for col in row:
        if col == "B":
            easy_block_rect = pygame.Rect(block_x, easy_block_y, block_w, block_h)
            easy_blocks.append(easy_block_rect)
        block_x += 21
    easy_block_y += 12
    block_x = 5

for row in medium_block_array: #medium/purple
    for col in row:
        if col == "P":
            medium_block_rect = pygame.Rect(block_x, medium_block_y, block_w, block_h)
            medium_blocks.append(medium_block_rect)
        block_x += 21
    medium_block_y += 12
    block_x = 5

for row in hard_block_array: #hard/pink
    for col in row:
        if col == "I":
            hard_block_rect = pygame.Rect(block_x, hard_block_y, block_w, block_h)
            hard_blocks.append(hard_block_rect)
        block_x += 21
    hard_block_y += 12
    block_x = 5

for row in metal_block_array: #metal/gray
    for col in row:
        if col == "G":
            metal_block_rect = pygame.Rect(block_x, metal_block_y, block_w, block_h)
            metal_blocks.append(metal_block_rect)
        block_x += 21
    metal_block_y += 12
    block_x = 5

for row in lives_displayed_array: #lives/paddle
    for col in row:
        if col == "L":
            lives_displayed_rect = pygame.Rect(lives_displayed_x, lives_displayed_y, lives_displayed_w, lives_displayed_h)
            lives_displayed.append(lives_displayed_rect)
        lives_displayed_x += 41
    lives_displayed_y += 12
    lives_displayed_x = 5

#LOOPS-----
intro_screen = False
game_screen = False
end_screen = False

#----------INTRO_SCREEN LOOP----------

#----------GAME_SCREEN LOOP----------
game = True
while game:
    for event in pygame.event.get():
        if event.type ==pygame.QUIT:
            game = False
            pygame.quit()
            sys.exit()
        #moving paddle with keys
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                paddle_dx = -paddle_speed
            elif event.key == pygame.K_RIGHT:
                paddle_dx = paddle_speed

    if event.type == pygame.KEYUP:
        paddle_dx = 0

    #constrain this loop to the specified FPS
    clock.tick(FPS)

    #PADDLE EVENTS-----

    #store old paddle positions
    old_paddle_x = paddle.x
    old_paddle_y = paddle.y

    #moving the paddle rect
    paddle.move_ip(paddle_dx, paddle_dy)

    #check to see if rect has left screen
    if paddle.left < 0 or paddle.right > screen_w:
        paddle.x = old_paddle_x

    #BALL EVENTS-----

    #moving ball
    ball = ball.move(speed)

    #collision bounce left & right
    if ball.left < 0 or ball.right > screen_w:
        speed[0] = -speed[0]

    #collision bounce top & bottom
    if ball.top < 0:
        speed[1] = -speed[1]

    #collision with bottom - life removed
    lives_displayed_kept = []
    for life in lives_displayed:
        if ball.bottom > screen_h:
            speed[1] = -speed[1]
        else:
            lives_displayed_kept.append(life)
    lives_displayed = lives_displayed_kept

    #collision of ball with paddle
    if paddle.colliderect(ball):
        speed[1] = -speed[1]

    #BLOCKS EVENTS-----

    #for blue (easy) blocks
    easy_kept_blocks = []    
    for block in easy_blocks:    
        if block.colliderect(ball):
            speed[1] = -speed[1]
            easy_block_hits += 1

        else:
            easy_kept_blocks.append(block)
    easy_blocks = easy_kept_blocks

    #for purple (medium) blocks
    medium_kept_blocks = []    
    for block in medium_blocks:    
        if block.colliderect(ball):
            speed[1] = -speed[1]
            easy_block_hits += 1
        else:
            medium_kept_blocks.append(block)
    medium_blocks = medium_kept_blocks

    #for pink (hard) blocks
    hard_kept_blocks = []    
    for block in hard_blocks:    
        if block.colliderect(ball):
            speed[1] = -speed[1]
        else:
            hard_kept_blocks.append(block)
    hard_blocks = hard_kept_blocks

    #for gray (metal) blocks
    metal_kept_blocks = []    
    for block in metal_blocks:    
        if block.colliderect(ball):
            speed[1] = -speed[1]
        else:
            metal_kept_blocks.append(block)
    metal_blocks = metal_kept_blocks

    #DRAWING/CREATING OBJECTS-----

    #removes screen trail
    screen.fill(BLACK)
    screen.blit(background_image, [0, 0])

    #drawing paddle/ball inside rect
    screen.blit(paddle_image, paddle)
    screen.blit(ball_image, ball)
    #screen.blit(title_image, title)

    #draws a block for each "B"
    for block in easy_blocks:
        screen.blit(easy_block_image, block)

    #draws a block for each "P"
    for block in medium_blocks:
        screen.blit(medium_block_image, block)

    #draws a block for each "I"
    for block in hard_blocks:
        screen.blit(hard_block_image, block)

    #draws a block for each "G"
    for block in metal_blocks:
        screen.blit(metal_block_image, block)

    #draws a paddle life for each "L"
    for life in lives_displayed:
        screen.blit(paddle_image, life)

    #----------END_SCREEN LOOP----------

    #updating the screen
    pygame.display.update()

pygame.quit()
sys.exit()
#2019年12月16日
#最终项目-突破
#导入库-----
导入pygame
导入系统
导入时间
#初始化屏幕大小-----
pygame.init()
屏幕大小=(597700)
screen=pygame.display.set_模式((屏幕大小),0)
pygame.display.set_标题(“突破”)
#检索屏幕测量值
screen\u w=screen.get\u width()
screen\u h=screen.get\u height()
#检索屏幕中心的位置
中心x=int(屏幕w/2)
中心y=int(屏幕h/2)
#颜色-----
白色=(255255)
黑色=(0,0,0)
绿色=(0255,0)
红色=(255,0,0)
蓝色=(0,0255)
紫色=(154136180)
#背景-----
屏幕填充(黑色)
pygame.display.update()
#照片-----
background\u image=pygame.image.load(“space\u background.png”)
easy\u block\u image=pygame.image.load(“easy\u block.png”)
medium\u block\u image=pygame.image.load(“medium\u block.png”)
hard\u block\u image=pygame.image.load(“hard\u block.png”)
metal\u block\u image=pygame.image.load(“metal\u block.png”)
palle_image=pygame.image.load(“palle.png”)
ball\u image=pygame.image.load(“ball.png”)
#title_image=pygame.image.load(“S4.png”)
#方块/桨/球的图片是我自己在pixilart.com上创作的
#背景-https://www.wallpaperflare.com/dragon-flying-above-sky-artwork-wallpaper-181535
#来自fontmeme.com的标题
#速度-----
clock=pygame.time.clock()
FPS=60#每秒设置帧数
速度=[4,4]
桨速=6
#变数-----
#划桨
桨叶_x=中心_x
桨叶y=600
桨叶w=78
桨叶h=10
桨叶_dx=0
桨叶直径=0
#球
球=中心
球=中心球
球w=12
球h=12
#块
块x=5
块w=40
块h=10
#严重阻塞位置
简易模块y=172
中段y=148
硬块y=124
金属块y=100
#严重性块命中
轻松锁定点击次数=0
#展示的生活
显示的寿命\u h=10
显示的生命数x=4
显示寿命=屏幕寿命-(显示寿命+5)
显示的生命w=79
#头衔
标题x=5
标题y=5
标题w=240
标题h=50
#测试矩形
rx=0
ry=700
rw=700
相对湿度=1
#直肠-----
桨=pygame.Rect(桨x,桨y,桨w,桨h)
ball=pygame.Rect(ball_x,ball_y,ball_w,ball_h)
title=pygame.Rect(title_x,title_y,title_w,title_h)
显示的生命=pygame.rect(显示的生命x、显示的生命y、显示的生命w、显示的生命h)
testrect=pygame.Rect(rx、ry、rw、rh)
#功能-----
#https://nerdparadise.com/programming/pygameblitopacity
def blit_alpha(目标、源、位置、不透明度):
x=位置[0]
y=位置[1]
temp=pygame.Surface((source.get_width(),source.get_height()).convert()
温度blit(目标,(-x,-y))
温度blit(源,(0,0))
温度设置α(不透明度)
目标.blit(温度、位置)
#阵列-----
#空数组,用于存储级别的每个块行的矩形
easy_blocks=[]
中_块=[]
硬块=[]
金属块=[]
显示的生命=[]
#每层的砌块布局
简易\u块\u数组=[
“B B B B B B B”,
“B B B B B B B”,
]
中等块数组=[
“P P P P P”,
“P P P P P”,
]
硬块数组=[
“我”,
“我”,
]
金属块阵列=[
“G G G G G G”,
“G G G G G G”,
]
生命\u显示\u数组=[
“L”,
]
#读取数组并为每个级别创建适当的矩形,将它们存储在walls数组中
对于easy_block_数组中的行:#easy/blue
对于行中的列:
如果列==“B”:
easy_block_rect=pygame.rect(block_x,easy_block_y,block_w,block_h)
easy_block.append(easy_block_rect)
块x+=21
简易块y+=12
块x=5
对于中等块数组中的行:#中等/紫色
对于行中的列:
如果col==“P”:
medium_block_rect=pygame.rect(block_x,medium_block_y,block_w,block_h)
中等块。追加(中等块)
块x+=21
中等块y+=12
块x=5
对于硬块数组中的行:#硬/粉红色
对于行中的列:
如果col==“I”:
hard_block_rect=pygame.rect(block_x,hard_block_y,block_w,block_h)
硬块。追加(硬块)
块x+=21
硬块y+=12
块x=5
对于金属块数组中的行:#金属/灰色
对于行中的列:
如果col==“G”:
metal_block_rect=pygame.rect(block_x,metal_block_y,block_w,block_h)
金属块。附加(金属块)
块x+=21
金属块y+=12
块x=5
对于显示的生命数组中的行:#生命/桨
对于行中的列:
如果列==“L”:
显示的生命=pygame.rect(显示的生命x、显示的生命y、显示的生命w、显示的生命h)
显示生命。追加(显示生命)
显示的生命数x+=41
显示的生命数y+=12
显示的生命数x=5
#循环-----
介绍屏幕=错误
游戏屏幕=错误
结束屏幕=错误
#----------介绍屏幕循环----------
#----------游戏屏幕循环----------
游戏=真实
游戏时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
游戏=错误
pygame.quit()
sys.exit()
#用键移动桨
elif event.type==pygame.KEYDOWN:
if event.key==

easy_block_counter = [0] * len(easy_blocks) # under ARRAYS

...
new_easy_block_counter = []
easy_kept_blocks = []    
for count, block in zip(easy_block_counter, easy_blocks):    
    if block.colliderect(ball):
        speed[1] = -speed[1]
        count += 1
    if count < 5:
        new_easy_block_counter.append(count)
        easy_kept_blocks.append(block)
easy_blocks = easy_kept_blocks
easy_block_counter = new_easy_block_counter