2015-08-04 3 views
0

Я работаю над клоном Breakout/Arkanoid. Мой код работает нормально, но для каждого нового уровня я добавляю его медленнее и медленнее. Он написан на python 3.4.3 с модулем pygame. Извините за отсутствие комментариев. Я очень к этому знаком.Как уменьшить задержку в этом коде python?

import pygame 
import math 
import random 
pygame.init() 

# Global constants 
white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
orange = (255,128,0) 
yellow = (255,255,0) 
green = (0,255,0) 
blue = (0,0,255) 
indigo = (0,0,128) 
violet = (255,0,255) 

# global variables 
PAD_WIDTH = 100 
PAD_HI = 20 
TARGET_WIDTH = 40 
TARGET_HEIGHT = 20 
WIDTH = 21 
HEIGHT = 30 
DISPLAY = pygame.display.set_mode((WIDTH*TARGET_WIDTH, HEIGHT*TARGET_HEIGHT)) 
BALL_START_POS= [WIDTH//2,HEIGHT-15] 
clock = pygame.time.Clock() 
pygame.display.update() 
FPS = 60 




def dist(p, q): 
    return math.sqrt((p[0] - q[0]) ** 2 + (p[1] - q[1]) ** 2) 


class Ball: 

    def __init__(self): 
     self.x = (WIDTH*TARGET_WIDTH)//2 - 10 
     self.y = (HEIGHT*TARGET_HEIGHT) - 40 
     self.width = 20 
     self.height = 20 
     self.vel = [0,0] 
     self.color = white 
     self.stuck = True 

    def update(self): 
     self.x += self.vel[0] 
     self.y += self.vel[1] 
     if self.x > (WIDTH*TARGET_WIDTH) - self.width or self.x < 0: 
      self.vel[0] = -self.vel[0] 
     if self.y < 0: 
      self.vel[1] = -self.vel[1] 
     if self.y > (HEIGHT*TARGET_HEIGHT) - self.height-10: 
      self.stuck = True 

    def fire_ball(self, vel): 
     self.vel = vel 
     self.stuck = False 

    def collide(self, other_object): 
     if self.rect.colliderect(other_object.rect):    
      self.vel[1] = -self.vel[1] 

    def draw(self): 
     pygame.draw.ellipse(DISPLAY, self.color, self.rect) 

    @property 
    def rect(self): 
     return pygame.Rect(self.x, self.y, self.width, self.height) 

class Paddle: 

    def __init__(self): 

     self.x = ((WIDTH*TARGET_WIDTH)//2)-(PAD_WIDTH//2) 
     self.y = (HEIGHT*TARGET_HEIGHT)-PAD_HI   
     self.vel = [0,0] 
     self.color = white 
     self.width = PAD_WIDTH 
     self.height = PAD_HI 

    def update(self): 
     self.x += self.vel[0] 

    def collide(self, other_object): 
     pass 

    def draw(self): 
     pygame.draw.rect(DISPLAY,white,self.rect) 

    def get_center(self): 
     return (self.x + PAD_WIDTH/2)-10 

    @property 
    def rect(self): 
     return pygame.Rect(self.x, self.y, self.width, self.height)  

class Target: 

    def __init__(self, x, y, color): 

     self.x = x 
     self.y = y 
     self.center = [self.x/2,self.y/2]   
     self.color = color 
     self.width = TARGET_WIDTH 
     self.height = TARGET_HEIGHT 

    def update(self): 
     pass 

    def collide(self, other_object): 
     if self.rect.colliderect(other_object.rect): 
      return True 

    def draw(self): 
     pygame.draw.rect(DISPLAY,white,self.rect) 
     pygame.draw.rect(DISPLAY,red,self.rect,1) 

    @property 
    def rect(self): 
     return pygame.Rect(self.x, self.y, self.width, self.height) 

def key_handler(): 
    global stuck_var 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       pad.vel[0]-=1 
      elif event.key == pygame.K_RIGHT: 
       pad.vel[0]+=1 
      elif event.key == pygame.K_SPACE: 
       if ball.stuck == True: 
        ball.fire_ball([pad.vel[0]/2,-0.5]) 

     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT: 
       pad.vel[0]=0 
      elif event.key == pygame.K_RIGHT: 
       pad.vel[0]=0 

def draw_handler(): 
    pad.draw() 
    pad.update() 
    ball.update() 
    ball.draw() 

    for target in targets: 
     target.draw() 

def collider(ball,thing): 
    if ball.collide(pad): 
     ball.vel[0] = -ball.vel[0] 
     ball.vel[1] = -ball.vel[1] 

def group_collider(ball,target_group): 
    for target in set(target_group): 
     if target.collide(ball): 
      target_group.remove(target) 
      for target in target_group: 
       ball.collide(target) 

def pad_wall(): 
    if pad.x <= 0: 
     pad.x = 0   
    if pad.x >= (WIDTH*TARGET_WIDTH) - PAD_WIDTH: 
     pad.x = (WIDTH*TARGET_WIDTH) - PAD_WIDTH 

def stuck(): 
    if ball.stuck == True: 
     ball.x = pad.get_center() 
     ball.y = (HEIGHT*TARGET_HEIGHT) - 40 

pad = Paddle() 
ball = Ball() 
targets = set([]) 
o = 'o' 
t = 't' 

levels = {1:[(o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o),], 

     2:[(o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,t,o,t,o,t,o,t,o,t,o,t,o,t,o,t,o,t,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o),], 

     3:[(o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,o,o), 
     (o,o,t,t,t,o,t,o,t,o,t,o,t,o,t,o,t,t,t,o,o), 
     (o,o,o,o,t,t,t,t,t,t,t,t,t,t,t,t,t,o,o,o,o), 
     (o,o,o,t,o,t,o,t,o,t,o,t,o,t,o,t,o,t,o,o,o), 
     (o,o,t,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,t,o,o), 
     (o,t,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,t,o), 
     (t,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,t), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o),], 

     4:[(o,o,o,o,o,o,o,t,o,t,o,t,o,t,o,o,o,o,o,o,o), 
     (o,o,o,o,o,t,o,t,o,t,o,t,o,t,o,t,o,o,o,o,o), 
     (o,o,o,o,o,t,o,o,o,o,o,o,o,o,o,t,o,o,o,o,o), 
     (o,o,o,t,t,o,o,t,t,t,t,t,t,t,o,o,t,t,o,o,o), 
     (o,o,o,o,o,o,t,t,t,t,t,t,t,t,t,o,o,o,o,o,o), 
     (o,o,t,t,o,t,t,t,o,o,o,o,o,t,t,t,o,t,t,o,o), 
     (o,o,o,o,o,t,t,o,o,o,o,o,o,o,t,t,o,o,o,o,o), 
     (o,o,o,o,o,t,t,o,o,o,o,o,o,o,t,t,o,o,o,o,o), 
     (o,o,t,t,o,t,t,t,o,o,o,o,o,t,t,t,o,t,t,o,o), 
     (o,o,o,o,o,o,t,t,t,t,t,t,t,t,t,o,o,o,o,o,o), 
     (o,o,o,t,t,o,o,t,t,t,t,t,t,t,o,o,t,t,o,o,o), 
     (o,o,o,o,o,t,o,o,o,o,o,o,o,o,o,t,o,o,o,o,o), 
     (o,o,o,o,o,t,o,t,o,t,o,t,o,t,o,t,o,o,o,o,o), 
     (o,o,o,o,o,t,o,t,o,t,o,t,o,t,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o), 
     (o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o),] 
      } 


level = 0 
def level_handler(): 
    global level,targets 
    level += 1 
    if level == 5: 
     level = 1 

    for pos in levels[level]: 
     for row in range(HEIGHT): 
      for column in range(WIDTH):      
       if levels[level][row][column]== t: 
        target = Target(column*TARGET_WIDTH,row*TARGET_HEIGHT, white)   
        targets.add(target) 

while True: 

    if not targets: 
     level_handler() 


    pad_wall() 
    stuck() 
    key_handler() 
    DISPLAY.fill(black) 
    draw_handler() 
    collider(ball,pad) 
    group_collider(ball,targets) 
    pygame.display.update() 
+0

То, что вы описываете, является временем выполнения, которое является квадратичным (или хуже) на уровне. У меня нет ни времени, ни желания пробираться через ваш код, но посмотрите на свои вложенные циклы. Можете ли вы реорганизовать так, чтобы как можно больше за один проход через ваши данные? –

+0

", но посмотрите на свои вложенные циклы. Можете ли вы реорганизовать так, чтобы как можно больше за один проход через ваши данные?" Я не понимаю, что вы имеете в виду рефакторинг. Я заметил, что по какой-то причине длина моих целей составляет 1020 вместо 34 на уровне 1, что на 30 раз больше, чем должно быть. Но я не понимаю, почему. – Medullan

ответ

0

ОК, ваши уровни 2-мерные (строки и столбцы). Затем, глядя на ваш level_handler, обратите внимание, как вы каким-то образом использовать 3 петли:

for pos in levels[level]: 
    for row in range(HEIGHT): 
     for column in range(WIDTH):  

Таким образом, для каждой строки в уровне, вы цикл по каждой строке и каждом столбце.

Так что просто удалите линию for pos in levels[level]:.

Смежные вопросы