BearCode's Note

파이썬 터틀로 그림 그리기 (픽셀아트/도트 스타일) 본문

카테고리 없음

파이썬 터틀로 그림 그리기 (픽셀아트/도트 스타일)

BearCode 2024. 5. 3. 19:49

과제로 수행했던 파이썬 터틀로 그림 그리기 코드입니다.

벚꽃이 흩날리는 나무를 픽셀 아트 느낌으로 표현했습니다.

되는대로 작성한 터라 코드가 깔끔하지 않습니다.

우선 처음에 격자를 그린 다음(사실 안 그려도 사각형 그릴 때 그려져서 최종 결과는 동일)

좌상단부터 사각형을 하나씩 색칠해가며 그림을 그립니다.

첫 줄에는 약간 진한 핑크색이 더 많이 칠해지고,

아랫줄로 갈수록 연한 핑크색이 더 많이 칠해집니다.

중앙 부분에는 연한 핑크 대신 나무줄기를 표현하는 갈색이 칠해집니다.

갈색은 하단부에서 좀 더 좌우로 넓게 칠해져서 밑동을 표현합니다.

마지막으로 랜덤하되 중복되지 않은 위치에 진한 핑크색의 꽃이 그러집니다.

총 10개가 다 그려지거나 중복된 위치에 그리기를 시도해 10번 실패하면 while문이 종료됩니다.

파이썬은 들여쓰기가 중요하더군요.

메모장에 코딩하다보니 스페이스바 누르기가 꽤 번거로웠지만 들여 쓰기는 익숙해진 것 같습니다.

코드 실행결과
코드 실행 결과

[Python Code]

import random
import turtle as t

#초기세팅
t.clearscreen()
t.speed(0)

#화면 크기 지정
screen_x = 500
screen_y = 500
screen_half_x = screen_x/2
screen_half_y = screen_y/2
t.setup(screen_x+50, screen_y+50)

#화면 분할 개수 지정
split_count_x = 20
split_count_y = 20

#화면 분할 단위크기 지정
split_unit_x = screen_x/split_count_x
split_unit_y = screen_y/split_count_y

#펜 위치 초기화 함수(좌상단으로 이동)
def goto_start_point() :
    t.penup()
    t.goto(-screen_half_x, screen_half_y)

#펜 색상 및 굵기 지정
t.color('gray')
t.width(1)

#창 배경 색상 지정
t.bgcolor('skyblue')

#가로 줄 그리기
goto_start_point()
temp = 0
for i in range(split_count_x+1) :
    t.pendown()
    t.goto(screen_half_x, screen_half_y-temp)
    temp += split_unit_x
    t.penup()
    t.goto(-screen_half_x, screen_half_y-temp)

#세로 줄 그리기
goto_start_point()
temp = 0
for i in range(split_count_y+1) :
    t.pendown()
    t.goto((-screen_half_x)+temp, -screen_half_y)
    temp += split_unit_y
    t.penup()
    t.goto((-screen_half_x)+temp, screen_half_y)

# 좌표에 해당하는 블록에 사각형을 그리는 함수
def draw_rect(x, y, color) :
    t.penup()
    point_x = (-screen_half_x) + (split_unit_x * (x-1))
    point_y = screen_half_y - (split_unit_y * (y-1))
    t.goto(point_x, point_y )
    t.fillcolor(color)
    t.begin_fill()
    t.pendown()
    t.goto(point_x+split_unit_x, point_y)
    t.goto(point_x+split_unit_x, point_y-split_unit_y)
    t.goto(point_x, point_y-split_unit_y)
    t.goto(point_x, point_y)
    t.end_fill()
    t.penup()

#픽셀 그림 그리기
back_colors=["lavenderblush", "pink", "peru"]
color_index = 0
split_count_half_x = int(split_count_x/2)
split_count_half_y = int(split_count_y/2)
tree_thick = int(split_count_x/10)
tree_height = split_count_half_y-split_count_half_y/2
for i in range(1, split_count_y+1) :
    c = i / split_count_y
    for j in range(1, split_count_x+1) :
        b = random.random()
        if b <= c :
            if j > split_count_half_x-tree_thick and j < split_count_half_x+tree_thick and i > tree_height :
                color_index = 2
            elif i >= int(split_count_y*0.9) and j > split_count_half_x-tree_thick-int(i/10) and j < split_count_half_x+tree_thick+int(i/10) and i > tree_height :
                color_index = 2
            else : 
                color_index = 0
        else :
            color_index = 1
        draw_rect(j,i,back_colors[color_index])

#픽셀 꽃 그리기 함수
def draw_flower(x, y, color_middle, color_leaf) :
    draw_rect(x,y,color_middle)
    draw_rect(x,y-1,color_leaf)
    draw_rect(x+1,y,color_leaf)
    draw_rect(x,y+1,color_leaf)
    draw_rect(x-1,y,color_leaf)

#랜덤한 위치에 픽셀 꽃 그리기
flower_colors=["palevioletred", "hotpink"]
check_list=[' ']
is_duplicate = False
count_bad = 0
count_good = 0
flower_count= 10
fail_limit=10
while count_bad < fail_limit and count_good < flower_count:
    x = random.randint(2, split_count_x-2)
    y = random.randint(2, split_count_y-2)
    xy = int(str(x) + str(y))
    for j in check_list :
        if(j == xy) :
            is_duplicate = True
            count_bad += 1
    if is_duplicate :
        if_duplicate = False
        continue
    else :
        check_list.append(xy)
        check_list.append(xy-1)
        check_list.append(xy-2)
        check_list.append(xy+1)
        check_list.append(xy+2)
        check_list.append(int(str(x-1) + str(y)))
        check_list.append(int(str(x-2) + str(y)))
        check_list.append(int(str(x+1) + str(y)))
        check_list.append(int(str(x+2) + str(y)))
        count_good += 1
        draw_flower(x,y,flower_colors[0],flower_colors[1])
Comments