# Fysiikan viikkokoe 2 (Fysiikka Sprintti)

Puhelimelle suunniteltu suomenkielinen PWA-opetus- ja harjoittelupeli tekniikan fysiikan viikkokokeeseen. **Avaa `index.html` selaimessa.** Pelaaminen ei vaadi asennusta, palvelinta, kirjautumista tai verkkoyhteyttä, kun koko kansio on ladattu koneelle.

## Aloita tästä

1. Avaa `index.html` esimerkiksi Edgessä, Chromessa tai Firefoxissa.
2. Pidä sisältövalintana **Viikkotehtävien ydin** ja paina **Opettele alusta**. Lähtötasotesti on erikseen lisävalinnoissa.
3. Uusi taito alkaa opetuksesta samassa vaiheittaisessa näkymässä: **katso ja säädä ilmiötä → ymmärrä periaate → seuraa ratkaistua esimerkkiä → vastaa ymmärryskysymykseen → kokeile itse uusilla luvuilla**. Oma tehtävä tulee vasta opetuksen jälkeen. Vastaa yhteen kohtaan kerrallaan. Vihjeissä ja malliratkaisussa ovat aina juuri oman tehtävän arvot.
4. Palaa vaikeisiin taitoihin **Vahvista vaikeita kohtia** -kierroksella. Koekierros näyttää vastaukset vasta palautuksen jälkeen; ennen palautusta kaikki vastaukset voi tarkistaa ja muokata.
5. Valitse **Kaikki materiaalit**, kun haluat mukaan täydentävät sovellukset ja mittaustehtävät. Edistyminen-näkymästä voit harjoitella myös yksittäistä taitoa.

Laskin saa olla käytössä. Aseta trigonometria astetilaan (DEG). Pelissä g = 9,81 m/s². Kirjoita lukukenttään vain luku; kentän vieressä näkyy yksikkö. Desimaalipilkku, piste, miinusmerkki ja esimerkiksi `1,2e3` kelpaavat. Voit pyöristää annetun desimaalimäärän mukaan tai antaa tarkemman vastauksen. Säilytä välivaiheissa tarkat arvot.

Harjoittelu avautuu omana sivunaan. **Tallenna ja poistu** tai **Esc** palaa etusivulle ja säilyttää vaiheen. **Jatka harjoittelua** avaa saman tehtävän, omat vastaukset ja saman ratkaisuvaiheen; se löytyy etusivulta sekä Edistyminen-, Kaavat- ja Asetukset-näkymistä. Työpöydällä tehtävänanto ja kuva näkyvät vastausalueen vieressä. Muihin harjoittelutapoihin pääsee etusivun **Muut harjoittelutavat** -valinnasta. Myös malliratkaisu näytetään yksi vaihe kerrallaan.

Oletuksena käytössä on **tumma teema**, myös harjoittelussa ja kuvaajissa. Alavalikon **Asetukset → Ulkoasu** -valinnalla voit vaihtaa vaaleaan. Valinta muistetaan tässä selaimessa, ja teeman vaihtaminen säilyttää kesken olevan tehtävän sekä edistymisen.

## Opetus, animaatiot ja äänet

Jokaiselle 33 taidolle on opetuspolku. Yhteensä 15 visuaalista perusmallia havainnollistaa voimia, Newtonin lakeja, komponentteja, hissiä, hihnoja, kaltevaa tasoa, kitkaa, kuvaajia, kiihtyvyyttä, heittoa ja mittausta. Säädä esimerkiksi työntövoimaa tai mäen kulmaa ja seuraa muutosta. Lukuarvot ja sanallinen selitys täydentävät kuvaa. Mallin oletukset kerrotaan opetuksessa.

Liikkuvan animaation voi pysäyttää, aloittaa alusta tai siirtää aikajanalla. Osa malleista muuttuu vain säätimellä. Järjestelmän vähennetyn liikkeen asetus aloittaa animaatiot pysäytettyinä. Kiinteä opetusmalli näyttää periaatteen; satunnaistettu laskuesimerkki vastaa juuri valittua tehtäväperhettä ja poikkeaa omasta tehtävästä.

Palauteäänet ja voimakkuus säädetään **Asetukset → Ääni** -kortissa; samat säätimet ovat opetussivun lopussa **Äänet**-osiossa. Äänet ovat aluksi pois. Sovelluksessa ei ole puheselostusta.

Katsottu opetus tallentuu erikseen. Se ei anna oppimispisteitä tai itsenäisiä onnistumisia. Opettele alusta -kierros etenee ensin vielä katsomattomiin taitoihin perusteista alkaen. Kun opetukset on käyty, valinta painottaa harjoitusta tarvitsevia taitoja. **Kertaa opetus** avaa opetuksen uudelleen; jos avaat sen kesken oman vastauksen, tehtävä kirjataan tuetuksi. Aiempi luonnos säilyy. Lähtötaso, heikkojen kohtien kertaus ja koekierros aloittavat suoraan omista tehtävistä.

## Mitä pelissä on

- **33 satunnaistettua tehtäväperhettä**, joista 17 kattaa viikkotehtävien 3–5 aihepiirit. Loput täydentävät muun aineiston harjoittelua.
- Voimat ja Newtonin lait, hissi, komponentit, hihnat ja kalteva taso; lepo- ja liikekitka; liike, kuvaajat, jarrutus ja pystysuora heitto; valinnaiset mittaustehtävät.
- Laskuja, perustelukysymyksiä, vaihtelevia tilanteita sekä eteenpäin että käänteisesti ratkaistavia tehtäviä soveltuvissa perheissä.
- Tehtävädatasta piirretyt SVG-kuvaajat ja voimakuvat. Voimakuvassa valitset nimettyjen voimien suunnat; valintasi näkyvät nuolina ja tarkistetaan. Ei automaattista käsin piirretyn kuvan tunnistusta.
- Kolme vihjetasoa: havainto, yhtälö ja sijoitus. Lisäksi koko ratkaisuketju ja tuloksen tulkinta.
- Oppimiskierros 8 tehtävää, lähtötaso 9, koekierros 12. Oppimisessa ja kertaamisessa voidaan lisätä enintään kaksi uusintatehtävää eri arvoilla. Koekierrokselle voi valita 30 minuutin tavoiteajan, joka ei katkaise tehtävää.
- Mukautuva tehtävävalinta, yksittäisen aiheen harjoittelu, tuloshistoria ja tallennetut ratkaisukatselmukset 30 viimeiseltä kierrokselta.

**Itsenäinen onnistuminen** tarkoittaa kaikkia kohtia oikein ensimmäisellä tarkistuksella ilman vihjeitä, malliratkaisua tai kaavatukea. Korjattu vastaus ja vihjeillä ratkaistu tehtävä kirjataan tuetuksi. Ratkaisun suora katsominen kirjataan erikseen eikä vahvista itsenäistä osaamista. Vahvistettu taito vaatii vähintään kolme eri tehtävävarianttia ja onnistumisia vähintään kahdella kierroksella. Pelkkä vastausjärjestyksen vaihtuminen ei tee uutta osaamisvarianttia. Tämä on pelin etenemissääntö, ei koetuloksen ennuste.

## Tallennus ja paikallisuus

Edistyminen, katsotut opetukset, opetuksen vaihe, ääni- ja teema-asetukset, luonnosvastaukset ja kesken oleva kierros tallentuvat tämän selaimen localStorageen. Palatessasi voit jatkaa samoilla tehtäväarvoilla. Etusivulle palaaminen säilyttää kierroksen; uuden kierroksen aloittaminen kysyy ensin vahvistuksen ennen kuin kesken oleva korvataan. Jos peli on auki useassa välilehdessä, vanhempi välilehti ottaa uudemman tallennuksen käyttöön eikä ylikirjoita sitä. Nollaus pyytää vahvistuksen.

Tietoja ei lähetetä palvelimelle. Eri laitteiden tai selainten välillä ei ole synkronointia. Eri osoite tai selaimen tietojen tyhjennys voi aloittaa uuden tallennuksen. `file://`-osoitteella pysyvyys vaihtelee selaimittain. Jos tallennus on estetty, peli kertoo siitä ja toimii avoimen sivun muistissa. Pitkäaikaiseen käyttöön GitHub Pages tarjoaa tavallisen HTTPS-osoitteen.

## GitHub Pages

Vie **tämän kansion sisältö** oman repositorion juureen. Aseta GitHubin Settings → Pages → Deploy from a branch → valitse haara → `/(root)`. Vaihtoehtoisesti sisältö voi olla repositorion `/docs`-kansiossa, joka valitaan julkaisulähteeksi.

Sivu ei tarvitse buildia, npm-asennusta tai Actions-työnkulkua. `.nojekyll` estää Jekyll-käsittelyn. Kaikki resurssipolut ovat suhteellisia, joten projektisivun alihakemisto toimii. Pelin resurssit ovat tässä kansiossa, eikä yläkansion alkuperäisiä PDF:iä tai kuvia tarvita tai julkaista.

[GitHubin virallinen julkaisuohje](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site).

Mitään ei ole julkaistu tai pushettu. Git-repositoriota ei ole alustettu tämän työn yhteydessä.

## Puhelimeen PWA:na

Julkaise kansio yllä kuvatusti ja avaa GitHub Pagesin HTTPS-osoite puhelimessa. Ensimmäinen avaus tarvitsee yhteyden. Odota, että **Asetukset**-näkymässä lukee **Valmis myös ilman nettiä**. Silloin pelin koodi, opetus, paikallinen fontti ja materiaalikartta on tallennettu offline-käyttöön.

- **Android / Chrome:** Asetukset → Lisää aloitusnäytölle / Asenna Sprintti. Jos selain ei tarjoa painikekehotetta, käytä sen omaa Asenna sovellus -valintaa.
- **iPhone / Safari:** Jaa → Lisää Koti-valikkoon → Lisää.
- Avaa peli omasta violetista Σ-kuvakkeesta. Se avautuu itsenäiseen sovellusikkunaan. Voit käyttää opetusta, animaatioita ja harjoituksia myös ilman verkkoyhteyttä ensimmäisen onnistuneen tallennuksen jälkeen.

`file://`-avaus toimii edelleen paikallisena pelinä, mutta siitä ei voi asentaa PWA:ta. Paikallisen kehityspalvelimen `localhost` toimii PWA-kehitykseen. Puhelimen asennukseen käytä HTTPS-osoitetta. [MDN:n asennusvaatimukset](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Making_PWAs_installable).

Puhelimen käyttöliittymä käyttää hiilenharmaata pohjaa, laventelin sävyistä korostusta, paikallista Manrope-fonttia, pyöreitä kortteja ja alavalikkoa. Etusivun kaari on **vahvistettujen ydintaitojen osuus 17 ydintaidosta**, ei koetuloksen ennuste tai katsottujen opetusten määrä. Laskukenttä avaa desimaalinäppäimistön; **±** vaihtaa etumerkin. Harjoittelun alareunan toiminto seuraa näkyvän näyttöalueen korkeutta myös näppäimistön avautuessa.

Päivityksestä ilmoitetaan Asetuksissa. Poistu harjoituksesta **Tallenna ja poistu** -painikkeella ja valitse **Ota päivitys käyttöön**; keskeneräinen vaihe ja luonnos säilyvät selaimen tallennuksessa. Uutta versiota ei oteta automaattisesti käyttöön kesken harjoituksen. Julkaisua päivittäessä kasvata `sw.js`:n `VERSION`-arvoa ja tarkista `FILES`-lista. Välimuistin avain sisältää projektin alikansiopolun, joten muiden saman verkkotunnuksen sovellusten välimuisteja ei poisteta.

Käyttöjärjestelmä tai selaimen tietojen tyhjennys voi poistaa offline-tiedot. Edistyminen pysyy laite- ja selainkohtaisena myös asennetussa sovelluksessa. Paikallisesta tiedostosta HTTPS-osoitteeseen siirtyminen ei siirrä vanhoja tuloksia automaattisesti.

Fontti on mukana avoimella SIL Open Font License -lisenssillä (`assets/fonts/OFL.txt`). Fonttia ei ladata pelatessa ulkoiselta palvelimelta.

## Dokumentit

- `ohje.html`: pelaajan käyttöohje pelin ulkoasussa.
- `suunnitelma.html`: materiaalikartta lähteistä ja tehtäväperheistä pelin ulkoasussa.
- `MATERIAALIKARTOITUS.md`: kaikki 26 alkuperäistä lähdetiedostoa, tehtävien lähdekytkennät ja sisältöhuomiot.
- `TOTEUTUSSUUNNITELMA.md`: alkuperäinen tavoite ja toteutusjärjestys.
- `TOTEUTUS.md`: toteutettu laajuus, testaustapa ja tunnetut rajat.

## Testit kehittäjälle

Pelaamiseen ei tarvita Nodea. Laskennan tarkistukset voi ajaa Node 24:llä tai uudemmalla:

```text
node --test tests/physics.test.cjs tests/lessons.test.cjs tests/static.test.cjs
```

Kaikki testit, mukaan lukien jsdomissa ajettavat lomake- ja kierrostestit:

```text
npm install
npm test
```

jsdom on vain kehityksen testityökalu. Sitä tai `node_modules`-kansiota ei tarvita pelissä. Selainrenderöinti ja mobiilin visuaalinen tarkistus on erotettu DOM-testeistä; niiden rajoitus on kuvattu toteutusraportissa.
