Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
729G04 Programmering ochdiskret matematikFöreläsning 4
Turtle Graphics
LOGO⁃ LOGO:programmeringsspråkföranvändninginomundervisning1967avPapertochFeurzeig
⁃ SpråketärsläktmedLISP,mensom"utenhet"hademanbl.a.möjlighetattstyraensköldpadda.
⁃ Sköldpaddanhadeävenen"penna"somdenkundehöjaochsänka.
The robot
Trådlös variant
Modern variant
Valiant Technology Ltd.
Turtle Graphics⁃ AttritamedhjälpavensköldpaddasommanstyrmedhjälpavkommandonbrukarmankallaförTurtleGraphics.
⁃ Mansersköldpaddanuppifrånochkangedenkommandon
⁃ PythonharenmodulsomlåterosshållapåmedTurtleGraphics.
Kommandon man kan ge till sköldpaddan⁃ Gå frammåt
⁃ Backa⁃ Sväng vänster⁃ Sväng höger⁃ Dra upp pennan
⁃ Sätt ner pennan
http://el.media.mit.edu/logo-foundation/logo/turtle.html
Pythons turtle-modul
Förflyttning av sköldpaddan⁃ fd(avstånd):flyttasköldpaddanframmåtettvisstavstånd
⁃ bk(avstånd):flyttasköldpaddanbakåtettvisstavstånd⁃ lt(grader):svängvänsterettvisstantalgrader⁃ rt(grader):svänghögerettvisstantalgrader
En fyrkantimport turtle
screen = turtle.Screen()screen.setup(width=600, height=600)turtle.mode("logo")turtle.showturtle()
turtle.fd(100)turtle.rt(90)turtle.fd(100)turtle.rt(90)turtle.fd(100)turtle.rt(90)turtle.fd(100)
importera modulen
skapa en ritytasätt storleken på ritytananvänd LOGO-standard för riktningvisa sköldpaddan
gå framåt 100 stegsväng höger 90 gradergå framåt 100 stegsväng höger 90 gradergå framåt 100 stegsväng höger 90 gradergå framåt 100 steg
En fyrkant
framåt
En fyrkant
vänster
En fyrkant
framåt
En fyrkant
vänster
En fyrkant
framåt
En fyrkant
vänster
En fyrkant
framåt
En fyrkant
Demo av pennan, förflyttning, position och riktning
Olika sätt att importera modulerimport turtle
screen = turtle.Screen()turtle.showturtle()
turtle.fd(100)turtle.rt(90)turtle.fd(100)turtle.rt(90)turtle.fd(100)turtle.rt(90)turtle.fd(100)
from turtle import *
screen = Screen()showturtle()
fd(100)rt(90)fd(100)rt(90)fd(100)rt(90)fd(100)
Kan vi stoppa in detta i en loop?
Kan vi få sköldpaddan att röra sig slumpmässigt?
Sköldpaddan ritar på ritytan med en penna⁃ Sköldpaddan har enpenna som kan höjas och sänkas.
⁃ Denär nere från början.
⁃ pd():sätt ner pennan
⁃ pu():dra upp pennan
Koordinatsystem och riktning
(0, 0)
(-, +) (+, +)
(+, -)(-, -)
Sköldpaddan och koordinater⁃ pos() returnerar entupel (x, y) där x och y är flyttal
⁃ setpos(x, y) flyttar sköldpaddan tillpositionen(x, y) där x och y är flyttal.
⁃ OBS! setpos() "teleporterar"inte sköldpaddan,dvs attompennan är nere kommer det att bli ett streck.
Ja, tupler finns i Python också...⁃ Lista:[1, 2, 3]⁃ Tupel:(1, 2, 3)⁃ Denstora skillnaden mellan listor och tupler i Pythonäratt maninte kan ändra på entupel.
⁃ Datatyper sommaninte kan ändra värdet på kallas"immutable"
⁃ Datatyper mankan ändra värde på kallas "mutable"
Tupel-exempel
Går inte att ändra på en tupel
>>> a = [1, 2, 3]>>> b = (1, 2, 3)>>> a[0] = 4>>> b[0] = 4Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment>>>
Riktning
Riktning i världen
0°
90°0°
90°
mode("standard") mode("logo")
Sköldpaddan vet vilken riktning den tittar åt⁃ mode("logo")
⁃ 0˚är norrut⁃ 90˚graderär österut⁃ gradantalet ökar medurs
⁃ heading() returnerar ett flyttal som berättar gradantalethosdenriktning manstår åt
⁃ seth(d) där d är ett flyttal,ställer insköldpaddansriktning
Cirkelrörelse
Exempel på anrop till circle()
circle(40) circle(-40) circle(40, 90) circle(40, 180, 4)
Cirkelrörelse⁃ circle() kan taett tilltre argument
⁃ circle(40) flyttar sköldpaddan moturs i encirkel medradien 40
⁃ circle(-40) ger enrörelse i medurs riktning
⁃ circle(40, 90) avbryter rörelsen efter 90grader
⁃ circle(40, 90, 2) säger att sköldpaddan kommerdela upp rörelsen i två raksträckor.
Refaktoriseringatt skriva omkod för att göra denbättre utan att ändra pådess beteende
Exempel och refaktorisering⁃ Någraexempelpåvadmankangöramedturtle-modulensamtgenomgångavrefaktoriseringgenomgeneraliseringochinkapsling
⁃ Inkapsling:Attkapslainensekvensavuttryckochsatserienfunktion
⁃ Generalisering:Attgöraenfunktionmergenerellgenomattspecificerabeteendenmedhjälpavparametrar/argument
Refaktorisering (refactoring)⁃ Förbättringavkoddockmedbibehållenfunktionalitet.
⁃ Förbättringenkanavseunderhåll
lättlästhet
⁃ Inteattförväxlamedoptimeringsomharmedförbättringavprestandaattgöra.Bådakandockinträffasamtigt.Optimeringkommerpånästaföreläsning.
Exempel på refaktoriseringdef get_number_of_children(name):
if name == "Ada":return 1
elif name == "Bean":return 3
elif name == "Cecil":return 1
elif name == "Dan":return 2
elif name == "Eliza":return 2
elif name == "Frodo":return 0
elif name == "Garfield":return 0
def get_number_of_children(name):if name in ["Frodo", "Garfield"]:
return 0elif name in ["Ada", "Cecil"]:
return 1elif name in ["Dan", "Eliza"]:
return 2elif name in ["Bean"]:
return 3
När ska man refaktorisera?⁃ När koden luktar illa - exempel på dålig lukt:
redundantkod,t.ex.kod som upprepas eller kod som inte görnågot
långa funktioner
väldigtmånga parametrar skickas tillenfunktion
enfunktion som gör för lite
variabelnamn eller funktionsnamnsom harmissvisande namn
komplexavilkor i koden
Olika sätt att refaktorisera⁃ Hitta loopar⁃ Kapsla in(bryt ut tillfunktioner)⁃ Generalisera (gör koden mer generell,ofta funktioner)
Bryta ut en funktion / inkapslingprint "Hi Ben!"print "I am happy!"
# Inkapsling: Att kapsla in en sekvens av # uttryck och satser i en funktion.
def greet_ben():print "Hi Ben!"print "I am happy!"
Varför är detta bra? Återanvändning!
def greet_ben():print "Hi Ben!"print "I am happy!"
greet_ben()greet_ben()
Generalisering av funktion⁃ Att gå från enfunktion som utför enspecifik uppgift,tillenfunktion som är mer flexibel medavseende på beteendegenom att införa parametrar
Generaliseringdef greet_ben():
print "Hi Ben!"print "I am happy!"
# Vi gör funktionen mer generell så# att den kan hälsa på vilket namn som helst
def greet(name):print("Hi " + name + "!")print("I am happy!")
Sick sack
⁃ Vivill producera ovanstående mönster.
⁃ Kom ihåg:programmering är eniterativ aktivitet!Vigör ett stegi taget.
Vi provar att refaktoriserahttps://www.ida.liu.se/codela/as/729g04d/sicksack
Sick sackfrom turtle import *
screen = Screen()mode("logo")
fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)
fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)
fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)
Sick sack – vi ser en loopfrom turtle import *
screen = Screen()mode("logo")
fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)
fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)
fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)
for i in range(3):fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)
Sick sack – inkapslingfor i in range(3):
fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)
# Vi hittar delar av koden vi kan göra om # till funktioner
def make_right_l():fd(100)rt(90)fd(10)rt(90)
def make_left_l():fd(100)lt(90)fd(10)lt(90)
for i in range(3):make_right_l()make_left_l()
Sick sack – inkapsling och generaliseringdef make_right_l():
fd(100)rt(90)fd(10)rt(90)
def make_left_l():fd(100)lt(90)fd(10)lt(90)
for i in range(3):make_right_l()make_left_l()
# Vi kapslar in loopen och generaliserar# den på samma gång
def make_right_l():fd(100)rt(90)fd(10)rt(90)
def make_left_l():fd(100)lt(90)fd(10)lt(90)
def zig_zag(n):for i in range(n):
make_right_l()make_left_l()
zig_zag(3)
Sick sack – inkapsling och generalisering# Vi kapslar in loopen och generaliserar# den på samma gång
def make_right_l():fd(100)rt(90)fd(10)rt(90)
def make_left_l():fd(100)lt(90)fd(10)lt(90)
def zig_zag(n):for i in range(n):
make_right_l()make_left_l()
zig_zag(3)
# Vi skapar en funktion som ritar ut tv� segment med en b�j
def two_segments(angle, segment1, segment2):fd(segment1)rt(angle)fd(segment2)rt(angle)
def make_right_l():two_segments(90, 100, 10)
def make_left_l():two_segments(-90, 100, 10)
def zig_zag(n):for i in range(n):
make_right_l()make_left_l()
zig_zag(3)
Uppgift: Stjärnan
⁃ Vivillritaensånhärfigur⁃ Hur?Delauppproblemet,hittamönster,görsammasakfleragånger?
Rita en stjärna
def draw_line_and_return():"""Rita ett streck p� 50 enheter och �terv�nd till
startpositionen."""fd(50)bk(50)
def draw_star():"""Rita ut en stj�rna med fem armar"""for line in range(5):
draw_line_and_return()rt(360.0/5)
draw_star()
Debugga med spårutskrifter
Att hitta vad som går fel⁃ skrivutvärdenpåvariablerpålämpligtställeikoden
⁃ print("x:",x)
Med spårutskrifter
def draw_line_and_return(length):"""Rita ett streck och �terv�nd till startpositionen."""# Spr�rutskriftprint("Drawing line, length:", length)fd(length)bk(length)
def draw_star(points, length):"""Rita ut en stj�rna med fem armar"""for line in range(points):
# Skriv ut vilket streck vi ligger p� print("line:", line)draw_line_and_return(length)rt(360.0/points)
Visualisering av nästlad loop
Stjärna med stjärnor
Stjärna med stjärnor
Labb 4⁃ Tillämpningavfunktioner,looparochsköldpaddor
⁃ Labb4-8görsipar⁃ Anmälertillnyapargrupperhttps://www.ida.liu.se/webreg/729G04-2014/PARLABB
Angry Turtles
Angry Turtles⁃ Fåglarharstulitsköldpaddornasäggochsköldpaddornahämnasgenomattskjutaivägsigsjälvapåenmåltavla.
⁃ Användarengerstyrkaochvinkel⁃ Speletritaruthursköldpaddanflygerivägochkollaromsköldpaddanträffarmålet.
Exempel
Angry Turtles - innan spelet kan börja⁃ Innanvispeletkanbörjamåstevigöraföljande
Ställainritytan
Bestämmavarmåltavlanskavara
Ritautmåltavlan
Placerasköldpaddanistartposition
Angry Turtles - själva spelet⁃ Spelarenbörjarmedt.ex.1000poäng⁃ Spelloop
Frågaanvändarenparametrar:styrkaochevvinkel- användinput()Förflyttasköldpaddanliteitaget(loop)⁃ förflyttningenbaseraspåangivenstyrka(ochevvinkel)⁃ avbrytloopen(break)närsköldpaddannuddatmarken(ellerärundermarken),dvskollaomy<=0.
Kollaavståndettillmåltavlan⁃ Omsköldpaddanärtillräckligt näramåltavlan- berättadet,visapoängochfrågaomspelarenvillspelaigen.
⁃ Omsköldpaddan varförlångtifrånmåltavlan- berättadetochdraifrånpoäng