Tehtäviä ei ole päivitetty. Tekeminen omalla vastuulla!

Allaolevien tehtävien deadline on perjantai 20.12. klo 23:59

Apua tehtävien tekoon kurssin Discord-kanavalla, kampuksella pajassa BK107:

  • ma 14-16
  • to 13-15
  • pe 12-14

Muista myös tämän viikon monivalintatehtävät, joiden deadline on ei tehtäviä .

Typoja tai epäselvyyksiä tehtävissä?

Tee korjausehdotus editoimalla tätä tiedostoa GitHubissa.

Ongelmia Poetryn kanssa?

Muutamia ohjeita täällä

Tehtävien palauttaminen

Tehtävät palautetaan GitHubiin, sekä merkitsemällä tehdyt tehtävät palautussovellukseen https://study.cs.helsinki.fi/stats/courses/ohtu2024 välilehdelle “my submission”.

Tämän viikon tehtävät 3-5 palautetaan jo edellisillä viikoilla käyttämääsi palautusrepositorioon, hakemiston viikko7 sisälle. Tehtävien 1 ja 2 ei tarvitse näkyä palautuksessa, riittää kun teet tehtävät.

Katso tarkempi ohje palautusrepositorioita koskien täältä.

1. Git: stash [versionhallinta]

Tehtävien 1 ja 2 ei tarvitse näkyä palautuksessa, riittää kun teet tehtävät

Lue https://git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning kohtaan Creative stashing asti.

Oletetaan että olet repositoriossa, jossa on ainakin kaksi branchia: main ja jokin toinen (kutsutaan sitä tässä nimellä toinen).

  • Ollessasi main-branchissa tee branchissa oleviin tiedostoihin muutoksia, joita lisäät staging-alueelle ja joitain muutoksia joita et vielä “äddää”, komennon git status tuloksen tulee näyttää siis suunnilleen seuraavalta
$ git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   src/index.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	READEME.md

no changes added to commit (use "git add" and/or "git commit -a")
  • Pomosi käskee sinua välittömästi tekemään pari muutosta branchiin toinen. Et kuitenkaan halua vielä commitoida mainissa olevia muutoksia
  • Jos siirryt branchiin toinen tekemättä committia, tulee hirveä sotku, sillä muutokset pysyvät muutoksina toisessakin branchissa
  • git stash pelastaa tästä tilanteesta, eli stashaa mainissa olevat muutoset
    • Kokeile ennen ja jälkeen stash-komennon komentoa git status
  • Siirry branchiin toinen, tee sinne jokin muutos jonka committaat
  • Palaa jälleen mainiin
  • Palauta stashatyt muutokset komennolla git stash apply
    • Varmista että muutokset palasivat
    • Kuten huomaat, staging-alueelle jo lisätty muutos ei palaa staging-alueelle, vaan joudut lisäämään sen uudelleen
    • Jos edellisessä komento olisi annettu muodossa git stash apply --index, olisi tilanne palautunut täysin ennalleen

2. Git: branchin “siirtäminen” [versionhallinta]

Tehtävien 1 ja 2 ei tarvitse näkyä palautuksessa, riittää kun teet tehtävät

  • Tee repoosi branchi nimeltä haara ja tee mainiin ja haaraan committeja siten että saat aikaan seuraavankaltaisen tilanteen:
    main
__/
  \_____haara
  • Eli sekä main että haara ovat edenneet muutamien commitien verran haarautumisen tapahduttua
    • Huom: komennolla gitk --all näet kaikki haarat, kokeile!
  • Yhtäkkiä huomaat, että mainiin tekemäsi asiat eivät olekaan kovin hyviä ja haarassa on paljon parempaa tavaraa, haluaisitkin että haarasta tulisi uusi main
  • Tämä onnistuu kun menet mainiin ja annat komennon git reset --hard haara
    • Varmista että komento toimii oikein
    • Vanhan main-haarankaan tavarat eivät katoa mihinkään, jos niihin jostain syystä vielä halutaan palata
    • Vanhaan committiin palaaminen onnistuu, jos commitin id on tiedossa – jos ei, on olemassa muutamia keinoja sen selvittämiseksi

3. ja 4. (kahden rastin tehtävä) KPS yksin- ja kaksinpeli

Kurssirepositorion hakemistosta viikko7/kivi-paperi-sakset löytyy tutun pelin tietokoneversio.

  • Kopioi projekti palatusrepositorioosi, hakemiston viikko7 sisälle.

  • Ohjelmassa on kolme pelimoodia: ihminen vs. ihminen, ihminen vs. yksinkertainen tekoäly ja ihminen vs. monimutkainen tekoäly
  • Koodi sisältää runsaat määrät copy pastea, muutenkaan oliosuunnittelun periaatteet eivät ole vielä alkuperäisellä ohjelmoijalla olleet hallussa
  • Poista koodista kaikki toisteisuus ja tee siitä rakenteellisesti materiaalin osan 4 hengessä oikeaoppinen
    • pelaa-metodi tulee toteuttaa template-metodina
    • Sopivan peliolion (kaksinpeli, helppo yksinpeli, vaikea yksinpeli) luominen tulee toteuttaa staattisen tehdasmetodin, tai funktion avulla
    • Pääohjelmalla ei saa olla riippuvuuksia konkreettisiin pelin toteuttaviin luokkiin

Jos teet tehtävän mielestäsi kaikkien tyylisääntöjen mukaan, merkkaa 2 rastia, jos ratkaisu ei ole kaikin osin tyylikäs, merkkaa yksi rasti.

Vinkki: eräs tapa lähteä liikkeelle on muodostaa yliluokka KiviPaperiSakset, joka sisältää kaikille kolmelle pelityypille yhteisen koodin:

class KiviPaperiSakset:
    def pelaa(self):
        tuomari = Tuomari()

        ekan_siirto = self._ensimmaisen_siirto()
        tokan_siirto = self._toisen_siirto(ekan_siirto)

        while self._onko_ok_siirto(ekan_siirto) and self._onko_ok_siirto(tokan_siirto):
            # ...

        print("Kiitos!")
        print(tuomari)

    def _ensimmaisen_siirto(self):
        return input("Ensimmäisen pelaajan siirto: ")

    # tämän metodin toteutus vaihtelee eri pelityypeissä
    def _toisen_siirto(self, ensimmaisen_siirto):
        # metodin oletustoteutus
        return "k"

    def _onko_ok_siirto(self, siirto):
        return siirto == "k" or siirto == "p" or siirto == "s"

Erilliset pelit sitten perivät luokan ja erikoistavat sitä tarpeidensa mukaan:

# luokka perii luokan KiviPaperiSakset
class KPSPelaajaVsPelaaja(KiviPaperiSakset):
    # toteutetaan metodi pelityypin mukaisesti
    def _toisen_siirto(self, ensimmaisen_siirto):
        tokan_siirto = input("Toisen pelaajan siirto: ")

        return tokan_siirto

HUOM riippuen siitä miten tehtävän teet, on mahdollista että törmäät seuraavaan virheeseen:

ImportError: cannot import name 'KiviPaperiSakset' from partially initialized module 'kivi_paperi_sakset' (most likely due to a circular import) (/Users/mluukkai/opetus/ohtu2022/ohtu-s22-palautukset/viikko7/kivi-paperi-sakset/src/kivi_paperi

Syynä itselläni oli se, että importtasin seuraavasti

Tiedostossa kivi_paperi_sakset.py:

from kps_pelaaja_vs_pelaaja import KPSPelaajaVsPelaaja

# ...

class KiviPaperiSakset:
    # ...

# tehdasfunktio, tarvitsee importteja
def luo_peli(tyyppi):
    if tyyppi == 'a':
        return KPSPelaajaVsPelaaja()
    if tyyppi == 'b':
        return KPSTekoaly()
    if tyyppi == 'c':
        return KPSParempiTekoaly()

    return None

ja tiedostossa kps_pelaaja_vs_pelaaja.py:

from kivi_paperi_sakset import KiviPaperiSakset


class KPSPelaajaVsPelaaja(KiviPaperiSakset):
    # ...

Kaksi tiedostoa päätyi importtaamaan toisensa, eli syntyi circular import, jota Python ei osaa hanskata. Itse ratkaisin ongelman määrittelemällä tehdasfunktion luo_peli omassa tiedostossaan.

5. Pull requestin mergeäminen (tätä tehtävää ei lasketa versionhallintatehtäväksi)

Mergeä jokin miniprojektillesi tehty pull request (myös toisen miniprojektisi jäsenen tekemän pull requestin mergeäminen käy). Voit tehdä tehtävän yhdessä muiden miniprojektisi ryhmäläisten kanssa. Jos olet jo mergennyt pull requestin miniprojektiisi kurssin aikana, se riittää tämän tehtävä merkkaamiseksi.

Laita palautusrepositoriosi hakemistoon viikko7 tiedosto MERGE.md ja sen sisällöksi linkki mergettyyn pull requestiin.

Vaihtoehtoinen tehtävä:

Lue jokin alla olevista ja tee siitä noin 0.25 sivun referaatti.

Referaatti kirjoitetaan palautusrepositorion hakemistoon viikko7 tiedostoon referaatti.md.

6. Kurssipalaute

Anna kurssipalautetta osoitteessa https://norppa.helsinki.fi/targets/83083419/feedback. Voit antaa palautteen myös kokeen jälkeen. Rasti tähän tehtävään on lupaus siitä, että annat palautteen jossain vaiheessa. Palautetta voi antaa välillä 13-27.12.2023.

HUOM jos menet palautteenanto-osoitteeseen ennen loppupalautteen alkupäivää, näet kurssin “jatkuvan palauten” lomakkeen. Tässä tehtävässä tarkoitetaan kuitenkin 13.12. aukeavaa normaalia loppupalautetta.

Tehtävien palautus

Pushaa kaikki tekemäsi tehtävät (paitsi ne, joissa mainitaan, että tehtävää ei palauteta mihinkään) GitHubiin palautusrepositorioosi ja merkkaa tekemäsi tehtävät palautussovellukseen https://study.cs.helsinki.fi/stats/courses/ohtu2024