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