Rozdział 12 · Wiele fascynujących mini-projektów!

Projekt: Grafika pikselowa na siatce

algorytm → danych → graf: zagnieżdżony lista decyduje, co rysować, a zagnieżdżona pętla decyduje jak.

Zastosowanie
nested listnested forTurtle
Poziom
★★★★ challenge
Rezultat
pixel art

Co tworzymy

Most między danymi a grafiką: macierz z zer i jedynek — oraz program, który rysuje według niej obraz. 0 — pusto, 1 — wypełniony kwadrat.

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 jest zagnieżdżony lista: 0 = pusty, 1 = wypełniony kwadrat
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()
Rezultat
Serce z wypełnionych kwadratów, narysowane według macierzy zer i jedynek
Ta sama macierz rysowana przez zagnieżdżoną pętlę

Algorytm

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()
Zagnieżdżona pętla – łańcuch znaków wiersz, kolumna po kolumnie
Zewnętrzna pętla (rozdział 10) przechodzi po łańcuch znaków macierzy, wewnętrzna — po wartościach w wierszu; ta sama schematyczna jak w macierzy z rozdziału 11 (§11.11), tylko teraz dla każdej jednostki rysowany jest kwadrat, a nie tylko drukowana liczba.
Challenge
Zmiana JEDNA: Twoje zdjęcie

Zastąp picture własną macierzą zer i jedynek o rozmiarze 5×5 (lub innym rozmiarze) – litery, emotikony, dowolny wzór. Algorytm nie wymaga zmian.

Debug Lab

Co się stanie, jeśli pomieszasz miejsca w wzorze współrzędnych row_index oraz col_index?

debug_lab_grid.py
x = -100 + row_index * razmer   # było col_index
y = 100 - col_index * razmer    # było row_index
Obraz okaże się odbity lustrzanie (transponowany)
Wiersze i kolumny zamieniają się — tam, gdzie powinna być szeroka pozioma część serca, pojawi się wydłużona pionowa część. Wzory współrzędnych muszą być bardzo starannie sprawdzane względem znaczenia każdego indeksu.
Praktyka: pixel art w swojej matrycy
Moduł turtle otwiera natywne okno Python – uruchamiane lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →