Game
2 years ago in Python
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()