Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3315024
А
Аноним
23 августа 2025 13:14 · публичный вопрос
А
Аноним

Напиши мне игру где курица должна убегать от машин на пайтоне с помощью библиотеки пайгейм

Ответ нейросети
23 августа 2025 13:14

Отличная задача для практики: сделаем простую игру на Pygame, где курица должна убегать от машин. Ниже сначала подробное объяснение по шагам, затем полный рабочий код. Это подходит для уровня средней школы: понятные классы, понятная логика и минималистичный графический стиль без внешних файлов.

Чего мы добиваемся

  • Курица (player) управляется стрелками (или WASD).
  • Машины (cars) движутся по нескольким «полосам» слева направо.
  • Если курица столкнулaсь с машиной — игра заканчивается.
  • Если курица достигает верха экрана — игрок выигрывает.
  • Добавим простой счётчик времени/очков и возможность перезапускать игру.

Пошаговый план

  1. Подготовка окружения
  • Импортируем pygame, инициализируем и создаём экран нужного размера.
  • Определяем базовые константы: размеры, скорости, цвета.
  1. Фигуры и классы
  • Класс Chicken: хранит положение курицы, размеры и метод движения внутри границ экрана.
  • Класс Car: прямоугольник машины, скорость, направление; метод обновления положения.
  1. Логика движения и препятствий
  • Машины порождаются на экране слева и движутся вправо по выбранной полосе.
  • У каждой полосы может быть своя скорость; можно варьировать.
  • Проверяем столкновение курицы с машинами.
  1. Победа и проигрыш
  • Победа: курица достигает верхней границы.
  • Проигрыш: столкновение с машиной.
  • В конце можно показывать сообщение и ждать нажатия R для рестарта.
  1. Отрисовка и цикл игры
  • Рисуем фон, дорожки/полосы, курицу и машины.
  • Обновляем экран и ограничиваем FPS.

Полный рабочий код (Python, Pygame)

import pygame
import random
import sys

# 1) Инициализация и константы
pygame.init()

WIDTH, HEIGHT = 800, 600
SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Курица против машин — Пайгейм")

# Цвета
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
YELLOW = (255, 230, 0)
RED = (200, 0, 0)
GRAY = (50, 50, 50)
GREEN = (0, 200, 0)

# Таймер и шрифты
clock = pygame.time.Clock()
FONT = pygame.font.SysFont(None, 36)

# Курица параметры
CHICKEN_W, CHICKEN_H = 40, 40
CHICKEN_SPEED = 5

# Машины параметры
CAR_W, CAR_H = 60, 40
CAR_MIN_SPEED, CAR_MAX_SPEED = 3, 6

# Линии дорог (горизонтальные полосы)
LANE_Y = [480, 420, 360, 300, 240]  # позиции по вертикали (от верхнего края вниз)

# 2) Классы
class Chicken:
    def __init__(self, x, y):
        self.rect = pygame.Rect(x, y, CHICKEN_W, CHICKEN_H)

    def move(self, dx, dy):
        self.rect.x += dx
        self.rect.y += dy
        # Ограничиваем выход за границы экрана
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.top < 0:
            self.rect.top = 0
        if self.rect.bottom > HEIGHT:
            self.rect.bottom = HEIGHT

    def draw(self, surface):
        # Простая курица: желтый прямоугольник
        pygame.draw.rect(surface, YELLOW, self.rect)
        # Годится добавить клюв/глаза, если хочется
        # Клюв
        pygame.draw.polygon(surface, (255, 140, 0), [
            (self.rect.right, self.rect.centery),
            (self.rect.right + 6, self.rect.centery - 4),
            (self.rect.right + 6, self.rect.centery + 4)
        ])

class Car:
    def __init__(self, x, y, speed, direction=1):
        self.rect = pygame.Rect(x, y, CAR_W, CAR_H)
        self.speed = speed
        self.direction = direction  # 1 — вправо, -1 — влево (для вариативности можно добавить)

    def update(self):
        self.rect.x += self.speed * self.direction

    def is_off_screen(self):
        return self.rect.left > WIDTH or self.rect.right < 0

    def draw(self, surface):
        pygame.draw.rect(surface, RED, self.rect)

# 3) Вспомогательные функции
def reset_game():
    # Создаем курицу внизу экрана по центру
    chicken = Chicken(WIDTH // 2 - CHICKEN_W // 2, HEIGHT - CHICKEN_H - 10)
    cars = []
    return chicken, cars

def spawn_car(lane_y):
    # Машина появляется слева и движется вправо
    x = -CAR_W - random.randint(0, 60)
    speed = random.randint(CAR_MIN_SPEED, CAR_MAX_SPEED)
    car = Car(x, lane_y - CAR_H // 2, speed, direction=1)
    return car

def draw_road(surface):
    # Фон дороги и полосы
    surface.fill(GREEN)  # трава снизу
    # дорога
    road_height = 5
    road_y = 0
    pygame.draw.rect(surface, (50, 50, 50), (0, 0, WIDTH, HEIGHT))  # темная основа
    # Нарисуем дорожные полосы
    for y in LANES_Y:
        pygame.draw.line(surface, WHITE, (0, y), (WIDTH, y), 2)

def render_text(surface, text, pos, color=WHITE):
    img = FONT.render(text, True, color)
    surface.blit(img, pos)

# 4) Инициализация игры
chicken, cars = reset_game()
SPAWN_EVENT = pygame.USEREVENT + 1
pygame.time.set_timer(SPAWN_EVENT, 900)  # каждые 900 мс создаём машину

game_over = False
won = False
start_ticks = pygame.time.get_ticks()

# 5) Основной цикл
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == SPAWN_EVENT and not game_over and not won:
            lane_index = random.randint(0, len(LANE_Y) - 1)
            lane_y = LANES_Y[lane_index]
            cars.append(spawn_car(lane_y))
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r:
                # Рестарт
                chicken, cars = reset_game()
                game_over = False
                won = False
                start_ticks = pygame.time.get_ticks()
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                sys.exit()

    keys = pygame.key.get_pressed()
    if not game_over and not won:
        dx = dy = 0
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            dx = -CHICKEN_SPEED
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            dx = CHICKEN_SPEED
        if keys[pygame.K_UP] or keys[pygame.K_w]:
            dy = -CHICKEN_SPEED
        if keys[pygame.K_DOWN] or keys[pygame.K_s]:
            dy = CHICKEN_SPEED
        chicken.move(dx, dy)

        # Обновление машин
        for car in cars:
            car.update()
        # Удаление вылетевших машин
        cars = [c for c in cars if not c.is_off_screen()]

        # Проверка столкновений
        for car in cars:
            if chicken.rect.colliderect(car.rect):
                game_over = True
                break

        # Победа: курица достигла верхней границы
        if chicken.rect.top <= 0:
            won = True

    # 6) Рендеринг
    draw_road(SCREEN)

    # Рисуем дорожную разметку внутри дороги
    for y in LANES_Y:
        pygame.draw.line(SCREEN, WHITE, (0, y), (WIDTH, y), 2)

    # Рисуем курицу и машины
    chicken.draw(SCREEN)
    for car in cars:
        car.draw(SCREEN)

    # HUD
    elapsed_sec = max(0, (pygame.time.get_ticks() - start_ticks) // 1000)
    render_text(SCREEN, f"Time: {elapsed_sec}s", (10, 10), WHITE)

    if game_over:
        render_text(SCREEN, "Game Over! Press R to restart", (WIDTH // 2 - 180, HEIGHT // 2 - 20), WHITE)
    if won:
        render_text(SCREEN, "You Won! Press R to restart", (WIDTH // 2 - 190, HEIGHT // 2 - 20), WHITE)

    render_text(SCREEN, "Controls: Arrow keys or WASD to move", (10, HEIGHT - 40), WHITE)

    pygame.display.flip()
    clock.tick(60)

Как запустить код

  1. Установите Pygame:
    • pip install pygame
  2. Сохраните код в файл, например, chicken_game.py.
  3. Запустите:
    • python chicken_game.py
  4. Управление: стрелки или WASD. Достигните верхней части экрана — победа. Если столкнётесь с машиной — перезапуск кнопкой R.

Дополнительные идеи для обучения и улучшения

  • Добавить уровни: скорость машин возрастает после каждого пройденного этапа.
  • Добавить звук (если добавить аудиофайлы).
  • Добавить разные визуальные спрайты для курицы и машин, чтобы улучшить восприятие.
  • Сделать разные направления движения машин по полосам (часть полос движется слева направо, часть — справа налево).

Если хочешь, могу адаптировать игру под конкретный уровень класса или сделать проще/сложнее, добавить функции подсказок или сохранить рекорды.