perjantai 22. marraskuuta 2013

Viides tunti: Matematiikkaohjelma

Blogilla on ollut jo noin tuhat lukijaa, olen positiivisesti yllättynyt tästä. Kommentoikaa, jos haluaisitte lukea tarkempia tai vähemmän tarkkoja kuvauksia ohjelmien toiminnasta. Ideanani oli tuottaa tekstejä, joiden avulla kuka tahansa voisi pitää muutamia tunteja ohjelmointia ilman aiempaa kokemusta.

Tällä tunnilla on tarkoitus tehdä peli, joka kyselee matemaattisia tehtäviä. Oppilaat tutustuvat kysymys-vastaus -palikoihin, toiminnot-kategoriaan ja joutuvat miettimään laskujen asettelua.

Aloitetaan suorastaan ärsyttävän innostuneella lausahduksella.

 Teen kaksi muuttujaa, joilla muodostan kaikki laskut.
 

 Molempien muuttujien arvot valitaan satunnaisesti välille 1-10. Tietenkin luvut voisivat olla suurempia tai käyttäjä voisi valita suuruusluokan itse. Nyt mennään tällaisilla.


 Tehdään kysymyslause. Tähän tarvitaan vihreästä Toiminnot-kategoriasta "yhdistä"-palikoita, jotta voin yhdistää samaan pötköön muuttujia ja sanoja.


 Rakennan "yhdistä"-palikoista ketjun.

Tekstiin pitää muistaa jättää välilyöntejä muuttujien molemmille puolille, muuten sanat ja muuttujien luvut kirjoitetaan yhteen kissan puhekuplissa.


 Nyt kysymyslauseessa on yhdistettynä "Paljonko on_", arvottu muuttuja 1, "_plus_", arvottu muuttuja 2 ja kysymysmerkki.


Kysymyksen jälkeen tarvitaan jotain, joka kertoo oliko vastaus oikein. Teen tämän jos-muuten -palikalla. Jos-lauseeseen merkitään vastaus yhtäsuureksi muuttujien summan kanssa.


Jos vastaus on oikein, Jos-lause suoritetaan. Väärin mennyt vastaus suorittaa Muuten-lauseen. Tässä vaiheessa ohjelma vain onnittelee tai sanoo laskun menneen väärin.

 Ohjelma toimii ihan niinkuin pitääkin.

 Koska kyseessä on peli, pitää siinä olla jonkinmoinen pistelaskurikin. Teen uuden muuttujan, jota oikein mennyt lasku kasvattaa yhdellä. Lisäsin alkuun muuttujan nollauksen.


Annoin oppilaille tehtäväksi tehdä erilaisia laskuja kysyvän ohjelman. Toteutustapoja oli monenlaisia. Jotkut kysyivät pelaajalta mitä laskuja haluttiin treenata, jotkut kysyivät laskuja samassa järjestyksessä. Minä tein muuttujan, joka arpoo joka kerta plus-, miinus-, kerto-, jako-, potenssi- ja neliöjuurilaskun väliltä. Teen muuttujan "Lasku".


Laskulle arvotaan satunnaisluku väliltä 1-6 ja jokainen laskutyyppi laitetaan oman Jos-lauseensa sisään. Jos "Lasku" on esimerkiksi 1, ohjelma kysyy pluslaskun. Jos muuttuja on 4, ohjelma kysyy jakolaskun.


Jakolaskut muodostuvat todella vaikeiksi, jollei asiaa mieti yhtään etukäteen. Esimerkiksi 5/7 olisi n. 0,714285.. Tämä täytyy kiertää jotenkin.  Kerron luvut 1 ja 2 kysymyksessä ja pyydän jakamaan tuloksen luvulla 2. Tällöin luvut ovat automaattisesti jaollisia ja tuloksena toimii luku 1.


Potenssilasku tehdään melkein samalla tavalla. Kysymyksessä on vain luku 1 ja vastauksen Jos-lauseessa luku 1 on kerrottu itsellään.


Neliöjuurilaskussa sama juttu tehdään taas päinvastoin. Luku 1 kerrotaan itsellään kysymyksessä ja vastauksessa luku 1 on yksinään.


Pelattavuutta  voidaan parantaa vielä pelikellolla.


Alkutervehdyksiin menee yhteensä 4 sekuntia, joten laitan skriptin odottamaan sen verran alussa. Kaksi minuuttia tuntuu sopivan pitkältä ajalta ennätyksien hakkaamiseen. Skripti pysähtyy, kun aika on mennyt loppuun.


Jätin tässä esimerkissä visuaalisuuden täysin toissijaiseksi. Oppilaat tekivät hahmoilleen voitontansseja, pisteisiin prosenttilaskureita ja muuta pelattavuuteen vaikuttavaa. Yksi hauskimmista oli kysymyksiä esittävä Einstein, jonka pää oli animoitu South Park-tyylisesti.

Esimerkkiä voi käydä pelaamassa täällä.

torstai 14. marraskuuta 2013

Neljäs tunti, autopelin animointi ja parantelu

Tällä tunnilla on tarkoitus animoida auton liike ja "ulosajo", tehdä parhaan kierrosajan näyttävä "tulostaulu", sekä viimeistellä pelin ulkonäkö ja pelattavuus.

Paras kierrosaika


Tehdään uusi muuttuja "paras kierrosaika". Kirjoitin sen pienellä, koska kun hahmon nimi on "Punaisen", tulee tulostauluun "Punaisen paras kierrosaika". Tämä muuttuja on vain tälle hahmolle, joten samaa skriptiä voidaan käyttää myös "Sinisen"-hahmolle.

Aloitan skriptin vihreällä lipulla. Asetetaan muuttuja riittävän korkeaksi, jotta se on helppo alittaa. Seuraavaksi nollataan ajastin ja aloitetaan ikuisesti ehtoa tarkistava silmukka. Silmukan sisään laitan jos-lauseen, johon laitetaan tuntoaisti-kategoriasta valkoisen värin tunnistava ehto. Nyt jos-lauseen sisältö luetaan vain, kun hahmo koskettaa valkoista väriä.
 Lisään jos-lauseen sisään jos-muuten-lauseen. Tämä suorittaa jos-osuuden silloin kun jos-lauseen ehto täyttyy, muulloin suoritetaan "muuten"-lause.
 Tutustuimme "Toiminnot"-kategoriaan. Sen sisältä löytyvät yleisimmät laskutoimitukset, kahden muuttujan vertailu ja loogiset lauseet.
 Koska haluan verrata kierrosaikoja keskenään, otan käyttöön "pienempi kuin"-lauseen. Lause vedetään jos-lauseen ehdoksi.
 Tuntoaisti-kategoriasta löytyy ajastin, joka voidaan vetää lauseen vasemmalle puolelle.
 Oikealle puolelle vedän muuttujat-kategoriasta "paras kierrosaika"muuttujan. Muuttujalle annettiin arvoksi 30 tämän skriptin alussa, joten nyt hahmon ylittäessä maaliviivan jos-lause vertaa ajastimen lukemaa alussa annettuun arvoon 30.
 Jos ajastimen lukema on pienempi, "paras kierrosaika"-muuttuja asetetaan ajastimen arvoon. Seuraavalla kierroksella ajastimen lukemaa verrataan tähän edelliseen aikaan.

 Jos ajastimen arvo ei olekaan pienempi, skripti suorittaa muuten-lauseen. Nyt hahmo sanoo "Ei suju!", mikäli ei onnistu alittamaan edellistä parasta aikaa.
 Lisätään vielä ensimmäisen jos-lauseen loppuun ajastimen nollaus, jotta ohjelma ryhtyy kellottamaan uutta kierrosta aina kun maaliviiva on ohitettu. Jos tähän ei lisätä viivettä parhaaksi kierrosajaksi tulee 0 sekuntia, sillä ohjelma ehtii tarkistaa jos-lauseen monta kertaa auton ylittäessä maaliviivan. Lisäämällä sekunnin viive ajastimen nollauksen jälkeen, auto ylittää viivan ja uusi "paras kierrosaika" on oikeasti paras kierrosaika.
 Olisi hölmöä, jos ohjelma väittäisi aluksi parhaaksi kierrosajaksi 30 sekuntia. Ongelma poistuu lisäämällä "Piilota muuttuja"-palikka alkuun ja "Näytä muuttuja" maaliviivan ylittämisen jälkeen. Nyt parasta kierrosaikaa ei näytetä ennen kuin sellainen on ajettu.
 Tulostaulun voi laittaa haluamalleen kohdalle ruutua.
 Jotta paras aika saadaan näkyviin myös siniselle hahmolle, se voidaan vetää punaiselta hahmolta siniselle.
"paras kierrosaika"-muuttuja täytyy käydä klikkaamassa aktiiviseksi Muuttujat-kategoriasta.

Animoinnit

Animoidaan ensin auto. Tehdään alkuperäisestä autosta pari-kolme erilaista versiota, jossa liikettä voi yrittää saada näkyväksi liikuttamalla koria renkaiden suhteen ja laittamalla pieniä pakokaasutuprahduksia auton takaosaan. Muokkaan ensimmäistä autohahmoa hieman.
 Pieni pakokaasutuprahdus.
 Tämän jälkeen kopioin ensimmäisen auton ja teen siihen lisää muokkauksia. Toistan työn ja teen kolmannenkin asusteen. Renkaat liikkuvat hieman ja pakoputkesta tulee mustia pisteitä.
 Aloitan uuden skriptin, joka ohjaa vain liikkettä. Kun vihreää lippua klikataan, asuste vaihtuu ensimmäiseen asusteeseen ja skripti odottaa 0,1 sekuntia.
 Kopioin palikat ja vaihdan kopioituihin palikoihin asuste1-kohdan asuste2:ksi ja asuste3:ksi

 Animoidaan myös törmäykset. Aiemmin on tehty alla oleva skripti, joka kadottaa hahmon näkyvistä, kun se osuu vihreälle pohjalle. Jos autolle halutaan tehdä törmäysanimaatio, se täytyy laittaa ehdolliseksi muun animoinnin mukaan. Muuten ohjelma yrittää pyörittää kahta animaatiota päällekkäin. Siirretään alla olevasta skriptistä jos-lause liikeanimaation mukaan.
 Nyt liikeanimaatiossa on mukana ehdollinen "Jos hahmo osuu vihreään"-kohta.


 Siirretään alussa ollut ollut "Mene kohtaan"-palikka liikkumiseen tarkoitetun skriptin alkuun.

Kopioin taas auton ja teen neljä erilaista räjähdys/palamiskuvaa



 Nyt kun asusteet ovat valmiit, lisään ne "Jos koskettaa vihreää"-ehtolauseen sisään. Asu vaihtuu 0,2 sekunnin välein, kunnes auto katoaa näkyvistä 0,2 sekunnin ajaksi ja ilmestyy lähtöpisteeseen. Asuste pitää vaihtaa takaisin asuste1:ksi ennen siirtoa, muuten asu vaihtuu vasta kun hahmo on näkyvissä. Suurempi asuste lähtöpaikalla ylittää helposti lähtöviivan, jolloin parhaat ajat ja kierrosluvut menevät miten sattuu.





  Nyt ohjelmassa on virhe. Kun auto törmää seinään, sen pitäisi palaa paikallaan ja siirtyä sitten alkupisteeseen. Tällaisenaan ohjelma antaa ohjata palavaa autoa vielä eteenpäin. Lisätään liike-skriptiin ehtolause, joka pysäyttää auton sekunniksi sen osuessa vihreälle alustalle.


 Koska olen laiska, en halua animoida sinistä autoa erikseen. Poistan vanhan sinisen auton kopioin punaisen auton skripteineen päivineen, nimeän kopion "Sinisen"-nimiseksi ja vaihdan ohjaamiseen tarvittavat nappulat.

 Jokainen asuste pitää maalata uudelleen erikseen, mutta tästä ei ole juurikaan vaivaa.

 Yksi oppilaista ehdotti lähtölaskennan rakentamista. Tämä tehdään omana hahmonaan, jolle tehdään neljä erilaista asustetta.
 Asuste vaihtuu 0,2 sekunnin (vaihdettiin myöhemmin 0,5 sekuntiin) välein sen jälkeen, kun vihreää lippua on painettu. Nyt tulee kuitenkin ongelma, kun ajastimet ja kellot lähtevä myös käyntiin vihreästä lipusta. Asia korjataan Ohjaus-kategoriasta löytyvällä "Lähetä"-palikalla. Tämä lähettää signaalin, jolla voi aloittaa muita skriptejä. Tämä ei suinkaan ole pakollinen tässä, mutta harjoituksen vuoksi käytämme tätä. Eli: Lähetyshahmo laskee 3, 2, 1, AJA! ja skripti lähettää Aja-signaalin.

 Vaihdoin kaikkiin muihin skripteihin aloituspalikaksi "Kun vastaanotan 'Aja'"

 Aloitushahmon asusteet vaihtuivat vähän liian nopeasti 0,2 sekunnin odotusajalla, joten se nostettiin 0,5 sekuntiin. Nyt vihreää lippua painamalla ohjelma näyttää hahmon, vaihtaa asustetta 0,5 sekunnin välein, lähettää Aja-signaalin viimeisen asusteen vaihduttua, näyttää tuota asustetta 0,5 sekuntia ja menee piiloon.
 Tähän tuli taas ideoita oppilailta, joten nyt yritetään saada Aja!-teksti katoamaan tyylikkäästi pyörähtäen kaukaisuuteen. Ensin hahmo laitetaan normaalikokoiseksi ja osoittamaan oikeaan suuntaan. Aja!-teksti näkyy yhden sekunnin, kääntyy sen jälkeen 5 astetta myötäpäivään ja pienenee 5 askelta. Kääntöä ja pienennystä toistetaan 20 kertaa, jonka jälkeen hahmo häviää. Mikäli alkuun ei laiteta näytä-komentoa, eikä kokoa ja suuntaa oikeiksi, seuraava peli alkaa pienemmällä ja kääntyneellä hahmolla.

 Tietokoneluokassamme ei ole kaiuttimia koneissa, joten äänipuolen jätän kokonaan tyhjäksi. Jotkut oppilaat tekivät päristelyefektit mikrofonin kanssa. Itsetehdyt efektit olivat erittäin hauskan kuuloisia.

Esimerkkirallia voi käydä ihastelemassa täällä.