Wednesday 2 November 2011

Siirtelyalgoritmi

Ai mitenniin olen hiljainen? En varmaan ole! :P

Tänään, kun tunnilla opettaja kertoi kuinka Javan Collections- ja Arrays - luokat osaavat järjestellä kokoelmia olioiden ominaisuuksien mukaan melko.... helposti..., allekirjoittanut tutki pitkästä aikaa MEMAPPERia. Korjailin muutamia käyttöliittymäbugeja, jotka ovat jo pitkään häirinneet minua, ja säädin hiiren tajuamaan scrollbarien toiminnan. Kun väsyin tähän, aloin tutkia ensimmäistä kertaa tosi pitkään aikaan uusien ominaisuuksien toteuttamista. Toteutin sitten selection toolin, jolla käytännössä valitaan tilejä siirtelyä tai leikepöytäoperaatioita varten.

Tämän toteutus ei ollut mikään haastava. Projektiin uusi luokka, jonka lupaan implementoivan Tool - rajapinnan, jonka jälkeen kopioin luokkaan rakenteet, jotka varmistavat ettei sama tile saa Use() - kutsun kuin kerran hiirenpainikkeen ollessa pohjassa. Siihen päälle vielä samantyyppinen bool-taulukko, joka hitdatatoolin taustalta löytyy, ja tämän taulukon pohjalta pienet piirtorutiinilisät Layerpanelin paintComponent()iin.

Haastavampi kysymys on sitten, että miten Move - työkalu pitäisi toteuttaa, ja toisiko tämä tarpeen tuoda Kumoa - toiminto ohjelmaan. Kumoamisen voisi toteuttaa luomalla pinon key-val - pareja, joihin tallennettaisiin aina Tool.Close()a kutsuttaessa kopiot kartan tilaa ylläpitävistä listoista. Kumoa:n kutsuminen sitten poppaisi tilaa ylläpitävät listat pinon ylimmän olion mukaisiin tiloihin. Tämä listojen syväkopiointi saattaa helpottua, jos laitan linkin tähän keskusteluun.

Siirtelyalgoritmi vaatii myös hieman pohdintaa. Yksi vaihtoehto olisi hakea ensisijaisesti vasemmaisin ja toissijaisesti ylin valittu tile. Kun MoveTool.Use()a sitten kutsutaan, asetetaan tämä tile hiiren osoittamiin koordinaatteihin ja muut valitut tilet suhteessa tähän tileen (pidetään tile, joka on sijoitustileen nähden koordinaateissa 3,4 samoissa koordinaateissa sijoitustilen uusiin koordinaatteihin nähden).

1 comment:

  1. Jos tarvitsee kopioida uusiin luokkiin jotain toiminnallisuutta niin kannattaa varmaan pistää se toiminnallisuus johonkin, kenties uuteen luokkaan, josta se on sitten käytössä muualta. Tulee kivempaa koodia.

    ReplyDelete