(P) Tammi¶
Tavoite: Harjoittelen vektorin sekä Gitin käyttöä. Lisäksi opin noudattamaan ohjelmoinnin tyylisääntöjä.
Ohjeita:
Hae ohjelmakoodipohja: templates/04/checkers
-> student/04/checkers
.
Koodipohjassa on annettu tulostusmetodin runko, mutta sinun pitää lisätä siihen peliruudukon alkion tulostaminen. Vaihtoehtoisesti voit kirjoittaa tulostusmetodin kokonaan itse.
Tehtävänäsi on toteuttaa yksin pelattava tammipeli. Ohjelma saa syötteenään pelimerkin (tulostettavan merkin), jota käytetään pelilaudan täyttämiseen.
Tärkeää
Ennen kuin aloitat, lue huolellisesti koko tehtävänanto. Huomaa erityisesti kohdat Ohjelman toteuttaminen osissa (vaaditut commitit), Erityisvaatimukset sekä Arviointi.
Kohdasta Arviointi huomaa erityisesti, että ohjelman pitää ensin läpäistä kaikki automaattitestit. Muuten työ ei mene assistenttien arvioitavaksi, eikä siitä saa pisteitä.
Huomautus
Tämän projektin saa (mutta ei ole pakko) tehdä parityönä. Paripalautusta varten tulee muodostaa ryhmä palauttamalla lomake, joka löytyy vasemman puolen valikosta otsikolla “Luo uusi ryhmä”. Lisäksi tämän sivun alaosan palautuslaatikkossa on näkyvissä kaksi vaihtoehtoa: “Palauta yksin” / “Palauta ryhmässä”. Ole tarkkana, että valitset oikean vaihtoehdon, koska valintaa ei voi myöhemmin perua. Palautuslaatikkoon tulee vain jommankumman jäsenen Git-repositorion osoite. Kirjoittakaa kooditiedoston kommentteihin molempien nimet ym. muut tiedot.
Ryhmää voi etsiä Kooditorion Discord-linkin kautta (ks. Aikataulu & linkit).
Alkukommentti ja palautteen kieli¶
Tämän osion kohdassa Arviointi vaaditaan kooditiedoston alkukommentti. Sillä tarkoitetaan esimerkiksi seuraavan tyylistä kommenttia:
/* Tammipeli (yhdelle pelaajalle)
*
* Kuvaus:
* Ohjelma toteuttaa tammipelin yhdelle pelaajalle. Pelilaudan koko
* on 8 x 8, ja se täytetään tyhjillä sekä pelinappuloilla (käyttäjän
* valitsema merkki).
* Pelilauta on aluksi täynnä nappuloita, mutta keskellä on 4 x 4
* -kokoinen alue tyhjää. Tarkoitus on saada pelilauta tyhjennettyä
* niin, että jäljellä on vain yksi pelinappula. Nappulaa voi siirtää
* viistosti toisen nappulan yli, jolloin poistetaan se nappula, jonka
* yli hypättiin.
* Joka kierroksella käyttäjältä kysytään kahta pistettä (neljää
* koordinaattia): siirrettävää nappulaa ja sen kohdesijaintia.
* Ohjelma tarkistaa, voidaanko siirto tehdä.
* Ohjelma päättyy, kun pelilaudalla on enää yksi pelinappula tai kun
* käyttäjä antaa lopetuskomennon (merkki 'q' tai 'Q'). Tällöin ohjelma
* tulostaa, kuinka monta siirtoa tehtiin ja kuinka monta nappulaa on
* vielä jäljellä.
*
* Ohjelman kirjoittaja ( Täytä omilla tiedoillasi )
* Nimi: Teemu Teekkari
* Opiskelijanumero: 123456
* Käyttäjätunnus: teekkart ( Git-repositorion hakemistonimi. )
* E-Mail: teemu.teekkari@tuni.fi
*
* Huomioita ohjelmasta ja sen toteutuksesta (jos sellaisia on):
*
* */
Lisää siis yllä olevan tapainen kommentti tiedoston main.cpp
ihan alkuun.
Myös muissa kooditiedostoissa pitää olla opiskelijakohtaiset tiedot, mutta
kuvausosuutta ei tarvitse toistaa jokaisessa tiedostossa, riittää, että se
on pääohjelmatiedostossa.
Voit kirjoittaa kommentin myös englanniksi (ks. englannikielinen tehtävänanto), mutta kirjoita kaikki kommentit samalla kielellä. Muista vaihtaa yllä olevaan kommenttiin omat henkilökohtaiset tietosi.
Jos teette parityötä, muistakaa lisätä molempien henkilökohtaiset tiedot.
Pohjakoodi on kommentoitu sekä suomeksi että englanniksi, voit poistaa tarpeettomat kommentit.
Palautteen kieli valitaan palautuslaatikossa (tämän sivun lopussa). Palautteen kielenä on oletuksena suomi, mutta voit vaihtaa sen, jos haluat assistenttien antaman palautteen englanniksi. Kielivalinta määräytyy sen perusteella, minkä kielivalinnan olet tehnyt viimeisimmän palautuksen palautuslaatikossa.
Tammipeli vs vesipisarapeli¶
Tällä kierroksella kuvataan vesipisarapeli,
jossa on käytetty vektoreita, jonka alkiot ovat vektoreita.
Edelleen sisemmän vektorin alkiot ovat ruutuja (Square
-olioita).
Tässä projektissa on samanlainen rakenne siinä mielessä, että myös
tammipelin peliruudukko on vektori, jonka alkiot ovat vektoreita.
Tässä kuitenkin sisemmän vektorin alkiot ovat merkkejä tai
luettelotyypin (enum
) arvoja,
eli ne ovat yksinkertaisempia kuin vesipisarapelin ruudut, ja siksi niitä ei
tarvitse kuvata luokkana.
Vesipisarapelissä jokaisella ruudulla on osoitin pelilautaan, koska jokaisen ruudun pitää tuntea viereiset ruudut. Projektissa ei ole tarvetta tällaiseen eikä osoittimiin muutenkaan.
Tehtävänanto¶
Tehtävänä on toteuttaa tammipelin variaatio, jossa pelaajia on vain yksi.
Alussa ohjelma kysyy merkkiä, jolla pelilauta täytetään. Sitten ohjelma tulostaa pelilaudan täytettynä annetulla merkillä:
Enter piece character: *
=======================
| | 1 2 3 4 5 6 7 8 |
-----------------------
| 1 | * * * * * * * * |
| 2 | * * * * * * * * |
| 3 | * * * * |
| 4 | * * * * |
| 5 | * * * * |
| 6 | * * * * |
| 7 | * * * * * * * * |
| 8 | * * * * * * * * |
=======================
Enter start point (x, y) and destination point (x, y), or q to quit:
Sen jälkeen käyttäjä voi antaa kaksi pistettä x- ja y-koordinaatteineen eli yhteensä neljä lukua (välilyönneillä eroteltuna).
Jos käyttäjän antamat koordinaatit ovat sellaisia, että nappula voidaan siirtää lähtöpisteestä kohdepisteeseen, tehdään kyseinen siirto. Muussa tapauksessa ohjelma ilmoittaa virheellisestä syötteestä.
Käyttäjän antamista pisteistä tutkitaan seuraavat asiat:
- Annettujen pisteiden pitää koostua luvuista.
- Annettujen pisteiden pitää sijaita pelilaudalla.
Jos jompikumpi yllä mainittu ehto ei päde, ohjelma tulostaa:
Invalid start/destination point.
Jos yllä mainitut ehdot pätevät, tutkitaan vielä seuraavat ehdot:
- Lähtöpisteessä pitää olla nappula.
- Kohdepisteen pitää olla tyhjä.
- Lähtöpisteen ja kohdepisteen pitää sijaita viistosti toisiinsa nähden niin, että niiden välissä on täsmälleen yksi nappula (välissä ei siis saa olla tyhjää).
Jos näin ei ole, ohjelma tulostaa virheilmoituksen:
Cannot move from start point to destination point.
Tarkemmat virheilmoitukset näkyvät esimerkkiajossa:
Enter piece character: #
=======================
| | 1 2 3 4 5 6 7 8 |
-----------------------
| 1 | # # # # # # # # |
| 2 | # # # # # # # # |
| 3 | # # # # |
| 4 | # # # # |
| 5 | # # # # |
| 6 | # # # # |
| 7 | # # # # # # # # |
| 8 | # # # # # # # # |
=======================
Enter start point (x, y) and destination point (x, y), or q to quit: xx yy 1 2
Invalid start/destination point.
Enter start point (x, y) and destination point (x, y), or q to quit: x x y y 1 2
Invalid start/destination point.
Enter start point (x, y) and destination point (x, y), or q to quit: 0 1 2 3
Invalid start/destination point.
Enter start point (x, y) and destination point (x, y), or q to quit: 2 3 9 9
Invalid start/destination point.
Enter start point (x, y) and destination point (x, y), or q to quit: 1 8 4 5
Cannot move from start point to destination point.
Enter start point (x, y) and destination point (x, y), or q to quit: 3 6 1 8
Cannot move from start point to destination point.
Enter start point (x, y) and destination point (x, y), or q to quit: 1 6 3 6
Cannot move from start point to destination point.
Enter start point (x, y) and destination point (x, y), or q to quit: 1 8 3 6
=======================
| | 1 2 3 4 5 6 7 8 |
-----------------------
| 1 | # # # # # # # # |
| 2 | # # # # # # # # |
| 3 | # # # # |
| 4 | # # # # |
| 5 | # # # # |
| 6 | # # # # # |
| 7 | # # # # # # # |
| 8 | # # # # # # # |
=======================
Enter start point (x, y) and destination point (x, y), or q to quit: 1 5 3 3
=======================
| | 1 2 3 4 5 6 7 8 |
-----------------------
| 1 | # # # # # # # # |
| 2 | # # # # # # # # |
| 3 | # # # # # |
| 4 | # # # |
| 5 | # # # |
| 6 | # # # # # |
| 7 | # # # # # # # |
| 8 | # # # # # # # |
=======================
Enter start point (x, y) and destination point (x, y), or q to quit: q
2 move(s) made.
46 piece(s) left.
Ohjelman toteuttaminen osissa¶
Käytä versionhallintaa projektia tehdessäsi siten, että versionhallinnasta löytyy vähintään viisi committia seuraavasti:
- Ohjelma kysyy pelinappulamerkin ja tulostaa peliruudukon.
- Ohjelma lukee käyttäjän antamat pisteet ja tarkistaa niiden oikeellisuuden.
- Ohjelma osaa hypätä annettujen pisteiden välissä olevan pelinappulan yli ja poistaa sen.
- Lisäksi sinun on tehtävä vähintään kaksi muuta committia (edellämainittuja ennen, niiden jälkeen tai niiden välissä).
Edellä mainitut välivaiheet pitää myös olla commit-viesteissä mainittu selkeästi, jotta assistentti löytää ne helposti työtä tarkastaessaan. Voit kuitenkin jakaa yllä lueteltuja committeja useaksi commitiksi.
Vinkkejä tehtävän tekemiseen¶
- Ohjelmassa riittää käyttää STL:n
vector
-säiliöitä, mutta halutessasi voit käyttää muitakin STL:n säiliöitä.
- Vesipisarapelistä voit katsoa mallia sellaisen vektorin määrittelyyn,
jonka alkiot ovat vektoreita (
square.hh
, rivi 12). Muilta osin esimerkki ei ole kovin oleellinen.
Erityisvaatimukset¶
Ohjelmassa pitää käyttää pohjakoodissa annettua luokkaa (GameBoard
).
Kiinnitä huomiota siihen, mitä koodia toteutat tähän luokkaan ja
mitä pääohjelmamoduuliin.
Mitä attribuutteja luokalla voisi luontevasti olla?
Entä mitä metodeja sillä voisi olla?
Kirjoita pelilautaa käsittelevät metodit edellä mainittuun luokkaan, kun taas esimerkiksi käyttöliittymää käsittelevä koodi (esimerkiksi syötteiden lukeminen) sopii pääohjelmamoduuliin.
Arviointi¶
Jotta työ päätyisi assistenttien arvioitavaksi, sen pitää ensin läpäistä automaattitestit. Automaattitestit eivät hyväksy ohjelmaa, jonka kääntäminen tuottaa varoituksia. Jos saat automaattitesteistä 0 pistettä, myös lopullinen pistemääräsi on 0, eikä työ mene assistenttien arvioitavaksi.
Assistentti arvioi ja pisteyttää automaattitestit läpäisseistä (= 1 p) töistä viimeisimmän Plussa-palautuksen, joka on tehty määräajan loppuun mennessä, seuraavien arviointikriteerien mukaan:
- Ratkaisun yleisperiaate: 0-20 pistettä:
- Tehtävän osaamistavoitteet on saavutettu.
- Ohjelmakoodi on jaettu funktioita, luokkia ja/tai metodeita käyttäen loogisiksi kokonaisuuksiksi, jotka ovat sopivan pituisia.
- Jos luokkia/olioita on käytetty, n on toteutettu olio-ohjelmoinnin periaatteita noudattaen (ks. edellinen materiaaliosio: Tyyliseikkoja, erityisesti kohta Olio-ohjelmointi).
- Tietorakenne ei sisällä toisteista eikä turhaa tietoa. Valittuja tietorakenteita on käytetty järkevästi.
- Ohjelmakoodi ei sisällä turhaa toisteisuutta eikä muutakaan turhaa.
- Ohjelmakoodi ei sisällä tarpeettomia rajoitteita tai oletuksia tai muita väkinäisiä ratkaisuita.
- Ohjelmarakenteet on toteutettu helposti ymmärrettäviksi.
- Ohjelmakoodissa ei ole käytetty globaaleja muuttujia (globaalit const-vakiot ovat OK).
- Ohjelman toimintaa ei lopeteta
exit
-funktiota käyttäen.
- Ohjelmointityyli: 0-20 pistettä:
- Muuttujat ja funktiot nimetty selkeästi ja kuvaavasti. Nimeämisessä on käytetty vain yhtä kieltä, ei esim. suomea ja englantia sekaisin.
- Koodissa on käytetty nimettyjä vakioita taikalukujen sijasta.
- Ohjelmakoodi on asemoitu siististi.
- Ohjelmakoodirivit ovat enintään 80 merkkiä pitkiä.
- Jokaisen tiedoston alussa on kommentti, josta käy ilmi tiedoston tarkoitus, työn tekijä(t) ja muut tarvittavat tiedot (ks. kohta Alkukommentti).
- Jokaisen funktion/metodin alussa on kommentti, joka kuvaa sen toiminnan, paluuarvon ja parametrit. Tämä kommentti kirjoitetaan otsikkotiedostoon, jos sellainen on olemassa.
- Kommentteja on muutenkin tarpeellisissa kohdissa.
- Kommentit liittyvät toteutettuun ohjelmaan eivätkä johonkin sen vanhempaan versioon.
- Kaikki kommentit on kirjoitettu samalla kielellä (fi/en), mutta kommentoinnissa saa käyttää eri kieltä kuin muuttujien ym. nimissä.
- Kaikki muuttujat on alustettu.
- Kääntäjä ei anna koodia käännettäessä varoituksia.
- Versionhallinnan käyttö: 0-10 pistettä:
- Committeja on riittävä määrä.
- Commit-viestien sisältö on selkeä ja kuvaava.
Huomautus arvioinnista
Automaattitesteillä tarkistetaan, toimiiko ohjelma. Assistentit taas kiinnittävät huomiota tyyliseikkoihin ym. yllä lueteltuihin kriteereihin. Periaatteessa on siis mahdollista, että täysin toimivasta ohjelmasta saa nolla pistettä, jos ohjelma ei täytä yllä lueteltuja vaatimuksia.
Erityisesti tyylivaatimuksista on kerrottu tämän kierroksen aikaisemmassa materiaaliosiossa.
Huomautus arvosteltavan työn versiosta
Arvosteluun otetaan ohjelman se versio, josta on tehty viimeisin onnistunut Plussa-palautus (määräaikaan mennessä). Onnistuneella palautuksella tarkoitetaan palautusta, joka on läpäissyt automaattitestit.
Ensimmäisen onnistuneen Plussa-palautuksen jälkeen haluat todennäköisesti vielä korjailla koodisi tyyliä (esim. lisätä kommentteja), jos vain palautusaikaa on vielä jäljellä.
Muista lopuksi kuitenkin tämä: Kun olet palauttanut viimeisen version Gittiin, palauta se vielä kerran Plussaan.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.