⌛⌛⌛ JavaFX Wordle

Aseta koodisi pääluokka Maven-projektin hakemistorakenteen mukaisesti tiedostoon Round12/wordle/src/main/java/fi/tuni/prog3/wordle/Wordle.java. Kuten hakemistorakenne ilmentää, toteutuksesi tulee olla määritetty pakkaukseen fi.tuni.prog3.wordle.

Tässä tehtävässä toteutetaan viime aikoina mediassa huomiota saanut Wordle-sanapeli käyttäen JavaFX-käyttöliittymäkirjastoa.

Peli muistuttaa aiempien harjoitusten sanapeliä. Pelin kulku on seuraava:

  • Pelinjohtaja valitsee sanan (jota ei näytetä pelaajalle).

    • Wordle-sivuston versiossa sanan pituus on aina 5. Tässä tehtävässä sanan pituus voi olla muukin.

  • Pelaajan tavoitteena on arvata pelinjohtajan sana tekemällä korkeintaan 6 arvausta.

  • Kukin arvauskerta koostuu kokonaisen sanan arvauksesta. Pelinjohtaja näyttää pelaajalle aina kunkin arvauksen jälkeen tietoa siitä, mitkä pelaajan arvaaman sanan kirjaimet esiintyvät arvattavassa sanassa (tästä tarkemmin alempana).

Tässä tehtävässä pelin graafinen esitys ja muut toteutuksen yksityiskohdat tulee tehdä alla kuvatulla tavalla. Kuvauksen yhteydessä on esitetty esimerkkikuvia käyttöliittymästä. Huomaa, että kuvat on tarkoitettu esimerkeiksi eli sinun toteuttamasi käyttöliittymä saa näyttää erilaiselta, kunhan siinä on oleellisesti sama toiminnallisuus. Ruutujen väritystä koskevia sääntöjä on kuitenkin noudatettava tarkasti, koska automaattinen tarkistus pyrkii tutkimaan ruutujen värejä.

  • Pelin alussa luodaan tyhjä ruudukko, jossa on 6 riviä ja arvattavan sanan pituuden verran sarakkeita.

    • Kukin rivi vastaa yhtä arvauskertaa. Ylin rivi vastaa ensimmäistä arvausta, toinen toista, jne.

    • Ruudut ovat alussa tyhjiä (sisältävät merkkijonon “”) ja niiden taustavärin tulee olla valkoinen (Color.WHITE).

Esimerkki pelin alkutilanteesta.

Esimerkki pelin alkutilanteesta.

  • Pelaaja muodostaa arvauksen syöttämällä kirjaimia näppäimistöltä.

    • Kirjaimia käsitellään isoina; jos käyttäjä antaa pienen kirjaimen, peli muuntaa sen isoksi.

      • Myös pelinjohtajan sanaa käsitellään arvauksen oikeellisuuden tarkistamisessa aivan kuin sen kirjaimet olisivat isoja (jolloin peli on efektiivisesti kirjainkoosta riippumaton).

    • Kukin syötetty kirjain asetetaan nykyistä arvausvuoroa vastaavan rivin ensimmäiseen tyhjään ruutuun.

      • Jos rivi on jo täynnä, ei uuden kirjaimen syöttäminen aiheuta muutoksia ruutuihin.

    • Pelaaja voi poistaa jo syöttämiään kirjaimia käyttäen backspace-näppäintä. Kukin backspace-näppäimen painallus poistaa nykyistä arvausvuoroa vastaavan rivin viimeisen kirjaimen (jos sellainen on olemassa).

      • Kirjaimen poisto tarkoittaa, että sen ruudun sisällöksi asetetaan tyhjä merkkijono “”. Älä yritä asettaa esimerkiksi null-viitettä.

  • Pelaaja antaa arvauksensa tarkistettavaksi painamalla Enter-näppäintä.

    • Jos pelaaja painaa Enter-näppäintä ennen kuin nykyistä arvausvuoroa vastaava rivi on täynnä, näyttää peli pelaajalle viestin “Give a complete word before pressing Enter!”.

Esimerkki tilanteesta, jossa pelaaja on painanut Enteriä sanan ollessa kesken.

Esimerkki tilanteesta, jossa pelaaja on painanut Enteriä sanan ollessa kesken.

Esimerkki tilanteesta, jossa pelaaja on syöttänyt kokonaisen sanan painamatta Enteriä.

Esimerkki tilanteesta, jossa pelaaja on syöttänyt kokonaisen sanan painamatta Enteriä.

  • Peli ilmaisee pelaajan arvauksen oikeellisuuden värittämällä arvatun sanan kirjainten ruudut seuraavasti:

    • Jos pelaajan arvauksen kirjain täsmää samassa kohdassa olevan pelinjohtajan sanan kirjaimen kanssa, väritetään kirjaimen ruutu vihreäksi (Color.GREEN).

    • Muuten jos pelaajan arvauksen kirjain täsmää jossain muussa kohdassa olevan pelinjohtajan sanan kirjaimen kanssa, väritetään kirjaimen ruutu oranssiksi (Color.ORANGE).

    • Muuten pelaajan arvauksen kirjain ei täsmää pelinjohtajan sanan minkään kirjaimen kanssa, ja kirjaimen ruutu väritetään harmaaksi (Color.GREY).

Esimerkki tilanteesta, jossa pelaaja on syöttänyt kokonaisen sanan ja painanut Enteriä.

Esimerkki tilanteesta, jossa pelaaja on syöttänyt kokonaisen sanan ja painanut Enteriä. Tässä pelinjohtajan sana on “account”, ja oikeassa kohdassa täsmänneen kirjaimen ‘N’ ruutu on väritetty vihreäksi, väärässä kohdassa täsmänneiden kirjainten ‘C’, ‘O’ ja ‘A’ ruudut oransseiksi, ja kokonaan epätäsmäävien kirjainten ‘M’, ‘P’ ja ‘Y’ ruudut harmaiksi.

  • Jos pelaaja arvasi sanan oikein, näytetään pelaajalle viesti “Congratulations, you won!” ja nykyinen peli päättyy. Jos pelaaja arvasi sanan väärin ja kyseessä oli jo kuudes arvaus, näytetään pelaajalle viesti “Game over, you lost!” ja nykyinen peli päättyy.

    • Pelaaja ei voi pelin päättymisen jälkeen enää syöttää uusia kirjaimia (eikä Enter tee mitään).

      • Pelaaja voi aloittaa uuden pelin klikkaamalla nappia “Start new game”.

Esimerkki tilanteesta, jossa pelaaja arvasi sanan oikein eli voitti pelin.

Esimerkki tilanteesta, jossa pelaaja arvasi sanan oikein eli voitti pelin.

Esimerkki tilanteesta, jossa pelaaja teki 6 väärää arvausta ja hävisi pelin.

Esimerkki tilanteesta, jossa pelaaja teki 6 väärää arvausta ja hävisi pelin.

  • Ellei pelaajan arvaus johtanut pelin päättymiseen, siirtyy peli ruudukon seuraavalle riville: käyttäjän syöttämät kirjaimet alkavat täydentää seuraavalla rivillä olevaa uutta sanaa.

Esimerkki tilanteesta, jossa pelaaja syöttää seuraavaa arvausta.

Esimerkki tilanteesta, jossa pelaaja syöttää seuraavaa arvausta.

Edellä kuvattu toimintalogiikka vastaa melko suoraan alkuperäistä Wordle-peliä.

Toteutuksesi pääluokan pitää olla fi.tuni.prog3.wordle.Wordle (eli pakkaukseen fi.tuni.prog3.wordle määritetty luokka Wordle). Toteutukseesi saa kuulua muitakin kooditiedostoja, kunhan nekin sijaitsevat alihakemistossa src/main/java/fi/tuni/prog3/wordle.

Muutama lisäyksityiskohta koskien pelinjohtajan sanoja sekä käyttöliittymäelementtejä:

  • Ohjelman tulee alussa lukea pelinjohtajan sanat tiedostosta words.txt ja alustaa peli, jossa arvataan tiedoston ensimmäistä sanaa. Tiedoston oletetaan sisältävän yhden sanan per rivi.

    • Voit käyttää testeissäsi aiemman sanapeli-tehtävän yhteydessä annettua tiedostoa. Tällöin ohjelmasi alustaisi aluksi pelin, jossa arvataan sen ensimmäistä sanaa “account”.

  • Jos pelaaja klikkaa nappia “Start new game”, valitaan järjestyksessä seuraava pelinjohtajan sana ja pelinäkymä luodaan uudelleen vastaamaan tätä uutta sanaa. Esimerkiksi yllämainitun tiedoston tapauksessa seuraava sana olisi “act”.

    • Ruudukko alustetaan taas tyhjillä ruuduilla. Huomaa, että ruudukon koko voi muuttua, koska arvattavan sanan pituus voi muuttua.

  • Jotta käyttöliittymän automaattinen testaus onnistuisi, tulee käyttöliittymän elementeille määrittää seuraavanlaiset id-arvot (JavaFX:n elementtien jäsenfunktiolla setId).

    • Rivin i sarakkeen j ruudun elementille, joka suoraan sisältää kirjainta esittävän tekstin, tulee antaa muotoa “i_j” oleva id. Indeksointi alkaa nollasta.

      • Esimerkiksi ensimmäisen rivin ruutujen id:t vasemmalta oikealle ovat muotoa “0_0”, “0_1”, jne. Jos arvattavan sanan pituus olisi 7, olisi oikean alakulman eli rivin 5 sarakkeen 6 ruudun id muotoa “5_6”.

    • Käyttäjälle näytettävän viestin (esim. pelin loppuminen, Enterin paino väärään aikaan) sisältävälle elementille tulee antaa id “infoBox”.

    • Uuden pelin aloittavalle “Start new game”-napille tulee antaa id “newGameBtn”.

  • Kirjainten sekä viestien esittämiseen tulee käyttää joitain seuraavista JavaFX:n elementeistä: Text, TextField, TextArea, Label, Cell tai Button.

Testauksesta

Tässä tehtävässä ei ole GUI-pohjaisen luonteensa vuoksi tekstimuotoisia esimerkkisyötteitä tai -tulosteita. Yritä testata toteutustasi esim. vertailemalla ruudukon väritystä jne. yllä annettuihin esimerkkikuviin. Kaikissa 7-kirjaimista sanaa vastaavissa kuvissa pelinjohtajan sana on “account”.

Tehtävän palautus avautuu pienellä viiveellä. Tarkistus tulee perustumaan yksikkötesteihin, jotka antavat toteutuksellesi pisteitä kumulatiivisesti sen mukaan, moniko testi menee virheittä läpi. Tehtävästä on siten mahdollista saada osittaispisteitä.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.