0201 bubbelsortering med grafik
Samma sorteringsalgoritmer som i den föregående övningen implementeras här, men sorteringen visas som en film när den görs.
Klasserna nedan kommer att byggas ut steg för steg.
Testa ofta
Kom ihåg att testa att koden fungerar som det är tänkt. Gör detta efter varje förändring. Det går i princip inte att testa för ofta. Det är lätt hänt att testa för sällan. Det kan dock medföra mycket merarbete.
Steg ett - bubbelsortering
Det första steget är att göra staplarna med tal på.
Klassen Bar (sv. stapel) är en Actor
Klassen Bar
är en stapel med ett tal på. Stapelns höjd är proportionell mot talet på stapeln.
Objektvariabler
Objektevariabeln number
kan innehålla heltal.
Konstruktor
Konstruktorn tar en parameter theNumber
. Objektvariabeln number
får dess värde.
Gör ett objekt av klassen GreenfootImage
. Lämplig bredd är 20. Lämplig höjd är dubbla number
. Objektet kan sparas i en lokal variabel.
Anropa metoden setImage
med ovanstående objekt som parameter.
Anropa metoden redraw
. Nästa steg är att implementera denna metod.
Metoden redraw
Metoden redraw
tar inga parametrar.
Använd metoden
getImage
för att hämta bilden som tillhör stapeln. Spara bilden i en lokal variabelimage
.Anropa metoden
setColor
på bilden. Ge bilden färgen RGB(255, 150, 150).Anropa metoden
fill
på bilden. Sätt färgen till vit medsetColor
.Anropa metoden
setFont
på bilden. Skicka med parameternnew Font("Arial", Font.BOLD, 14)
.Anropa metoden
drawString
på bilden. Skicka med parametrarna"" + number
, en tiondel av bildens bredd och bildens höjd minus 2. Då placeras numret relativt bra längst ner på stapeln.Anropa slutligen
setImage
och bifoga bilden som parmeter.
Testa
Testa att du kan göra staplar med valt tal längst ned och med höjd som är proportionell mot talet på stapeln. Låt talen vara i intervallet 0 - 99.
Metoden moveLeft
Metoden moveLeft
tar en parameter amount
som anger hur många pixlar som stapeln ska flytta åt vänster. Om parametern är negativt händer inget.
Metoden moveRight
Metoden moveRight
tar en parameter amount
som anger hur många pixlar som stapeln ska flytta åt höger. Om parametern är negativ sker ingen förflyttning.
Klassen Chart är en World
Objektvariabler
Objektvariableln bars
är en vektor som har plats för objekt av klassen Bar
.
Konstruktorn
Objektvariabeln bars
ges åtta platser.
Lägg till åtta objekt av klassen Bar
i vektorn bars
. Låt varje stapel få ett tvåsiffrigt tal. Placera staplarna som i figuren ovan. Det är 25 pixlar mellan vänsterkanterna på två intilliggande staplar.
Metoden swap
Metoden swap
byter plats på två staplar. Bytet sker grafiskt och i vektorn bars
. Metoden tar två parametrar indexLeft
och indexRight
, som är index för de staplar som ska byta plats.
Flytta den vänstra stapeln 25 pixlar åt höger och den högra 25 pixlar åt vänster.
Det blir inte helt rätt. Testa. Staplarna ska flyttas 25 pixlar gånger absolutbeloppet av skillnaden mellan de båda parametrarna. Implementera och testa.
Nästa steg är att byta plats på staplarna i vektorn. Idé: flyta 1 till temporär och 2 till 1 och 1 till 2.
TESTA
Objektvariabeln currentIndex
Lägg till en objektvariabel currentIndex
på lämpligt ställe som får värdet 0 vid start.
Metoden act
Här skrivs koden som sorterar vektorn. Först en enkel algoritm. Den kan förfinas något, men det tar vi senare.
Om talet på stapeln med index currentIndex
är större än talet på nästa stapel, så byter de plats. Använd metoden swap
.
Sedan ökas currenIndex
med ett.
Om currentIndex
är större eller lika med antalet staplar minus ett, så sätts currentIndex
till 0.
Nu ska vektorn sorteras med minsta talet först, men körningen avslutas aldrig. TESTA.
Nu till ett sätt att få stopp på köringen då sorteringen är klar.
Idén följer förs och sedan kommer algoritmen. Om inga staplar har bytt plats då alla staplar har gåtts igenom en gång så är staplarna sorterade och körningen kan avslutas.
Lägg till en objektvariabel hasSwapped
som har värdet false
från början.
Sätt variablen hasSwapped
till true
då två staplar bytt plats.
Gör följande tillägg i if-satsen som kollar om currentIndex
är större eller lika med antalet staplar minus ett:
Om hasSwapped
är false
så stoppas körningen. Använd metoden stop
i klassen Greenfoot
.
TESTA
Steg 2 - bubbelsortering - animerade staplar
Målet är att få staplarna som ska byta plats att röra sig långsamt till de nya positionerna.
När animering sker behöver sorteringen i Chart
pausas.
Klassen Bar
Objektvariabler
Lägg till två objektvariabler isMovingLeft
och isMovingRight
. Ge dem startvärdet false
.
Lägg till objektvariablerna moveRightAmount
och moveLeftAmount
. De håller ordning på hur mycket till som stapeln ska flytta åt höger respektive vänster innan animeringen är slut.
Sedan är det dags att skriva om metoderna moveRight
och moveLeft
, samt att skriva metoderna act
och isAnimating
.
Metoden moveRight
Ändra på innehållet så att följande händer då parametern amount
är positiv.
moveRightAmount
får parametern värdeisMovingRight
ges värdettrue
Tag bort förflyttningen. Den kommer vi att lägga till i act
-metoden strax.
Metoden moveLeft
Ändra metoden moveLeft
på samma sätt som du ändrade metoden moveRight
.
Metoden act
I metoden act sker animeringen. Du kommer väl ihåg att act
anropas av Greenfoot då en ny "fimruta" ska ritas.
Följande händer:
Om
isMovingRight
är sann ochmoveRightAmount
är större än noll, så flytta stapeln en pixel åt höger och minskamoveRightAmount
med ett.Om
moveRightAmount
är mindre eller lika med noll så, sättisMovingRight
tillfalse
.Punkt 1, men åt vänster.
Punkt 2, men åt vänster.
Metoden isAnimating
Metoden isAnimating
returnerat true
om isMovingRight
eller isMovingLeft
har värdet true
. I övriga fall returneras false
. Eller uttryckt på ett annat vis. Om stapeln håller på att flyttas så returneras true
och annars false
.
Klassen Chart
Två saker ska göras. En metod som kollar om någon av staplarna animeras för tillfället. Om en stapel animeras för tillfället ska inte koden i metoden act
göras.
Metoden isAnimating
Metoden isAnimating är en hjälpmetod som används för att göra koden mer lättläst.
Stega igenom varje stapel i vektorn bars
. Om aktuell stapel animeras så returneras true
.
Om ingen stapel animeras returneras false
.
Metoden act
Lägg en if-sats runt all kod. Om ingen stapel animeras körs innehållet i if-satsen, det vill säga den gamla koden.
TESTA - staplarna bör animeras men de byter ej färg
Steg 3 - bubbelsortering - färga staplar som animeras
Klassen Bar
Objektvariabler
Lägg till objektvariabeln backgroundColor
. Den ska vara av datatypen Color
. Ge den värdet RGB(255, 150, 150). Det är stapelns aktuella bakgrundsfärg. Den som ritas.
Lägg på samma sätt till objektvariabeln restColor
. Ge den samma värde. Variabeln håller ordning på vilken färgen ska vara på staplar som är i vila, det villl säga de som inte animeras.
Lägg till en tredje objektvariabel animationColor
. Ge den värdet RGB(150, 255, 150). Variabeln anger den färg stapeln ska ha då den animeras.
Metoden redraw
Ändra i metoden redraw
så att objektvariabeln backgroundColor
används för att sätta stapelns färg.
Metoden setColor
Metoden setColor
tar en parameter color
av datatypen Color
. Objektvariabeln backgroundColor
ges parameterns värde.
Därefter anropas metoden redraw
.
Metoden moveRight
Lägg till ett anrop av setColor
sist i if-satsen. Skicka med objektvariabeln animationColor
som en parameter i metodanropet.
Metoden moveLeft
Ändra den på samma sätt som metoden moveLeft
Metoden act
Efter de fyra första if-satserna läggs en femte. Om både isMovingLeft
och isMovingRight
är falska så sätts backgroundColor
till restColor
. Gör det med hjälp av metoden setColor
.
Klassen Chart
Ingen förändring krävs.
TESTA
Steg 4 - bubbelsortering - sorterade staplar färgas
Kan du lista ut hur man kan göra? En lösning kommer nog snart ….