from pygame import * #класс-родитель для других спрайтов class GameSprite(sprite.Sprite): # конструктор класса def __init__(self, player_image, player_x, player_y, size_x, size_y): # Вызываем конструктор класса (Sprite): super().__init__() # каждый спрайт должен хранить свойство image - изображение self.image = transform.scale(image.load(player_image), (size_x, size_y)) # каждый спрайт должен хранить свойство rect - прямоугольник, в который он вписан 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 __init__(self, player_x_speed, player_y_speed, *arg): # Вызываем конструктор класса (Sprite): super().__init__(*arg) self.x_speed = player_x_speed self.y_speed = player_y_speed def update(self): ''' перемещает персонажа, применяя текущую горизонтальную и вертикальную скорость''' # сначала движение по горизонтали if packman.rect.x <= win_width - 80 and packman.x_speed > 0 or packman.rect.x >= 0 and packman.x_speed < 0: self.rect.x += self.x_speed # если зашли за стенку, то встанем вплотную к стене platforms_touched = sprite.spritecollide(self, barriers, False) if self.x_speed > 0: # идем направо, правый край персонажа - вплотную к левому краю стены for p in platforms_touched: self.rect.right = min( self.rect.right, p.rect.left ) # если коснулись сразу нескольких, то правый край - минимальный из возможных elif self.x_speed < 0: # идем налево, ставим левый край персонажа вплотную к правому краю стены for p in platforms_touched: self.rect.left = max( self.rect.left, p.rect.right ) # если коснулись нескольких стен, то левый край - максимальный if packman.rect.y <= win_height - 80 and packman.y_speed > 0 or packman.rect.y >= 0 and packman.y_speed < 0: self.rect.y += self.y_speed # если зашли за стенку, то встанем вплотную к стене platforms_touched = sprite.spritecollide(self, barriers, False) if self.y_speed > 0: # идем вниз for p in platforms_touched: self.y_speed = 0 # Проверяем, какая из платформ снизу самая высокая, выравниваемся по ней, запоминаем её как свою опору: if p.rect.top < self.rect.bottom: self.rect.bottom = p.rect.top elif self.y_speed < 0: # идем вверх for p in platforms_touched: self.y_speed = 0 # при столкновении со стеной вертикальная скорость гасится self.rect.top = max( self.rect.top, p.rect.bottom ) # выравниваем верхний край по нижним краям стенок, на которые наехали #класс спрайта-врага class Enemy(GameSprite): def __init__(self,player_speed, *arg ): # Вызываем конструктор класса (Sprite): super().__init__(*arg) #движение врага def update(self): pass #Создаем окошко win_width = 700 win_height = 500 display.set_caption("Лабиринт") window = display.set_mode((win_width, win_height)) back = (119, 210, 223) #задаем цвет согласно цветовой схеме RGB #создаем группу для стен barriers = sprite.Group() #создаем группу для монстров monsters = sprite.Group() #создаем стены картинки w1 = GameSprite('platform2.png', win_width / 2 - win_width / 3, win_height / 2, 300, 50) w2 = GameSprite('platform2_v.png', 370, 100, 50, 400) #добавляем стены в группу barriers.add(w1) barriers.add(w2) #создаем спрайты packman = Player('hero.png', 5, win_height - 80, 80, 80, 0, 0) final_sprite = GameSprite('pac-1.png', win_width - 85, win_height - 100, 80, 80) monster1 = Enemy('cyborg.png', win_width - 80, 150, 80, 80, 5) monster2 = Enemy('cyborg.png', win_width - 80, 230, 80, 80, 5) #добавляем монстра в группу monsters.add(monster1) monsters.add(monster2) #переменная, отвечающая за то, как кончилась игра finish = False #игровой цикл run = True while run: #цикл срабатывает каждую 0.05 секунд time.delay(50) #перебираем все события, которые могли произойти for e in event.get(): if e.type == QUIT: run = False elif e.type == KEYDOWN: if e.key == K_LEFT: packman.x_speed = -5 elif e.key == K_RIGHT: packman.x_speed = 5 elif e.key == K_UP: packman.y_speed = -5 elif e.key == K_DOWN: packman.y_speed = 5 elif e.type == KEYUP: if e.key == K_LEFT: packman.x_speed = 0 elif e.key == K_RIGHT: packman.x_speed = 0 elif e.key == K_UP: packman.y_speed = 0 elif e.key == K_DOWN: packman.y_speed = 0 #проверка, что игра еще не завершена if not finish: #обновляем фон каждую итерацию window.fill(back) #закрашиваем окно цветом #запускаем движения спрайтов packman.update() bullets.update() #обновляем их в новом местоположении при каждой итерации цикла packman.reset() barriers.draw(window) final_sprite.reset() sprite.groupcollide(monsters, bullets, True, True) monsters.update() monsters.draw(window) sprite.groupcollide(bullets, barriers, True, False) #Проверка столкновения героя с врагом и стенами if sprite.spritecollide(packman, monsters, False): finish = True #вычисляем отношение img = image.load('game-over_1.png') d = img.get_width() // img.get_height() window.fill((255, 255, 255)) window.blit(transform.scale(img, (win_height * d, win_height)), (90, 0)) if sprite.collide_rect(packman, final_sprite): finish = True img = image.load('thumb.jpg') window.fill((255, 255, 255)) window.blit(transform.scale(img, (win_width, win_height)), (0, 0)) display.update()