# import modulu pro želví grafiku import turtle # import (pseudo)náhodného generátoru čísel from random import randint # # A) výpočet předpisu pro kresbu # ~ rostlina # # axiom = nultá generace axiom = 'F' print('0:', axiom) # pravidla pro výpočet # ~ n-tice má zaručené pořadí prvků a je nejméně náročná na (systémové) zdroje pravidla = ( 'F[+F]F[-F]F', 'F[+F]F', 'F[-F]F', ) # výpočet nových generací POČET_GENERACÍ = 4 předchozí_generace = axiom for i in range(POČET_GENERACÍ): nová_generace = '' for znak in předchozí_generace: if znak == 'F': # náhodně si vybereme jednu ze tří možností nová_generace += pravidla[randint(0, 2)] else: # ostatní znaky zkopírujeme tak, jak jsou nová_generace += znak print(f'{i + 1}: {nová_generace}') předchozí_generace = nová_generace # # B) kresba podle předpisu # # nechť želva kreslí trochu rychleji turtle.speed(0) # přesun na lepší startovní pozici turtle.left(90) turtle.teleport(0, -200) # „kmen“ je nejtlustší turtle.pensize(5) # hlavní kód, který podle předpisu a pravidel kreslí výsledný obrázek předpis = nová_generace zásobník = [] for znak in předpis: match znak: case 'F': # velké písmeno => deset kroků dopředu turtle.forward(10) case '[': # úprava barvy podle hloubky zanoření (= počtu otevřených levých závorek) match len(zásobník): case 3: # zelené „lístky“ na konci „větví“ turtle.color('green') turtle.pensize(1) case 2: # ještě tenší zelená „větev“ turtle.color('green') turtle.pensize(2) case 1: # tenší hnědá „větev“ turtle.color('brown') turtle.pensize(3) case 0: # tlustší hnědá „větev“ turtle.color('brown') turtle.pensize(4) # ulož stav želvy do zásobníku zásobník.append( # dvojce (souřadnice, natočení) (turtle.position(), turtle.heading()) ) case ']': # obnov stav želvy ze zásobníku # ~ rovnou rozložíme uloženou dvojci do dvou proměnných pozice, natočení = zásobník.pop() # přesunutí želvy na uloženou pozici (bez kreslení!) turtle.penup() turtle.setposition(pozice) turtle.setheading(natočení) turtle.pendown() case '+': # + => otočení doleva o 30 stupňů turtle.left(30) case '-': # - => otočení doprava o 30 stupňů turtle.right(30) # je dokresleno => schováme želvu turtle.hideturtle() # nechť okénko s kresbou zůstane otevřené turtle.done()