Observera att denna sida är under utveckling!

Lektion 3: Sköldpaddsvärlden

Syfte: Öva villkors- och iterationssatser.
Begrepp som introduceras: Objekt
Arbetsform: Arbeta gärna tillsammans med någon men skriv egen kod. Diskutera med varandra!
Arbetstid: Schemalagd handledningstid: 2 timmar. Utöver det räkna med eget arbete med lika många timmar.
Redovisning: Ingen obligatorisk redovisning, men diskutera med handledare om det är något du är osäker på!

Turtle-världen och dess invånare

Med standarddistributionen av Python kommer en modul turtle. Med den kan man rita upp en värld med objekt (sköldpaddor, paddor) som kan rör sig och rita figurer. Det är huvudsakligen tänkt som ett pedagogiskt hjälpmedel men kan även användas för att rita t.ex. grafer, kurvor och diagram.

Starta Thonny.
Vi börjar med att skriva kod i interactive mode, dvs i det nedre fönstret i Thonny, dvs shell-fönstret. Efter promptern >>>.

  1. Importera turtle-modulen:
    >>> import turtle
  2. Skapa en padda:
    >>> t = turtle.Turtle()
startbild

Satsen t = turtle.Turtle() öppnar ett fönster och
placerar en väldigt liten "figur" i mitten. Fönstret har ett (tänkt)
koordinatsystem med origo i mitten (där paddan står) och
x- och y-axlarna på vanligt sätt åt höger respektive uppåt. startbild

Satsen t = turtle.Turtle() innebär att vi skapar en variabel t som refererar till en sköldpadda. En padda har ett antal metoder som man kan använda för att "beordra" den att göra olika saker. En metod är en funktion som är kopplad till ett speciellt objekt (paddan i detta fall). För att använda en metod använder man punktnotation. Jämför metoden append för listobjekt!

Exempel:
Vi kan be paddan att anta ett mer sköldpaddslikt utseende med
>>> t.shape('turtle').
startbild

Prova följande satser i tur och ordning efter >>>:

  1. >>> t.forward(100)
  2. >>> t.left(90)
  3. >>> t.forward(100)
  4. >>> t.circle(100)
Studera vad som händer efter varje sats.

I resterande del av lektionen skall du arbeta i script mode, dvs skriva satserna i Thonny's editor och skapa några python-filer (program).
För att få lite ordning och reda kan det vara bra att du börjar med att skapa en mapp för de filer (program) du kommer skapa i denna lektion, dvs enligt samma princip du gjorde i lektion 2.

Klistra in vidstående kod som illustrerar en lite mer avancerad figur:
Spara koden i en fil med namnet ex1 och kör!

Prova andra färger (gissa namnen!) samt längden (200) och vinkeln (170)
och se vilka effekter det får!
Dvs du får modifiera koden i filen ex1.

import turtle t = turtle.Turtle() t.hideturtle() t.color('blue', 'light blue') t.begin_fill() for i in range(36): t.forward(200) t.left(170) t.end_fill()

Paddorna ha en stor mängd metoder. För att se alla metoder kan man (under förutsättning att man importerat turtle-modulen) få en förteckning med kommandot (i shell-fönstret)

>>> dir(turtle)

För att få information om en speciell metod kan man använda kommandot help. Exempel:

>>>help(turtle.forward)

De viktigaste metoderna finns samlade i minilektionen om turtlegrafik. Det finns också en officiell dokumentation

Vi ska nu använda paddorna för att exemplifiera och öva på det vi hittills gått igenom, bl.a. if- och while-satser.

Övningar

Koden för dessa övningar ska lagras på varsin fil och testas.
Tips:
När program skall skrivas finns normalt ingen entydig exakt kod som svar, ty man kan skriva program som löser samma problem på många olika sätt. Om du gör din egen lösning och sedan jämför med lösningsförslaget, skiljer sig säkert dessa åt. Du har därmed sett två olika lösningar och detta lär man sig på.
  1. Skriv ett program (en pythonfil ovn1) som frågar användaren efter en längd och sedan ritar en liksidig triangel med detta värde som sidlängd Lösningsförslag
    import turtle
    
    side = int(input("Sidlängd: "))
    t = turtle.Turtle()
    
    for i in range(3):
        t.forward(side)
        t.left(120)
    
    
    Bättre med en loop än så kallad "rakkod":
    
    t.forward(side)
    t.left(120)
    t.forward(side)
    t.left(120)
    t.forward(side)
    
  2. Skriv en ny version av föregående program så att det fyller triangeln med röd färg. Kalla pythonfilen för ovn2.
    Tips 1: Kopiera kod från filen ovn1.
    Tips 2: Metoder för fyllning: fillcolor, begin_fill och end_fill Lösningsförslag
    import turtle
    
    side = float(input("Sidlängd: "))
    
    t = turtle.Turtle()
    t.fillcolor('red')
    t.begin_fill()
    for i in range(3):
        t.forward(side)
        t.left(120)
    t.hideturtle()		# Mer estetiskt utan paddan
    t.end_fill()
    
  3. Skriv en ny version av föregående program så att det också frågar efter färg att fylla med. Kalla pythonfilen för ovn3.
    Tips 1: Kopiera kod från filen ovn2.
    Färgen ska skrivas som white, red, blue,... Lösningsförslag
    import turtle
    
    side = float(input("Sidlängd: "))
    t = turtle.Turtle()
    color = input("Färg: ")	# color får typen string
    t.fillcolor(color)	# som kan användas som indata till fillcolor
    t.begin_fill()
    for i in range(3):
        t.forward(side)
        t.left(120)
    t.hideturtle()	
    t.end_fill()
    
  4. spiral
    Skriv ett program som med hjälp av metoderna forward och left i en for-sats (100 steg) ritar en spiral, se vidstående figur.
    Namnge programmet till ovn4

    Tips: För att få en spiral behöver man variera vinkeln och/eller sträckan. Prova båda!

    Lösningsförslag
    Figuren är gjord med denna kod:
    t = turtle.Turtle()
    for i in range(100):
        t.forward(i)
        t.left(30 - i/10)
    

  5. Modifiera spiralkoden så att den avbryter när avståndet till origo är större än 200. Använd metoden distance. Namnge programmet till ovn5 Lösningsförslag
    t = turtle.Turtle()
    i = 0
    while t.distance(0, 0) < 200:
        t.forward(i)
        t.left(30 - i/10)
        i += 1
    
  6. sinusgraph
    Skriv ett program (ovn6), som ritar två perioder av en sinuskurva enligt vidstående figur.

    Tips: goto är bästa metoden att använda.

    Kom ihåg: math.sin vill ha argument i radianer.

    Lösningsförslag
    import turtle
    import math
    
    t = turtle.Turtle()
    t.speed(0)
    t.hideturtle()
    t.fillcolor('SkyBlue')
    
    t.begin_fill()
    for i in range(-360, 361, 10):
        x = i*math.pi/180
        t.goto(x*50, 200*math.sin(x))
    t.home()
    t.end_fill()
    

    Denna sida visar vilka färger man kan välja mellan.

  7. La Tricolore
    Skriv ett program (ovn7) som ritar den franska flaggan mitt i rutan. Ränderna är 100 breda och 200 höga vilket ger flaggan rätt proportioner.

    Ledning: Själva ritandet behöver inte ta mer än 10 rader men det krävs att man har en yttre iteration över rektanglarna och att dessa görs med en iteration över sidorna.

    Bra att läsa på lösningen!

    Lösningsförslag
    import turtle
    
    t = turtle.Turtle()
    size=100
    t.penup()
    t.goto(-size*1.5, -size)  	# Gå till nedre vänstra hörnet
    t.pendown()
    t.hideturtle()
    
    colors = ['blue', 'white', 'red']
    sides = [size, 2*size, size, 2*size]
    for c in colors:    		# iterera över färgerna
        t.fillcolor(c)
        t.begin_fill()
        for side in sides:  	# iterera över sidorna
            t.forward(side) 	
            t.left(90)	
        t.end_fill()
        t.forward(size)		# Gå till nästa färgrand
    

Gå till nästa lektion eller gå tillbaka