Top.Mail.Ru
Ответы

Задача на 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() Хм… жизни есть, а как их можно потратить? Правильно! Ударяясь о стенки! Как только жизни закончатся – экран окрашивается в красный!

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Просветленный
2нед
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
 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

Добавлено отображение счетчика жизней в верхнем левом углу экрана
Реализовано изменение цвета экрана на красный при окончании жизней
Добавлено сообщение "ИГРА ОКОНЧЕНА" в центре экрана, когда игра заканчивается
Улучшена обработка нажатий клавиш, теперь персонаж останавливается при отпускании клавиш

Аватар пользователя
Просветленный
1мес

Сначала надо выпрямить базовую структуру обработки событий и движения, а потом уже прикручивать жизни и красные экраны. Иначе это будет просто нагромождение костылей поверх кривой основы.