Глава 12 · Множество увлекательных мини-проектов!

Проект: пиксельная графика по сетке

Данные → алгоритм → графика: вложенный список решает, что нарисовать, а вложенный цикл — как.

Используем
nested listnested forTurtle
Уровень
★★★★ challenge
Результат
пиксельная графика

Что создаём

Мост между данными и графикой: матрица из нулей и единиц — и программа, которая рисует по ней картинку. 0 — пусто, 1 — закрашенный квадрат.

0
1
2
3
4
0
0
1
0
1
0
1
1
1
1
1
1
2
1
1
1
1
1
3
0
1
1
1
0
4
0
0
1
0
0
picture — вложенный список: 0 = пусто, 1 = закрашенный квадрат
setka_piksel_art.py
import turtle

screen = turtle.Screen()
screen.setup(width=360, height=360)
artist = turtle.Turtle()
artist.speed(0)
artist.hideturtle()
artist.penup()

picture = [
    [0, 1, 0, 1, 0],
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
    [0, 1, 1, 1, 0],
    [0, 0, 1, 0, 0],
]

razmer = 40
for row_index, row in enumerate(picture):
    for col_index, value in enumerate(row):
        if value == 1:
            x = -100 + col_index * razmer
            y = 100 - row_index * razmer
            artist.goto(x, y)
            artist.pendown()
            artist.fillcolor("#DB2777")
            artist.begin_fill()
            for _ in range(4):
                artist.forward(razmer)
                artist.right(90)
            artist.end_fill()
            artist.penup()

screen.exitonclick()
Результат выполнения
Сердце из закрашенных квадратов, нарисованное по матрице нулей и единиц
Та же матрица, нарисованная вложенным циклом

Алгоритм

setka_piksel_art.py
picture = [
    [0, 1, 0, 1, 0],
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
    [0, 1, 1, 1, 0],
    [0, 0, 1, 0, 0],
]

razmer = 40
for row_index, row in enumerate(picture):
    for col_index, value in enumerate(row):
        if value == 1:
            x = -100 + col_index * razmer
            y = 100 - row_index * razmer
            artist.goto(x, y)
            artist.pendown()
            artist.begin_fill()
            for _ in range(4):
                artist.forward(razmer)
                artist.right(90)
            artist.end_fill()
            artist.penup()
Вложенный цикл — строка за строкой, столбец за столбцом
Внешний цикл (глава 10) идёт по строкам матрицы, внутренний — по значениям внутри строки; та же схема, что и у матрицы из главы 11 (§11.11), только теперь на каждую единицу рисуется квадрат, а не просто печатается число.
★★★ Задача повышенной сложности
Измените ОДНО: своя картинка

Замените picture на свою собственную матрицу 5×5 (или другого размера) из нулей и единиц — буква, смайлик, любой узор. Алгоритм менять не нужно.

Debug Lab

Что произойдёт, если в формуле координат перепутать местами row_index и col_index?

debug_lab_grid.py
x = -100 + row_index * razmer   # было col_index
y = 100 - col_index * razmer    # было row_index
Картинка окажется зеркально отражённой (транспонированной)
Строки и столбцы поменяются местами — там, где должна быть широкая горизонтальная часть сердца, получится вытянутая вертикальная. Формулы координат нужно очень аккуратно сверять с тем, что означает каждый индекс.
Практика: пиксельная графика по своей матрице
Модуль turtle открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →