Задача на Pygame
import pygame
pygame.init()
# Код, описывающий окно программы
width = 800 # Ширина окна
height = 800 # Высота окна
screen = pygame.display.set_mode([width, height])
# Создаём контроль FPS
clock = pygame.time.Clock() # Создаём таймер
FPS = 30 # Устанавливаем нужное значение FPS
# Игровые переменные, если надо, описываем в этом блоке
bg = pygame.image.load('bg.jpg') # Фоновое изображение
bg_x = 0
bg_y = 0
obj1_img = pygame.image.load('blue.png') # Изображение-объект
obj2_img = pygame.image.load('green.png') # Изображение-объект
x1 = 100
y1 = 100
x2 = 500
y2 = 250
X = 50
Y = 50
R = 20
X1 = 100
Y1 = 50
X2 = 150
Y2 = 50
width1 = 200 # Ширина первого объекта
height1 = 200 # Высота первого объекта
width2 = 200 # Ширина первого объекта
height2 = 200 # Высота первого объекта
speed1 = 10 # Скорость перемещения изображения-объекта
move_x = 0 # Флаг движения по Х: 0 - стоит, -1 - влево, 1 - вправо
move_y = 0 # Флаг движения по Y: 0 - стоит, -1 - вверх, 1 - вниз
BLUE = 0, 32, 255
# Игровой цикл и флаг выполнения программы
game_run = True
while game_run:
# БЛОК ОБРАБОТКИ СОБЫТИЙ ИГРЫ
for event in pygame.event.get():
if event.type == pygame.QUIT: # Закрыли окно?
game_run = False
if event.type == pygame.KEYDOWN: # Что-то нажали на клавиатуре?
# тут проверяем какие именно клавиши нажали
if event.key == pygame.K_UP:
move_y = -1
if event.key == pygame.K_DOWN:
move_y = 1
if event.key == pygame.K_RIGHT:
move_x = 1
if event.key == pygame.K_LEFT:
move_x = -1
x1 += speed1 * move_x
y1 += speed1 * move_y
if ((x1 >= x2 - height1) and (y2 - width1 <= y1 <= y2 + width2)):
x1 -= speed1 * move_x
y1 -= speed1 * move_y
move_x = 0
move_y = 0
x1 += speed1 * move_x
y1 += speed1 * move_y
if x1 <= 0:
x1 -= speed1 * move_x
if y1 <= 0:
y1 -= speed1 * move_y
if x1 <= 0:
x1 = speed1 * move_x
if y1 <= 0:
y1 = speed1 * move_y
move_x = 0
move_y = 0
# БЛОК ИГРОВОЙ ЛОГИКИ
# тут размещаем все вычисления
x1 += speed1 * move_x # Изменяем X координату объекта
y1 += speed1 * move_y # Изменяем Y координату объекта
move_x = 0 # Остановим движение
move_y = 0 # Остановим движение
# БЛОК ОТРИСОВКИ ОБЪЕКТОВ В ОКНЕ ПРОГРАММЫ
# тут закрашиваем фон и рисуем все объекты программы
screen.blit(bg, (bg_x, bg_y)) # Отобразим фоновое изображение
screen.blit(obj1_img, (x1, y1)) # Отобразим изображение-объект
screen.blit(obj2_img, (x2, y2)) # Отобразим изображение-объект
pygame.draw.circle (screen, BLUE, (X, Y), R)
pygame.draw.circle (screen, BLUE, (X1, Y1), R)
pygame.draw.circle (screen, BLUE, (X2, Y2), R)
# Отображение нарисованных объектов
pygame.display.flip()
# Контроль FPS
clock.tick(FPS)
pygame.quit() Хм… жизни есть, а как их можно потратить? Правильно! Ударяясь о стенки! Как только жизни закончатся – экран окрашивается в красный!
import pygame
pygame.init()
width = 800
height = 800
screen = pygame.display.set_mode([width, height])
clock = pygame.time.Clock()
FPS = 30
bg = pygame.image.load('bg.jpg')
bg_x = 0
bg_y = 0
obj1_img = pygame.image.load('blue.png')
obj2_img = pygame.image.load('green.png')
x1 = 100
y1 = 100
x2 = 500
y2 = 250
X = 50
Y = 50
R = 20
X1 = 100
Y1 = 50
X2 = 150
Y2 = 50
width1 = 200
height1 = 200
width2 = 200
height2 = 200
speed1 = 10
move_x = 0
move_y = 0
lives = 3
font = pygame.font.SysFont(None, 36)
BLUE = (0, 32, 255)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
game_over = False
game_run = True
while game_run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_run = False
if event.type == pygame.KEYDOWN and not game_over:
if event.key == pygame.K_UP:
move_y = -1
if event.key == pygame.K_DOWN:
move_y = 1
if event.key == pygame.K_RIGHT:
move_x = 1
if event.key == pygame.K_LEFT:
move_x = -1
if event.type == pygame.KEYUP:
if event.key in [pygame.K_UP, pygame.K_DOWN]:
move_y = 0
if event.key in [pygame.K_LEFT, pygame.K_RIGHT]:
move_x = 0
if not game_over:
new_x1 = x1 + speed1 * move_x
new_y1 = y1 + speed1 * move_y
collision_with_obj2 = (new_x1 + width1 >= x2 and new_x1 <= x2 + width2 and new_y1 + height1 >= y2 and new_y1 <= y2 + height2)
collision_with_wall = (new_x1 < 0 or new_x1 + width1 > width or
new_y1 < 0 or new_y1 + height1 > height)
if collision_with_obj2:
pass
elif collision_with_wall:
lives -= 1
if lives <= 0:
game_over = True
else:
x1 = new_x1
y1 = new_y1
if game_over:
screen.fill(RED)
else:
screen.blit(bg, (bg_x, bg_y))
screen.blit(obj1_img, (x1, y1))
screen.blit(obj2_img, (x2, y2))
pygame.draw.circle(screen, BLUE, (X, Y), R)
pygame.draw.circle(screen, BLUE, (X1, Y1), R)
pygame.draw.circle(screen, BLUE, (X2, Y2), R)
lives_text = font.render(f"Жизни: {lives}", True, WHITE)
screen.blit(lives_text, (10, 10))
if game_over:
game_over_text = font.render("ИГРА ОКОНЧЕНА", True, WHITE)
screen.blit(game_over_text, (width // 2 - 100, height // 2))
pygame.display.flip()
clock.tick(FPS)
pygame.quit()
Добавлены переменные для отслеживания жизней:
lives = 3 - начальное количество жизней
game_over - флаг окончания игры
Добавлены цвета (RED, WHITE) для отображения текста и экрана
Улучшен механизм обработки столкновений:
Теперь корректно проверяются столкновения со стенками и другим объектом
При столкновении со стенкой уменьшается количество жизней
Когда жизни заканчиваются, переменная game_over устанавливается в True
Добавлено отображение счетчика жизней в верхнем левом углу экрана
Реализовано изменение цвета экрана на красный при окончании жизней
Добавлено сообщение "ИГРА ОКОНЧЕНА" в центре экрана, когда игра заканчивается
Улучшена обработка нажатий клавиш, теперь персонаж останавливается при отпускании клавиш
Сначала надо выпрямить базовую структуру обработки событий и движения, а потом уже прикручивать жизни и красные экраны. Иначе это будет просто нагромождение костылей поверх кривой основы.