Facebook
From aa, 1 Month ago, written in Python.
Embed
Download Paste or View Raw
Hits: 138
  1. import pygame
  2. import random
  3. import pygame.font
  4.  
  5.  
  6. pygame.init()
  7.  
  8. win_width = 500
  9. win_height = 500
  10.  
  11. bg = pygame.image.load("image.png")
  12.  
  13. bg = pygame.transform.scale(bg, (win_width, win_height))
  14.  
  15. clock = pygame.time.Clock()
  16.  
  17. window = pygame.display.set_mode((win_width, win_height))
  18. window_rect = window.get_rect()
  19.  
  20. pygame.display.set_caption("Arcanoid")
  21.  
  22. class GameSprite(pygame.sprite.Sprite):
  23.     def __init__(self, new_image, x, y, width, height) -> None:
  24.         super().__init__()
  25.         self.image = pygame.transform.scale(pygame.image.load(new_image), (width, height))
  26.         self.rect = self.image.get_rect()
  27.         self.rect.x = x
  28.         self.rect.y = y
  29.     def show(self):
  30.         window.blit(self.image, (self.rect.x, self.rect.y))
  31.  
  32. class Platform(pygame.sprite.Sprite):
  33.     def __init__(self, x, y, width, height, speed) -> None:
  34.         super().__init__()
  35.         self.image = pygame.Surface([width, height])
  36.         self.image.fill('black')
  37.         self.rect = self.image.get_rect()
  38.         self.rect.x = x
  39.         self.rect.y = y
  40.         self.speed = speed
  41.         self.width = width
  42.     def update(self):
  43.         keys = pygame.key.get_pressed()
  44.         if keys[pygame.K_a] and self.rect.x > 0:
  45.             self.rect.x -= self.speed
  46.         if keys[pygame.K_d] and self.rect.x < win_width - self.width:
  47.             self.rect.x += self.speed
  48.     def show(self):
  49.         window.blit(self.image, (self.rect.x, self.rect.y))
  50.  
  51. class Enemy(GameSprite):
  52.     def __init__(self, new_image, x, y, width, height) -> None:
  53.         super().__init__(new_image, x, y, width, height)
  54.  
  55. class Ball(GameSprite):
  56.     def __init__(self, new_image, x, y, width, height, speed) -> None:
  57.         super().__init__(new_image, x, y, width, height)
  58.         self.velocity = [speed, -speed]
  59.  
  60.     def update(self):
  61.         # Проверяем столкновение мяча с платформой
  62.         if self.rect.colliderect(platform.rect):
  63.             # Определяем, где произошло столкновение
  64.             relative_hit_position = self.rect.centerx - platform.rect.left
  65.             # Нормализуем позицию относительно ширины платформы
  66.             normalized_hit_position = relative_hit_position / platform.rect.width
  67.             # Преобразуем в диапазон от 0 до 1
  68.             normalized_hit_position = max(0, min(1, normalized_hit_position))
  69.             # Вычисляем коэффициент, на который нужно изменить скорость мяча в зависимости от места удара
  70.             inertia_factor = normalized_hit_position * 0.5 + 0.5  # от 0.5 до 1.0
  71.             # Применяем инерцию к вертикальной скорости мяча
  72.             self.velocity[1] = -self.velocity[1] * inertia_factor
  73.         if pygame.sprite.spritecollideany(self, enemies, True):
  74.             self.velocity[1] = not self.velocity[1]
  75.         if self.rect.colliderect(window_rect.left) or self.rect.colliderect(window_rect.right):
  76.             self.velocity[0] = not self.velocity[0]
  77.         # Двигаем мяч
  78.         self.rect.x += self.velocity[0]
  79.         self.rect.y += self.velocity[1]
  80.  
  81. enemies = pygame.sprite.Group()
  82.  
  83. def spawn_enemy():
  84.     for _ in range(5):
  85.         enemies.add(Enemy(random.choice([10, win_width - 10]), random.randint(int(win_height/2), win_height - 200), 80, 80, 2))
  86.  
  87.  
  88. platform = Platform(win_width/2, win_height * 0.8, 100, 20, 8)
  89.  
  90. score = 0
  91.  
  92. finish = False
  93.  
  94. paused = True
  95.  
  96. game_over_text = ''
  97.  
  98. font = pygame.font.SysFont(None, 36)
  99.  
  100. exit = False
  101.  
  102. while not exit:
  103.     for event in pygame.event.get():  
  104.         if event.type == pygame.QUIT:
  105.             exit = True
  106.         if event.type == pygame.KEYUP:
  107.             if event.key == pygame.K_ESCAPE and not finish:
  108.                 paused = not paused  # Toggle the paused state
  109.             if event.key == pygame.K_r and finish:
  110.                 platform.rect.x = win_width/2
  111.                 platform.rect.y = win_height/2 + 30
  112.                 score = 0
  113.                 enemies_passed = 0
  114.                 enemies.empty()
  115.                 finish = False
  116.     window.blit(bg, (0, 0))
  117.  
  118.     if not finish and not paused:
  119.         platform.update()
  120.         enemies.update()
  121.  
  122.     platform.show()
  123.     enemies.draw(window)
  124.  
  125.     if finish:
  126.         canavs_rect = window.get_rect()
  127.         window.blit(game_over_text, (canavs_rect.centerx - 200, canavs_rect.centery))
  128.     if paused:
  129.         canavs_rect = window.get_rect()
  130.         window.blit(font.render('Гру зупинено!', True, (255,255,255)), (canavs_rect.centerx - 100, canavs_rect.centery))
  131.         window.blit(font.render('Натисніть ESC для продовження.', True, (255,255,255)), (canavs_rect.centerx - 200, canavs_rect.centery + 40))
  132.  
  133.     pygame.display.update()
  134.     clock.tick(60)