Labb 1: Flera sköldpaddor, en introduktion till objektorienterad programmering

Labbinnehåll: Skapa och använda objekt. Flock-beteende.

  • Syftet med denna labb är att ge er en introduktion till objektorienterad progammering. Ni kommer att få styra flera sköldpaddor på en gång (Labb 1, Del 1), samt använda objektorintering för att programmera lite flockbeteende (Labb 1, Del 2).
  • Labb 1-4 görs i grupper om 2 personer. Registrera er grupp i webbreg: https://www.ida.liu.se/webreg/729G06-2013-2/LAB1/signup_admin
  • Alla labbar i 729G06 ska följa PEP8.
  • Labb 1 redovisas enligt nedan.

Del 1: Skapa och använda objekt

I del 1 ska ni skriva tre funktioner, draw_triagle(x, y, size), draw_square(x, y, size) och draw_four_squares(size). Funktionerna som ritar ut geometriska figurer tar in en x-koordinat (flyttal, en y-koordinat (flyttal) samt en storlek (heltal) och ritar ut en triangel respektive en fyrkant. Istället för att rita ut den geometriska figuren med hjälp av en sköldpadda, ska figurerna ritas ut med tre, respektive fyra sköldpaddor.

Funktionen draw_four_squares(size) ska rita ut fyra fyrkanter med angiven längd på sidorna samtidigt.

Objektorienterade sköldpaddor

Ni ska använda er av turtlemodulen som ni använde er av i 729G04. Dock ska sköldpaddorna användas på ett objektorienterat sätt.

Istället för att använda funktionerna för att flytta fram sköldpaddan som skapas med ritytan (dvs fd(), rt(), lt(), pu() etc), ska ni använda metoderna som ligger i varje enskild sköldpaddsinstans.

Minns från föreläsningen att en klass är mallen för objekt. Objekt (även kallade för instanser) skapas sedan utifrån denna mall genom att anropa konstruktorn i klassen. Nedanstående skapar en sköldpadda och sparar referensen till den i en variabel (givet att man importerat med from turtle import *).

turtle1 = Turtle()

För att säga åt turtle1 att gå frammåt 100 steg, använder ni samma funktionsnamn som ni använde i labb 4 i 729G04, men ni använder den metod som ligger i turtle-instansen, dvs:

turtle1.fd(100)

Motsvarande gäller för att svänga vänster t.ex. 45 grader: turtle1.lt(45) och höger t.ex. 10 grader: turtle1.rt(10).

Genomförande för draw_triangle() och draw_square()

  1. Skapa en ny fil för koden till labb 1. Döp den enligt redovisningsinstruktionerna.
  2. Ange encoding följt av namnen på labbgruppens medlemmar högst upp i filen.
  3. Börja sedan koden med att importera turtle-modulen i början av er kodfil och skapa en rityta att rita på och lägg referensen till ritytan i en variabel (se föreläsning 4 i 729G04 och kompissidorna (sida 1, sida 2) för repetition). Ritytan får vara gemensam för alla funktioner i del 1.
  4. Implementera draw_square(x, y, size):
    1. Skapa fyra sköldpaddor
    2. placera ut dem på lämpliga ställen i förhållande till heltalen x och y som angets som argument.
    3. Få sköldpaddorna att rita ett streck var så att en kvadrat av storleken size ritas ut.
  5. Implementera draw_triagle(x, y, size):
    1. Skapa tre sköldpaddor
    2. placera ut dem på lämpliga ställen i förhållande till heltalen x och y som angets som argument.
    3. Få sköldpaddorna att rita ett streck var så att en triangel av storleken size ritas ut (strecken behöver inte stanna på exakt samma ställe, bara ungefär, och ni bestämmer själv vinklarna i triageln).

Genomförande för drawfoursquares(size)

Ni kommer att implementera två varianter av denna funktion, med olika ordning på de två loopar som behövs. Kalla den ena för draw_four_squares_turtles_out(size), och den andra för draw_four_squares_turtles_in(size). Ni kommer förstå skillnaden nedan.

  1. Skapa en lista och lägg till fyra instanser sköldpaddor till den. Kom ihåg att en lista kan innehålla i princip vad som helst, både enkla datatyper och objekt. Principen för hur man kommer åt dem är den samma, dvs med index som t.ex. turtles[0].
  2. Placera ut sköldpaddorna en bit ifrån varandra, antingen i en rad eller i någon annan konfiguration om ni tycker att det är roligare.
  3. Rita fyra fyrkanter samtidigt. Två loopar behövs för att lösa uppgiften, en som går igenom alla sköldpaddor, och en loop som ritar ut fyrkanten. Funktionen som går igenom sköldpaddorna i den yttersta loopen kallar ni för draw_four_squares_out(size). Den som har sköldpaddorna i den inre loopen kallar ni för draw_four_squares_in(size).

Del 2: Flockbeteende

Del två av denna labb utgår ifrån ett labbskelett som kan hämtas här: http://www.ida.liu.se/~729G06/programmering/labbar/flock.py. Högerklicka på länken och spara filen till lämplig mapp. Se till att döpa om den så att den följer redovisningsinstruktionerna.

Scenariot är att på en planet i en annan dimension har ett experiment gått snett så att nästan hela världens befolkning förvandlats till zomiesköldpaddor. Endast ett fåtal ninjor som tränade ute i skogen har undkommit smittan.

I labben ska ni få prova på att använda er av objekt och prova hur syntaxen ska för att använda objekt i Python ser ut.

Användbara resurser till del 2

Som hjälp under implementationen kan ni dels läsa på kompissidorna, dels i pythons egen dokumentation över turtle-modulen och nedan för en lista över användbara funktioner som finns definierade labbskelettet. Tänk bara på att kompissidorna visar det icke-objektorienterade sättet att använda turtle-modulen.

Genomförande

Er uppgift är att dels skapa ninjasköldpaddor och zombiesköldpaddor dels att implementera två funktioner: 1) move_hunters_towards_prey(hunters, prey) och 2) move_prey_away_from_hunters(prey, hunters). Ni ska inte behöva skapa fler funktioner än dessa. Skal till dessa funktioner finns i labbskelettet. I labbskelettet är det även markerat var ni ska skriva er kod. Det första stället är på rad 48 där det i labbskelettet bara står pass. Se exemplet nedan:

# ATT GÖRA: skapa 2 ninjor och lagra dem i listan ninjas
#           plocka upp alla ninjors pennor. Ändra form på
#           sköldpaddorna.
pass

Ni ska alltså ersätta raden där det står pass med kod som utför det som står under ATT GÖRA.

Den första funktionen tar in två listor med sköldpaddor. En lista som den använder som jägare och en lista som den som byten. I denna funktion ska bara jägarna röra på sig. Varje jägare ska titta på varje enskilt byta och vända sig mot det. Efter att jägaren vänt sig så ska den röra på sig. Genom att vända sig mot alla byten kommer slutresultatet bli att jägaren vänder sig mot det håll som det finns flest byten åt.

Den andra funktionen flyttar bytena bort från jägarna. Varje byte ska titta på varje jägare och försöka vända sig bort från denna. Effekten blir att ju närmare jägarna står, destå lättare blir det för bytena att vända sig bort från båda. Bytena flyttar bara på sig om någon jägare kommit för nära.

Funktioner i kodskelettet

  • turn_turtle_towards(turtle, another_turtle, turn_speed): Den här funktionen tar in två sköldpaddsobjekt och vänder den första mot den andra med turn_speed antal grader +/- lite brus.
  • turn_turtle_away_from(turtle, another_turtle, turn_speed): Den här funktionen tar in två sköldpaddsobjekt och vänder den första bort från den andra med turn_speed antal grader +/- lite brus.
  • distort_value(value): Den här funktionen ändrar på det värde (flyttal eller heltal) genom att antingen lägga till eller dra ifrån lite. Värdet som läggs till eller dras ifrån ligger inom en procentuell andel av ursprungsvärdet. Man kan ändra denna andel genom att ändra på variabeln noise_percentage på rad 21.

Redovisning

  • Två filer ska skickas in via e-post till er labbhandledare. Ingen papperskopia behöver lämnas in.
  • Se till att cc:a er labbpartner.
  • Använd följande ämnesrad: 729G06 Labb 1 abcde123 och qwert234 (där abcde123 och qwert234 ersätt med era liu-id:n). Genom att använda denna ämnesrad gör ni det lättare för er labbhandledare att hitta er inlämning!
  • En fil med del 1 som förslagsvis döps till labb1-liuid1-liuid2-del1.py (där ni ersätter liuid1 och liuid2 med era egna liu-idn).
  • En fil med del 2 som förslagsvis döps till labb2-liuid1-liuid2-del1.py (där ni ersätter liuid1 och liuid2 med era egna liu-idn).

Sidansvarig: Jody Foo
Senast uppdaterad: 2013-01-16