привет я навичок в пайтон у меня проблема наверное с оптимезацыей

У меня есть полностью рабочий код для мини-шутера. Проблема в том, что игра иногда вылетает, и это полный рандом. По крайней мере, я не нашел причину. Может быть, стоит оптимизировать код, чтобы устранить возможные проблемы. Вполне возможно, что это проблема с компьютером. Поэтому я прикрепил код и файлы ниже, чтобы вы проверили у себя. Заранее спасибо

Код разделен на 2 файла с расширением .py

1 .py :

import pygame



class Button():
    def __init__(self, x, y, image, scale):
        width = image.get_width()
        height = image.get_height()
        self.image = pygame.transform.scale(image, (int(width * scale), int(height * scale)))
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.clicked = False

    def draw(self, surface):
        action = False

        pos = pygame.mouse.get_pos()


        if self.rect.collidepoint(pos):
            if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
                self.clicked = True
                action = True

        if pygame.mouse.get_pressed()[0] == 0:
            self.clicked = False


        surface.blit(self.image, (self.rect.x, self.rect.y))

        return action

2 .py :

from random import randint
from time import sleep

from pygame import *

import button

menu = True



mixer.init()
mixer.music.load('space.ogg')
mixer.music.play()
fire_sound = mixer.Sound('fire.ogg')



font.init()
font2 = font.SysFont("Arial", 36)



img_back = "galaxy.jpg"  
img_hero = "rocket.png"  
img_enemy = "ufo.png" 
img_bullet = "bullet.png" 
img_asteroid = "asteroid.png" 
img_explosion = "explosion.png" 



keys_img = image.load('button_keys.png')
keys_button = button.Button(60, 70, keys_img, 1.2)

black = image.load('gg.png')
blacks = button.Button(0, 0, black, 1.2)


start_img = image.load("button_resume.png")
start_button = button.Button( 40, 390, start_img, 1)





quit_img = image.load("button_quit.png")
quit_button = button.Button(500, 390, quit_img, 1)




score = 0  
lost = 0 

vol = 1.0



class GameSprite(sprite.Sprite):

    def __init__(self, player_image, player_x, player_y, size_x, size_y, player_speed):

        sprite.Sprite.__init__(self)


        self.image = transform.scale(
            image.load(player_image), (size_x, size_y))
        self.speed = player_speed



        self.rect = self.image.get_rect()
        self.rect.x = player_x
        self.rect.y = player_y



    def reset(self):
        window.blit(self.image, (self.rect.x, self.rect.y))



class Player(GameSprite):

    def update(self):
        keys = key.get_pressed()
        if keys[K_a] and self.rect.x > 5:
            self.rect.x -= self.speed
        if keys[K_d] and self.rect.x < win_width - 80:
            self.rect.x += self.speed


    def fire(self):
        bullet = Bullet(img_bullet, self.rect.centerx, self.rect.top, 15, 20, -40)
        bullets.add(bullet)



class Enemy(GameSprite):

    def update(self):
        self.rect.y += self.speed
        global lost

        if self.rect.y > win_height:
            self.rect.x = randint(80, win_width - 80)
            self.rect.y = 0
            lost = lost + 1


class Bullet(GameSprite):
   
    def update(self):
        self.rect.y += self.speed

        if self.rect.y < 0 :
            self.kill()








win_width = 700
win_height = 500
display.set_caption("Shooter")
window = display.set_mode((win_width, win_height))
background = transform.scale(image.load(img_back), (win_width, win_height))



ship = Player(img_hero, 5, win_height - 100, 80, 100, 10)

monsters = sprite.Group()
for q in range(1, 6):
    monster = Enemy(img_enemy, randint(80, win_width - 80), -40, 80, 50, randint(1, 5))
    monsters.add(monster)


asteroids = sprite.Group()
for w in range(1, 3):
    asteroid = Enemy(img_asteroid, randint(80, win_width - 80), -40, 80, 50, randint(1, 3))
    asteroids.add(asteroid)



bullets = sprite.Group()


finish = True


run = True 



pos_1 = 10, 20

pos_2 = 10, 50

sprit = True
while run: 
    if menu == True:
        mixer.music.pause()
        finish = True
        blacks.draw(window)
        keys_button.draw(window)
        if quit_button.draw(window):
            run = False

        if start_button.draw(window):
            
            finish = False
            menu = False

            monsters = sprite.Group()
            for q in range(1, 6):
                monster = Enemy(img_enemy, randint(80, win_width - 80), -40, 80, 50, randint(1, 5))
                monsters.add(monster)

     
            asteroids = sprite.Group()
            for w in range(1, 3):
                asteroid = Enemy(img_asteroid, randint(80, win_width - 80), -40, 80, 50, randint(1, 3))
                asteroids.add(asteroid)

            pos_1 = 10, 20

            pos_2 = 10, 50

            ship = Player(img_hero, 5, win_height - 100, 80, 100, 10)
            sprit = False

            background = transform.scale(image.load(img_back), (win_width, win_height))

    if menu == False:
            mixer.music.unpause()


  
    for z in event.get():
        if z.type == QUIT:
            run = False

        if z.type == KEYDOWN:

            if z.key == K_SPACE:

                fire_sound.play()
                ship.fire()




            if z.key == K_EQUALS:
                vol += 0.1
                mixer.music.set_volume(vol)
                print(mixer.music.get_volume())

            if z.key == K_MINUS:
                vol -= 0.1
                mixer.music.set_volume(vol)
                print(mixer.music.get_volume())

            if z.key == K_1:
                img_back = "galaxy.jpg"  
                background = transform.scale(image.load(img_back), (win_width, win_height))

                img_hero = "rocket.png"  
                ship = Player(img_hero, 5, win_height - 100, 80, 100, 10)

                img_enemy = "ufo.png"  
                monster = Enemy(img_enemy, randint(80, win_width - 80), -40, 80, 50, randint(1, 5))

                img_asteroid = "asteroid.png" 
                asteroid = Enemy(img_asteroid, randint(80, win_width - 80), -40, 80, 50, randint(1, 3))

            if z.key == K_2:
                pass



            if z.key == K_ESCAPE:
                score = 0
                lost = 0
                ship = Player(img_hero, 5, win_height - 100, 80, 100, 10)


                monsters = sprite.Group()
                for q in range(0, 0):
                    monsters.add(monster)


                asteroids = sprite.Group()
                for w in range(0, 0):
                    asteroids.add(asteroid)
                pos_1 = 1000, 2000

                pos_2 = 1000, 5000
                
                ship = Player(img_hero, 5, win_height - 10000, 80, 100, 10)


                menu = True







    if not finish:

 
        window.blit(background, (0, 0))


        text = font2.render("Сбито: " + str(score), 1, (255, 255, 255))
        window.blit(text, (pos_1))


        text_lose = font2.render("Упушено: " + str(lost), 1, (255, 255, 255))
        window.blit(text_lose, (pos_2))


        if score == 20:
            asus = font2.render("Win ESС - MENU", 1, (0, 255, 0))

            ship = Player(img_hero, 2000, 2500, 80, 100, 0)

            window.blit(asus ,(300, 250))
            sprit = True


        if  lost == 10:
            loser = font2.render("Lose! ESС - MENU", 1, (255, 0, 0))

            ship = Player(img_hero, 2000, 2500, 80, 100, 0)

            window.blit(loser ,(300, 250))

            sprit = True


        collides_player = sprite.spritecollide(ship, asteroids, True)


        for t in collides_player:
            ship = Player(img_explosion, 200, 250, 300, 300, 0)


            
            monsters = sprite.Group()
            for q in range(0, 0):
                monster = Enemy(img_enemy, randint(80, win_width - 80), -40, 80, 50, randint(1, 5))
                monsters.add(monster)

            
            asteroids = sprite.Group()
            for w in range(0, 0):
                asteroid = Enemy(img_asteroid, randint(80, win_width - 80), -40, 80, 50, randint(1, 3))
                asteroids.add(asteroid)
            

            losers = font2.render("Lose! ESС - MENU", 1, (255, 0, 0))
            window.blit(losers ,(300, 250))
 
            sprit = True




            finish = True


  
        collides_bull = sprite.groupcollide(monsters, bullets, True, True)
        
        for r in collides_bull:
            score = score + 1
            monster = Enemy(img_enemy, randint(80, win_width - 80), -40, 80, 50, randint(1, 5))
            monsters.add(monster)


        collides_bull2 = sprite.groupcollide(asteroids, bullets, False, True)





        ship.update()
        ship.reset()
        bullets.draw(window)
        bullets.update()
    if sprit == False:           
     

        monsters.update()
        asteroids.update()

     

        monsters.draw(window)
        asteroids.draw(window)



    display.update()
    
    
    time.delay(50)

ФОТКИ: https://drive.google.com/drive/folders/1N7uq81EoA0T_4obgnyTFD3jvGJo5eGjh?usp=share_link


Ответы (0 шт):