Files
PL_2026/lab2/task2.py

161 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pygame
# Инициализация
pygame.init()
# Размеры окна
WIDTH, HEIGHT = 800, 500
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Северный пейзаж (По образцу)")
# --- Цвета ---
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
SKY_GRAY = (220, 220, 220) # Небо
SNOW_WHITE = (255, 255, 255) # Снег
COAT_BROWN = (90, 70, 50) # Темно-коричневая шуба
STRIP_BROWN = (60, 40, 30) # Полоски
HOOD_COLOR = (245, 245, 245) # Капюшон
SKIN_COLOR = (230, 215, 200) # Лицо
CAT_GRAY = (150, 150, 150) # Серый кот
FISH_BLUE = (80, 100, 180)
FISH_RED = (200, 50, 50)
PI = 3.14
def draw_igloo(surface, x, y):
radius = 160
# 1. Основной купол (белый)
pygame.draw.circle(surface, WHITE, (x, y), radius)
# Срезаем низ прямоугольником снега
pygame.draw.rect(surface, SNOW_WHITE, (x - radius, y, radius * 2, radius))
# 2. Контур
rect = (x - radius, y - radius, radius * 2, radius * 2)
pygame.draw.arc(surface, BLACK, rect, 0, PI, 2)
# 3. Сетка линий
# Горизонтальные дуги
pygame.draw.arc(surface, BLACK, (x - radius + 30, y - radius + 50, (radius - 30)*2, (radius - 50)*2), 0, PI, 1)
pygame.draw.arc(surface, BLACK, (x - radius + 10, y - radius + 100, (radius - 10)*2, (radius - 100)*2), 0, PI, 1)
# Вертикальная линия по центру
pygame.draw.line(surface, BLACK, (x, y - radius), (x, y), 1)
# Боковые линии (дугами)
pygame.draw.arc(surface, BLACK, (x - 100, y - radius, 80, radius*2), PI/2, PI, 1)
pygame.draw.arc(surface, BLACK, (x, y - radius, 80, radius*2), 0, PI/2, 1)
def draw_chukcha(surface, x, y):
# x, y - координаты низа шубы
# 1. Палка (тонкая линия слева)
pygame.draw.line(surface, BLACK, (x - 70, y - 10), (x - 70, y - 150), 2)
# 2. Ноги (Вертикальные овалы ПОД телом)
# Сделаем их темными
pygame.draw.ellipse(surface, STRIP_BROWN, (x - 25, y, 20, 35)) # Левая
pygame.draw.ellipse(surface, STRIP_BROWN, (x + 5, y, 20, 35)) # Правая
# 3. Тело (Трапеция)
# Делаем тело чуть выше, чтобы голова поднялась
body_height = 70
body_points = [
(x - 30, y - body_height), # Плечи лево
(x + 30, y - body_height), # Плечи право
(x + 55, y), # Низ право
(x - 55, y) # Низ лево
]
pygame.draw.polygon(surface, COAT_BROWN, body_points)
# Полоски
pygame.draw.rect(surface, STRIP_BROWN, (x - 55, y - 10, 110, 10)) # Низ
pygame.draw.rect(surface, STRIP_BROWN, (x - 5, y - body_height, 10, body_height)) # Центр
# 4. Руки (Овалы по бокам)
pygame.draw.ellipse(surface, COAT_BROWN, (x - 75, y - 50, 40, 20)) # Левая
pygame.draw.ellipse(surface, COAT_BROWN, (x + 35, y - 50, 40, 20)) # Правая
# 5. Голова
# Центр головы выше плеч
head_y = y - body_height - 15
# Капюшон (белый круг)
pygame.draw.circle(surface, HOOD_COLOR, (x, head_y), 38)
# Лицо (бежевое)
pygame.draw.circle(surface, SKIN_COLOR, (x, head_y), 24)
# ЛИЦО
# Глаза (прищуренные палочки \ /), ПОДНЯТЫ ВЫШЕ
eye_y = head_y - 5
pygame.draw.line(surface, BLACK, (x - 20, eye_y - 3), (x - 4, eye_y + 3), 2)
pygame.draw.line(surface, BLACK, (x + 4, eye_y + 3), (x + 20, eye_y - 3), 2)
# Рот (дуга вниз), ОПУЩЕН НИЖЕ (чтобы не касался глаз)
mouth_y = head_y + 10
pygame.draw.arc(surface, BLACK, (x - 8, mouth_y, 23, 16), 0, PI, 3)
def draw_cat(surface, x, y):
# Координаты x, y - центр тела
# Хвост (толстый, справа)
pygame.draw.ellipse(surface, CAT_GRAY, (x + 40, y - 5, 60, 20))
# Лапки (СНИЗУ, вертикальные маленькие овалы)
# Задние
pygame.draw.ellipse(surface, CAT_GRAY, (x + 20, y + 15, 12, 30))
pygame.draw.ellipse(surface, CAT_GRAY, (x + 35, y + 15, 12, 30))
# Передние
pygame.draw.ellipse(surface, CAT_GRAY, (x - 10, y + 15, 12, 30))
pygame.draw.ellipse(surface, CAT_GRAY, (x - 25, y + 15, 12, 30))
# Туловище (Овал)
pygame.draw.ellipse(surface, CAT_GRAY, (x - 30, y - 10, 90, 40))
# Голова (Круг слева)
pygame.draw.circle(surface, CAT_GRAY, (x - 35, y + 5), 22)
# Уши
pygame.draw.polygon(surface, CAT_GRAY, [(x - 45, y - 10), (x - 50, y - 20), (x - 35, y - 15)])
pygame.draw.polygon(surface, CAT_GRAY, [(x - 25, y - 15), (x - 20, y - 20), (x - 15, y - 10)])
# Глаза (Белые круги + точки)
pygame.draw.circle(surface, WHITE, (x - 42, y + 2), 5)
pygame.draw.circle(surface, BLACK, (x - 42, y + 2), 2)
pygame.draw.circle(surface, WHITE, (x - 28, y + 2), 5)
pygame.draw.circle(surface, BLACK, (x - 28, y + 2), 2)
# Рыба
fx, fy = x - 55, y + 15
pygame.draw.ellipse(surface, FISH_BLUE, (fx, fy, 30, 12))
pygame.draw.polygon(surface, FISH_RED, [(fx, fy + 6), (fx - 8, fy), (fx - 8, fy + 12)])
# --- Запуск ---
running = True
clock = pygame.time.Clock()
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Фон (горизонт посередине иглу)
horizon = 220
pygame.draw.rect(screen, SKY_GRAY, (0, 0, WIDTH, horizon))
pygame.draw.rect(screen, SNOW_WHITE, (0, horizon, WIDTH, HEIGHT - horizon))
# Иглу
draw_igloo(screen, 320, horizon)
# Чукча (справа, висит в воздухе чуть выше низа экрана, как на рисунке)
draw_chukcha(screen, 650, 350)
# Кот (слева внизу)
draw_cat(screen, 180, 400)
pygame.display.flip()
clock.tick(60)
pygame.quit()