Tillbaka till Sommarprogrammering

turtle

I python finns det en hel mängd paket som går att importera för att använda till olika saker. I detta avsnitt skall vi kika på ett paket som heter turtle och som ger oss möjlighet att bygga grafik i python. Vi kommer dels testa att rita lite olika saker för att förstå hur turtle fungerar och sedan kommer vi skapa några program där vi kan styra en figur både för ritning och för enklare spel.

Den koden som finns i dessa övningar är anpassade till repl.it för där kan du inte skapa egna fönster vilket du måste göra om du skall köra turtle på din egen dator. 

När du skapar nya repl som skall fungera med turtle så är det viktigt att du väljer rätt typ av projekt ”Python (with Turtle)” annars kommer det inte att fungera.

grafik med turtle 1

Vi börjar att rita lite med turtle. Skriv av delar av koden, eller kopiera hela och försök förstå vad som händer. När du känner att du har koll försök att ändra i koden eller skriv egen kod och se att koden gör det som du tror att den skall göra.

import turtle
t = turtle.Turtle()

for i in range (4):   # ritar en kvadrat, 4 sidor
  t.forward(100)      # 100 pixlar lång sida
  t.left(90)          # Sväng 90 grader

t.penup()             # lyft pennan
t.goto(-100,0)        # flytta pennan 100 pixlar åt vänster
t.pendown()           # sätt ner pennan

t.color('red', 'yellow') # sätt röd färg på omkretsen och gul färg på ytan
t.begin_fill()        # börja fyll
t.circle(100)         # rita cirkeln med radien 100 pixlar
t.end_fill()          # sluta fyll
t.color('blue')       # byt färg till blå

t.backward(100)       # backa 100 pixlar 

# Gör så att inte fönstret stänger efter färdigt program, spelar ingen roll i repl.it
turtle.done()

grafik med turtle 2

Här kommer en lite mer komplex lösning med funktioner, flera färger och olika figurer. Kopiera koden och testa vad som händer, mina kommentarer hjälper dig. Ändra sedan i koden, fundera på vad du tror skall hända och se om det händer.

import turtle
t = turtle.Turtle()

# funktion som ritar en kvadrat
# x- och y-koordinater anges som inparameter
def makeBox(x, y):
  t.penup()                     # lyft pennan
  t.goto(x, y)                  # flytta pennan till koordinaten
  t.pendown()                   # sätt ner pennan
  for turn in range(0, 4, 1):   # loopa från 0 mot 4 med steget 1
    t.left(90)                  # sväng vänster 90 grader
    t.forward(100)              # för pennan framåt 100 pixlar

# rita fyra kvadrater
makeBox(0, 100)
makeBox(100, 100)
makeBox(100, 0)
makeBox(0, 0)

# Ritar en stjärna med fem linjer/uddar
for turn in range(0, 5, 1):
  t.forward(100)
  t.left(144)

# rita fyra streck med olika färger
for c in ['red', 'green', 'yellow', 'blue']:
  t.color(c)
  t.forward(100)
  t.left(90)

t.penup()                   # lyft pennan
t.goto(-20, -100)           # flytta -20 steg i x-led och -100 i y-led
t.pendown()                 # sätt ner pennan
t.circle(160)               # rita en cirkel med radien 160 pixlar

turtle.done()

styra turtle med tangenter

Här aktiverar vi programmet genom att trycka på space. Varje gång vi gör så kommer programmet att köras ett varv till och i detta fallet rita ut en kvadrat till. Kvadratens sidlängd slumpas fram och färgen som fyller kvadraten slumpas också fram genom tre värden mellan 0 och 255, denna kombination skapar en RGB-färgkod.

# nödvändiga importer
import random
import turtle
 
# Setup
t = turtle.Turtle()
#t.speed(0)           # 0 innebär ingen tid för förflyttning
# å, ä, ö fungerar inte
t.write("press space to print a square", font=("Arial", 14, "normal")) 

# Genererar en slumpmassig kvadrat i ritfonstet
def slump_kvadrat():

    # Genererar slumpade x och y koordinater och flyttar sköldpaddan dit
    x = random.randint(-400, 200)
    y = random.randint(-400, 200)
    t.penup()
    t.goto(x, y)
    t.pendown()
 
    # Genererar en slumpmässig sidstorlek och färger
    sida = random.randint(50, 200)
    r = random.randint(0,255)
    g = random.randint(0,255)
    b = random.randint(0,255)
    t.color(r, g, b)
 
    # Ritar en kvadrat
    t.begin_fill()
    for i in range(4):
        t.forward(sida)
        t.left(90)
    t.end_fill()
 
 
# Anger att när funktionen slump_kvadrat körs när användaren trycker på mellanslag
turtle.Screen().onkey(slump_kvadrat, 'space')
 
# Säger till ritfönstret att lyssna efter event
turtle.Screen().listen()
 
# Gör så att inte fönstret stänger efter färdigt program, spelar ingen roll i repl.it
turtle.done()

styra figur med tangenter

Nu skall vi med hjälp av piltangenterna lära oss att styra vår turtle så att vi kan göra olika saker med den.

# import av paketet turtle
import turtle
# talar om att figuren (pilen) skall visas
turtle.showturtle()

# Funktioner för att styra figuren
def ahead():                  
  turtle.forward(1)           # framåt 1 steg
def behind():
  turtle.backward(1)          # bakåt 1 steg
def clockwise():
  turtle.right(1)             # vrid höger 1 grad
def counterclockwise():
  turtle.left(1)              # vrid vänster 1 grad

# Kopplar tangenter till händelse
turtle.Screen().onkey(ahead, "Up")              # upp -> funktionen ahead
turtle.Screen().onkey(behind, "Down")           # ner -> funktionen behind
turtle.Screen().onkey(clockwise, "Right")       # right -> funktionen clockwise
turtle.Screen().onkey(counterclockwise, "Left") # left -> funktionen counterclockwise

# Säger till ritfönstret att lyssna efter event
turtle.Screen().listen()

# Tvingar fönstret att vara öppet (inte obligatoriskt på repl.it)
turtle.done()

Om du kör programmet och styr pilen med piltangenterna så kan du rita med turtle. Detta är inget spel, men visar hur du kan styra pilen/spelaren.
Kan du öka farten på pilen? Byta pilen mot sköldpaddan? Ändra färg på strecket som ritas?

turtle game

Här kommer en guide för hur man bygger ett spel i turtle och det byggs i repl.it’s miljö. Spelet vi skall bygga är ett spel där din spelare skall fånga bollar för att samla poäng inne i en avgränsad yta. Spelet kommer byggas steg för steg tills vi har ett fungerande spel som går att …