Level 3Skilpadder hele veien ned

Skrevet av: Oversatt fra Code Club UK

Oversatt av: Bjørn Einar Bjartnes

Kurs: Python
Tema: Tekstbasert
Fag: Matematikk, Programmering, Kunst og håndverk
Klassetrinn: 5.-7. klasse, 8.-10. klasse

Introduksjon

Hent frem skilpaddene dine, åpne IDLE, det er på tide å tegne igjen.

Steg 1: Tegn et fjell

Men først, la oss se på de følgende tre figurene: Hvordan kan vi tegne dem i Python?

_________________________

            /\
           /  \
          /    \
_________/      \________

            /\
         __/  \__
         \      /
____/\___/      \___/\___

checkSjekkliste

  • from turtle import *
    
    def first():
        forward(30)
    
    first()
    

    Jeg har puttet det inn i en prosedyre fordi jeg liker prosedyrer. Vi kommer til å lage prosedyrer for alle formene, så la oss legge dem til i filen vi lager.

  • from turtle import *
    
    def first():
        forward(30)
    
    def second():
        forward(30)
        left(60)
        forward(30)
        right(120)
        forward(30)
        left(60)
        forward(30)
    
    second()
    
  •             /\
               /  \
              /    \
    _________/      \________
    

Steg 2: Et fjell av fjell

Hva med den tredje figuren? Selv om den er litt komplisert å programmere om vi må skrive alle stegene vi må ta, er det egentlig bare det første fjellet tegnet fire ganger.

            /\
         __/  \__
         \      /
____/\___/      \___/\___

Du kan se at vi tegner den andre figuren (det enkle fjellet), deretter snur vi, tegner den igjen, snur, tegner igjen, snur og tegner den en siste gang.

checkSjekkliste

  • from turtle import *
    
    def second():
        forward(30)
        left(60)
        forward(30)
        right(120)
        forward(30)
        left(60)
        forward(30)
    
    def third():
        second()
        left(60)
        second()
        right(120)
        second()
        left(60)
        second()
    
    third()
    

    third ser veldig lik ut som second, men istedenfor å kalle forward, kaller vi second. Hvis vi ville, kunne vi til og med skrive en fjerde utgave og kalle third istedenfor. Dette høres fort ut som mye å skrive, det må da være en måte vi kan få datamaskinen til å forstå dette på?

    Disse figurene er spesielle på den måten at vi tegner dem ved å sette sammen enklere versjon av figurene om igjen og om igjen: Den tredje er laget av den andre, og den andre er laget av den første. Det vi virkelig har lyst til er å be datamaskinen om å tegne dette igjen og igjen helt til det er ferdig.

Steg 3: Igjen og igjen

Vi får til dette ved å dele problemet i to: Det enkle problemet og spesialtilfellet av problemet. Det enkle problemet er enkelt: Det er bare forward(100). Spesialtilfellet er litt vanskeligere, det vil si: Tegn spesialtilfellet, men en mindre enn i sted, helt til du kommer til det enkle tilfellet. Det er kanskje enklere å se på programmet enn å forklare.

checkSjekkliste

  • from turtle import *
    
    def mountain(depth):
        if depth == 1:
               forward(10)
        else:
            newdepth = depth -1
            mountain(newdepth)
            left(60)
            mountain(newdepth)
            right(120)
            mountain(newdepth)
            left(60)
            mountain(newdepth)
    
    mountain(3)
    

    Du kan se at vi har brukt kode som er veldig likt first, second og third. Vi bruker en if-setning for å finne ut om vi skal tegne det enkle tilfellet eller spesialtilfellet. I det spesielle tilfellet ber vi om å tegne et fjell, akkurat slik som third kalte second, men vi ber den om å tegne en enklere hver gang, med en ny verdi for depth, en mindre enn det vi startet med.

Steg 4: Tegn et snøflak av fjell

checkSjekkliste

  • from turtle import *
    
    def mountain(depth, length):
        if depth == 1:
               forward(length)
        else:
            newdepth = depth -1
            mountain(newdepth, length)
            left(60)
            mountain(newdepth, length)
            right(120)
            mountain(newdepth, length)
            left(60)
            mountain(newdepth, length)
    
    def snowflake(depth, length):
        mountain(depth, length)
        right(120)
        mountain(depth, length)
        right(120)
        mountain(depth, length)
        right(120)
    
    snowflake(4,5)
    

    Dette bildet heter Kochs snøflak. Hvis du vil kan du forsøke å endre på vinklene og se hva som skjer.

    Dette heter et fraktal, fordi de små bildene er laget av små versjoner av seg selv.

Steg 5: Bokser, flere bokser, og enda flere bokser

La oss se på en annen figur, en som ligner veldig på snøflaket, men med bokser istedenfor fjell.

___________________________

        ___________
        |         |
        |         |
        |         |
        |         |
________|         |________

             _
        ____| |____
        |         |
       _|         |_
      |_           _|
    _   |         |   _
___| |__|         |__| |___

Akkurat som med fjellet er det et enkelt tilfelle: en rett linje, og et spesialtilfelle: Tegn en linje med en firkanthump på. Vi ser også at den tredje er akkurat som før, tegn den andre figuren noen ganger.

Sjekkliste

  • from turtle import *
    
    forward(30)
    left(90)
    forward(30)
    right(90)
    forward(30)
    right(90)
    forward(30)
    left(90)
    forward(30)
    
  •         ___________
            |         |
            |         |
            |         |
            |         |
    ________|         |________
    

Vi har det enkle tilellet forward(100), og vi vet hvordan vi skal tegne linjen med firkanthumpen på seg, så la oss hoppe rett til tegningen!

Steg 6: Klumpete firkanter

checkSjekkliste

  • from turtle import *
    
    def box(depth, length):
        if depth == 1:
               forward(length)
        else:
            newdepth = depth -1
    
            # Hva skal vi skrive her?
            # Kopier inn koden fra steg 5 hit, men
            # bruk box(newdepth, length) istedenfor forward(100)
            # Spør om hjelp om du ikke forstår helt, men prøv
            # deg gjerne frem først.
    
    def xcurve(depth, length):
        box(depth, length)
        left(90)
        box(depth, length)
        left(90)
        box(depth, length)
        left(90)
        box(depth, length)
        left(90)
    
    xcurve(4,5)
    

Steg 7: Trekanter igjen

La oss tegne et siste fraktal, og som før har vi et enkelt tilfelle og et spesialtilfelle.

De første tre versjonene ser ut som dette. Vi tegner et triangel, og så tegner vi det som tre trekanter sammen.

       /\
      /  \
     /    \
    /      \
   /        \
  /          \
 /            \
----------------

       /\
      /  \
     /    \
    --------
   /\      /\
  /  \    /  \
 /    \  /    \
----------------


       /\
      ----
     /\  /\
    --------
   /\      /\
  ----    ----
 /\  /\  /\  /\
----------------

checkSjekkliste

  • from turtle import *
    
    def triforce(depth, length):
    
        if depth == 0:
            pendown()
            forward(length)
            left(120)
            forward(length)
            left(120)
            forward(length)
            left(120)
            penup()
        else:
            penup()
            newlength = length/2
            newdepth = depth - 1
    
            triforce(newdepth, newlength)
            forward(newlength)
            triforce(newdepth, newlength)
    
            left(120)
            forward(newlength)
            right(120)
            triforce(newdepth, newlength)
    
            right(120)
            forward(newlength)
            left(120)
    
    speed(11)
    penup()
    setpos(-255,-255)
    triforce(7, 512)
    

    Du har kanskje lagt merke til at vi bruker en ny kommando setpos for å flytte skilpadden til hjørnet av skjermen.

Steg 8: Bobler

checkSjekkliste

  • from turtle import *
    
    def bubble(depth, length):
        if depth == 0:
            pendown()
            circle(length/2)
            penup()
        else:
            penup()
            newlength = length/2
            newdepth = depth - 1
            bubble(newdepth, newlength)
            forward(newlength)
            bubble(newdepth, newlength)
            left(120)
            forward(newlength)
            right(120)
            bubble(newdepth, newlength)
            right(120)
            forward(newlength)
            left(120)
    
    speed(11)
    penup()
    setpos(-255,-255)
    bubble(6, 512)
    

Forbedre denne siden

Funnet en feil? Kunne noe vært bedre?
Hvis ja, vennligst gi oss tilbakemelding ved å lage en sak på Github eller fiks feilen selv om du kan. Vi er takknemlige for enhver tilbakemelding!