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
getImageför att hämta bilden som tillhör stapeln. Spara bilden i en lokal variabelimage.Anropa metoden
setColorpå bilden. Ge bilden färgen RGB(255, 150, 150).Anropa metoden
fillpå bilden. Sätt färgen till vit medsetColor.Anropa metoden
setFontpå bilden. Skicka med parameternnew Font("Arial", Font.BOLD, 14).Anropa metoden
drawStringpå 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
setImageoch 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.
moveRightAmountfår parametern värdeisMovingRightges 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 minskamoveRightAmountmed ett.Om
moveRightAmountär mindre eller lika med noll så, sättisMovingRighttillfalse.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 ….