Pythonissa on turtle-moduuli, jonka avulla voi piirtää kilpikonnagrafiikkaa. Tämän kaikki toiminnallisuudet saa ladattua käyttöön näin:
from turtle import *
Nyt on käytössä monta uutta komentoa, jotka liittyvät piirtämiseen. Kun ohjelma käynnistyy, meillä on tyhjä piirtoalusta, jonka keskellä on "kilpikonna", jonka kulkusuunta on oikealle. Komennolla forward(...) voi pyytää kilpikonnaa menemään eteenpäin haluttu matka. Kulkiessaan se piirtää viivaa. Yritä ajaa tämä ohjelma:
from turtle import * forward(100)
Kun ohjelman ajaa IDLE-ympäristössä, pitäisi ilmestyä kokonaan uusi ikkuna, johon kilppari piirtää kuvioitaan. Tässä pitäisi syntyä viivanpätkä (jonka pituus on 100 "askelta"). Pienellä kolmiolla merkitty kilppari on nyt tämän viivan loppupäässä.
Komennolla left(...) kilpparia voi käskeä kääntymään halutun asteluvun vasempaan ja komennolla right(...) oikeaan. Mitähän tämä siis tekee?
from turtle import * forward(100) left(90) forward(100) right(90) forward(100)
Miten piirretään vaikkapa kolmio? Laita vaikka leluauto lattialle ja mieti, miten sitä ohjattaisiin piirtämään kolmio, esimerkiksi näin:
Ohjelma siis näyttäisi suunnilleen tältä, kunhan vain keksitään, mikä on oikea arvo muuttujalle kulma (tämä ei vielä toimi, vaan antaa virheilmoituksen, että muuttujaa "kulma" ei ole määritelty):
from turtle import * forward(100) left(kulma) forward(100) left(kulma) forward(100) left(kulma)
Kun kilppari on tehnyt koko matkan, se on myös kääntynyt kokonaisen ympyrän, eli 360 astetta. Kolme käännöstä pitäisi olla siis yhteensä 360 astetta. Voidaan tehdä jakolasku: jos yksi käännös on 360 / 3 astetta, kolme käännöstä on yhteensä 360 astetta. Pythonissa voidaan laskea jakolaskujakin, jakolaskun merkki on /. Tämän pitäisi nyt toimia:
from turtle import * kulma = 360 / 3 forward(100) left(kulma) forward(100) left(kulma) forward(100) left(kulma)
Python laskee, että 360 jaettuna 3:lla on 120, asettaa tämän muuttujan "kulma" arvoksi ja käyttää tätä kääntymiseen. Tämän voisi tehdä myös itse näin:
from turtle import * forward(100) left(120) forward(100) left(120) forward(100) left(120)
Kolmion piirtämisessä toistettiin samoja askeleita kolme kertaa, tästä voidaan siis näppärästi tehdä silmukka, joka pyörii kolme askelta:
from turtle import *
kulma = 360 / 3
for i in range(3):
forward(100)
left(kulma)
Samaan tapaan voi koittaa piirtää muitakin monikulmioita. Esimerkiksi viisikulmion saa vastaavasti aikaan näin: jaetaan kokoympyrä viiteen osaan, niin tiedetään, paljonko käännytään, ja pyöritetään silmukkaa viisi kertaa:
from turtle import *
kulma = 360 / 5
for i in range(5):
forward(100)
left(kulma)
Jos piirretään hyvin isoa monikulmiota, voi olla hyvä lyhentää sivun pituutta hiukan, jotta se mahtuu ruudulle. Tässä piirretään monikulmio, jossa on 60 kulmaa, se alkaa jo näyttää melkein ympyrältä:
from turtle import *
kulma = 360 / 60
for i in range(60):
forward(10)
left(kulma)
Tällä ohjelmalla saatiin aikaan 5-kulmio:
from turtle import *
kulma = 360 / 5
for i in range(5):
forward(100)
left(kulma)
Mitähän tämä tekee? Tässä kilppari kääntyy yhteensä 720 astetta, eli tekee kaksi kokonaista ympyrää:
from turtle import *
kulma = 720 / 5
for i in range(5):
forward(100)
left(kulma)
Entä jos tehdään enemmän käännöksiä, vaikkapa 7?
from turtle import *
kulma = 720 / 7
for i in range(7):
forward(100)
left(kulma)
Entä 9 käännöstä?
from turtle import *
kulma = 720 / 9
for i in range(9):
forward(100)
left(kulma)
Mitähän käy, jos käännöksiä onkin vaikkapa 6 tai 8? Kokeile!
Miten kuva muuttuu, jos left-komennon sijaan käyttääkin right-komentoa ja laitetaan kilppari kääntymään oikealle?
Voit piirtää paksumpia viivoja säätämällä viivan leveyttä komennolla width(...). Tälle annetaan parametrina numero, joka kertoo halutun viivan paksuuden. Normaalisti viivan paksuus on 1, joten esimerkiksi luku 10 tekee viivasta kymmenen kertaa paksumman. Kokeile:
from turtle import *
width(10)
kulma = 360 / 3
for i in range(3):
forward(100)
left(kulma)
Voit vaihtaa kilpparin kynän väriä komennolla color(...). Tälle annetaan teksti, jossa on englanniksi halutun värin nimi:
from turtle import *
width(10)
kulma = 360 / 3
color("red")
forward(100)
left(kulma)
color("purple")
forward(100)
left(kulma)
color("blue")
forward(100)
left(kulma)
Mitä jos haluttaisiin piirtää kolmio, neliö, viisikulmio, kuusikulmio jne. samalla ohjelmalla? Voidaan tehdä silmukka, jossa kulmien määrää kasvatetaan. Jos halutaan, että Python laskee nurkkapisteiden määrän esimerkiksi kolmesta kymmeneen, voidaan kirjoittaa tällainen silmukka:
for i in range(8):
nurkkia = i + 3
print(nurkkia)
Tässä Python asettaa muuttujan i arvoksi vuorollaan luvut 0, 1, 2, 3, 4, 5, 6 ja 7 (kahdeksan ensimmäistä lukua nollasta alkaen). Me lisäämme tähän 3, joten muuttujan nurkkia arvoksi tulee vuorollaan luvut 3, 4, 5, 6, 7, 8, 9 ja 10. Kokeile!
Jos meillä on muuttujassa nurkkia haluttu nurkkapisteiden määrä, vaikkapa 6, monikulmion voisi piirtää näin:
from turtle import *
nurkkia = 6
kulma = 360 / nurkkia
for i in range(nurkkia):
forward(100)
left(kulma)
Nyt jos laitetaan tämä koko juttu silmukan sisään, jossa nurkkien määrä kasvaa, saadaan tällainen ohjelma. Kokeile!
from turtle import *
for i in range(8):
nurkkia = i + 3
kulma = 360 / nurkkia
for j in range(nurkkia):
forward(100)
left(kulma)
Mitähän tämä ohjelma tekee?
from turtle import *
for i in range(100):
forward(i)
left(10)
Jos haluaa piirtää monta eri kuviota, pitää välillä lopettaa piirtäminen, siirtää kilpikonna uuteen paikkaan ja aloittaa piirtäminen uudestaan. Kynän saa nostettua irti paperista komennolla up() ja piirtämistä voi taas jatkaa komennolla down(). Näin voi esimerkiksi piirtää yhden kolmion, siirtyä toiseen kohtaan ja piirtää toisen kolmion:
from turtle import *
kulma = 360 / 3
for i in range(3):
forward(100)
left(kulma)
up()
forward(200)
down()
for i in range(3):
forward(100)
left(kulma)
Mitähän tämä tekee? Kokeile!
from turtle import *
kulma = 720 / 5
for i in range(5):
forward(100)
right(kulma)
up()
forward(200)
down()
kulma = 720 / 5
for i in range(5):
forward(100)
right(kulma)
Entä mitähän tämä?
from turtle import *
for j in range(10):
kulma = 720 / 5
for i in range(5):
forward(40)
right(kulma)
up()
forward(50)
down()
Tässä kestää jo aika pitkään. Kilppariin saa lisää vauhtia komennolla speed(...). Tuolle komennolle voi antaa numeron, joka kertoo kilpparin nopeuden. Luku 6 tarkoittaa normaalia nopeutta, luku 10 on nopein. Kokeillaan vaikkapa tällaista:
from turtle import *
speed(8)
for j in range(10):
kulma = 720 / 5
for i in range(5):
forward(40)
right(kulma)
up()
forward(50)
down()
Mitähän tämä ohjelma tekee? Tässä kuviosta toiseen siirtymisen jälkeen käännetään kilpparia hiukan…
from turtle import *
speed(10)
for j in range(10):
kulma = 720 / 5
for i in range(5):
forward(40)
right(kulma)
up()
forward(50)
right(360 / 10)
down()
Entä mitähän tämä tekee?
from turtle import *
speed(8)
for j in range(10):
kulma = 360 / 5
for i in range(5):
forward(100)
right(kulma)
right(360 / 10)
Tai tällainen?
from turtle import *
speed(10)
for j in range(60):
kulma = 360 / 5
for i in range(5):
forward(100)
right(kulma)
right(360 / 60)
Tai tämä?
from turtle import *
speed(10)
up()
for j in range(15):
forward(100)
right(90)
down()
forward(100)
right(90)
forward(200)
right(90)
forward(200)
right(90)
forward(200)
right(90)
forward(100)
right(90)
up()
forward(100)
right(180)
right(6)
Kokeile välillä vaihtaa värejä ja kynän paksuutta, vaikkapa näin:
from turtle import *
speed(10)
up()
width(2)
color("red")
for j in range(15):
forward(100)
right(90)
down()
forward(100)
right(90)
forward(200)
right(90)
color("blue")
forward(200)
right(90)
forward(200)
right(90)
color("red")
forward(100)
right(90)
up()
forward(100)
right(180)
right(6)
Kokeile rohkeasti muokkailla ohjelmia ja kirjoittaa omia!
Voit suunnitella kuvioita esimerkiksi ruutupaperilla ja miettiä, miten saat ne muutettua ohjelmaksi. Tässä on ruutupaperilla suunniteltu T-kirjain:
Valitsin yhden ruudun kooksi 10 askelta ja kilppari aloittaa punaisella merkitystä nurkasta. Tästä saadaan kirjoitettua ohjelma seuraamalla kilpparin matkaa pitkin kuviota, jokainen käännös on tässä aina 90 astetta vasempaan tai oikeaan:
from turtle import * forward(50) right(90) forward(10) right(90) forward(20) left(90) forward(40) right(90) forward(10) right(90) forward(40) left(90) forward(20) right(90) forward(10) right(90)
Mitähän tämä ohjelma tekee? Tässä toistetaan samaa T-kirjaimen tuottavaa komentosarjaa silmukassa, välillä nostetaan kynää ja siirretään kilpparia:
from turtle import *
speed(10)
for i in range(5):
forward(50)
right(90)
forward(10)
right(90)
forward(20)
left(90)
forward(40)
right(90)
forward(10)
right(90)
forward(40)
left(90)
forward(20)
right(90)
forward(10)
right(90)
up()
forward(60)
down()
Entä tämä:
from turtle import *
speed(10)
for i in range(5):
forward(50)
right(90)
forward(10)
right(90)
forward(20)
left(90)
forward(40)
right(90)
forward(10)
right(90)
forward(40)
left(90)
forward(20)
right(90)
forward(10)
right(90)
up()
forward(40)
left(90)
forward(20)
right(90)
down()