(H) Lukusarjapeli

Tavoite: Harjoittelen ohjausrakenteiden toteuttamista C++:ssa (eli valintarakennetta ja toistorakennetta) sekä lisää versionhallinnan käyttämistä.

Ohjeita: Tässä tehtävässä haet ensin ohjelmakoodipohjan käyttöösi hakemistosta templates/02/number_series_game (kopioi hakemistoon student/02/number_series_game) ja avaat projektin Qt Creatorissa (ks. 1.7.1 Kurssin palautuskäytäntö, vaiheet 1-2).

Lisäohje

Toteutat ratkaisussa tarvittavan ohjelmakoodin kolmessa vaiheessa tehtävänannon ohjeiden mukaisesti. Jokaisessa vaiheessa sinun pitää ensin viedä tekemäsi muutokset työkopiosta paikalliseen tietovarastoosi (commit) ja tämän jälkeen paikallisesta tietovarastosta keskustietovarastoosi (push). Toistat siis kolme kertaa edellisessä tehtävässä suorittamasi vaiheen 4. Lopuksi vielä palautat tuotoksesi Plussaan eli suoritat edellisen tehtävän ohjeista vaiheen 5.

Seuraa tehtävänannon ohjeita tarkasti. Tehtävässä testataan muitakin versionhallinnan ominaisuuksia, eli ei vain toisteta kolme kertaa aiemmin opittua.

Tehtävänanto

Eräässä pelissä pelaajat istuvat ringissä ja luettelevat jokainen vuorollaan lukuja siten, että pelin aloittaja sanoo luvun 1, hänen vieressään istuva luvun 2, ja seuraavaksi tulee tietenkin hänen vieressään istuva henkilö. Jotta peli ei olisi liian yksinkertainen, sanotaan kolmella jaollisten lukujen kohdalla “zip”, seitsemällä jaollisten lukujen kohdalla “boing” ja sekä kolmella että seitsemällä jaollisten lukujen kohdalla “zip boing”.

Toteuta valmiiseen ohjelmakoodipohjaan ohjelma, joka tulostaa lunttilapun peliä pelaavalle jakolaskutaidottomalle henkilölle. Aluksi ohjelma kysyy, kuinka pitkälle lukuja tulostetaan.

Esimerkki ohjelman toiminnasta:

How many numbers would you like to have? 10
1
2
zip
4
5
zip
boing
8
zip
10

Ohjelmakoodin kirjoittaminen vaiheittain

Toteuta ohjelma vaiheittain seuraavasti:

  1. Lähde muokkaamaan ohjelmakoodipohjaa. Toteuta ensin vain ohjelma, joka kysyy käyttäjältä, kuinka monta numeroa lunttilapulle tulostetaan, ja tulostaa luvut omille riveilleen, eli ohjelma toimii seuraavasti:

    How many numbers would you like to have? 6
    1
    2
    3
    4
    5
    6
    

    Kun saat tämän vaiheen valmiiksi, tallenna työsi tulos ensin paikalliseen tietovarastoosi ja sieltä vielä keskustietovarastoon (edellisen tehtävänannon vaihe 4 eli commit ja push). Kirjoita commit-viestiksi esimerkiksi “Syötteen lukeminen ja numeroiden tulostus”.

  2. Lisää seuraavaksi ohjelmaan merkkijonon “zip” tulostus. Eli kolmella jaollisia numeroita ei tulosteta, vaan niiden tilalla tulostetaan merkkijono “zip”.

    Kun saat tämän vaiheen valmiiksi, tallenna työsi tulos uudelleen paikallisen tietovaraston kautta keskustietovarastoon (commit ja push). Kirjoita tällä kertaa commit messageksi esimerkiksi “Lisätty 3:lla jaollisten lukujen käsittely”.

  3. Viimeistele ohjelma, eli lisää vielä merkkijonon “boing” tulostukset. Nyt ohjelmasi pitää toimia kuten tehtävänannon alussa olleessa esimerkkiajossa. Huomaathan, että sekä 3:lla että 7:llä jaollisten numeroiden kohdalla tulee tulostua “zip boing”.

    Älä kuitenkaan vielä tallenna työtäsi keskustietovarastoon (commit ja push)! Kokeillaan ensin versionhallinnan toimintaa hiukan monipuolisemmin.

  4. Git:n toiminto diff osaa näyttää, mitä muutoksia ohjelmakoodiin on tehty viimeisen commitin jälkeen. Tallenna tiedosto Qt Creatorissa ja katso sen jälkeen, mitä toiminto Tools > Git > Current File > Diff of main.cpp näyttää. Vaihtoehtoisesti voit käyttää komentoriviä (Terminal).

  5. Vie nyt tekemäsi muutokset paikalliseen tietovarastoon (tee commit), mutta älä vielä keskustietovarastoon (älä siis tee push). Kirjoita tällä kertaa commit messageksi esimerkiksi “Lisätty myös 7:llä jaollisten lukujen käsittely”.

    Katso tässä vaiheessa uudelleen, mitä toiminto diff näyttää Qt Creatorissa.

    Kokeillaan nyt yhtä tyypillistä tapaa tehdä virhe ohjelman palauttamisessa. Palauta tehtävä klikkaamalla tämän sivun alareunassa olevaa Lähetä-nappulaa. Voit huoletta tehdä tämän virheellisen palautuksen. Tässä tehtävässä on poikkeuksellisesti huomattavasti enemmän palautuskertoja kuin muissa tehtävissä.

  6. Jos olet noudattanut yllä olevia ohjeita, palautus siis epäonnistui. Tutkitaan nyt miksi näin kävi.

    Avaa selaimessa Git-keskustietovarastosi, eli syötä selaimen osoiteriville tietovarastosi URL (kahdesta osoitteesta se, jonka lopussa ei lue .git). Tämän web-käyttöliittymän kautta pääset tutkimaan keskustietovarastoasi. Keskustietovaraston sisältöä pitää tutkia selaimella, koska se ei sijaitse käyttämälläsi tietokoneella (suurimmalla osalla siis linux-desktopilla) vaan palvelinkoneella.

    Heti etusivulla näkyy aina koko projektin uusin tila ja jokaisen kansion ja tiedoston kohdalla viimeisimmän kyseistä kansiota tai tiedostoa koskevan commitin commit-viesti.

    Vasemmalta valikosta löytyy kohta </>Code ja sen alta Commits. Sieltä näet, mitkä commiteista on tallennettuna keskustietovarastoosi. Täällä näkyvät siis kaikki ne commitit, jotka on myös viety keskustietovarastoon pushilla. Kurssin automaattinen arviointi suorittaa tarkastukset sille ohjelmakoodiversiolle, joka täällä näkyy viimeisenä. Muutoksia edelliseen committiin verrattuna voit tutkia klikkaamalla haluamaasi commit-viestiä.

  7. Palaa nyt takaisin Qt Creatoriin tai komentoriville. Tee “unohtunut” push-operaatio ja suorita nyt työn palautus alla olevalla lomakkeella. Käy vielä myös katsomassa selaimesta, näetkö nyt viimeisenkin commitin.

Edellisissä kohdissa havaitsit, että versionhallinnan käyttäminen ja työn palauttaminen ovat kaksi erillistä asiaa. Koska toteutit ohjelman useammassa vaiheessa näet tietovarastostasi, miten työn tekeminen on edistynyt ja voit tarkastella eri välivaiheita.

Versionhallintaa ei siis käytetä vain palauttamiseen, vaan sillä on oma tehtävänsä ohjelman eri versioiden säilyttämisessä. Kun ohjelmien koko kasvaa, on talletetuista välivaiheista enemmän hyötyä esimerkiksi ongelmatilanteissa. Jatkossa tällä opintojaksolla on sekä tehtäviä, joiden tehtävänannossa sanotaan, minkälaisissa osissa tehtävä pitää toteuttaa, että tehtäviä, jotka saat jakaa välivaiheisiin haluamallasi tavalla. Olennaisinta on harjoitella versionhallinnan käyttämistä, eli vain kaikkein pienimmät tehtävät voi kirjoittaa ilman välivaiheita.

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