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.

  1. Använd metoden getImage för att hämta bilden som tillhör stapeln. Spara bilden i en lokal variabel image.

  2. Anropa metoden setColor på bilden. Ge bilden färgen RGB(255, 150, 150).

  3. Anropa metoden fill på bilden. Sätt färgen till vit med setColor.

  4. Anropa metoden setFont på bilden. Skicka med parametern new Font("Arial", Font.BOLD, 14).

  5. 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.

  6. 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.

  1. moveRightAmount får parametern värde
  2. isMovingRight ges värdet true

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:

  1. Om isMovingRight är sann och moveRightAmount är större än noll, så flytta stapeln en pixel åt höger och minska moveRightAmount med ett.

  2. Om moveRightAmount är mindre eller lika med noll så, sätt isMovingRight till false.

  3. Punkt 1, men åt vänster.

  4. 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 ….