Typoja tai epäselvyyksiä tehtävissä?

Tee korjausehdotus editoimalla tätä tiedostoa GitHubissa.

Tehtävien palauttaminen

Tehtävät palautetaan GitHubiin, sekä merkitsemällä tehdyt tehtävät palautussovellukseen https://study.cs.helsinki.fi/stats/courses/ohtu2025 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, tai hanki muualta vastaavat tiedot.

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

Ollessasi main-branchissa tee branchissa oleviin tiedostoihin muutoksia, joita lisäät staging-alueelle ja joitain muutoksia joita et vielä lisää.

Varmista, että komennon git status tulos näyttää 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)
	README.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 experimental. Et kuitenkaan halua vielä commitoida mainissa olevia muutoksia. Jos siirryt branchiin experimental tekemättä committia, tulee hirveä sotku, sillä muutokset pysyvät muutoksina toisessakin branchissa. git stash pelastaa tästä tilanteesta:

Stashaa mainissa olevat muutokset

Kokeile ennen ja jälkeen stash-komennon komentoa git status

Siirry branchiin experimental, 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

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 palautusrepositorioosi, 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 ratkaisusi 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):
        raise Exception("Tämä metodi pitää korvata aliluokassa")

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

Erilliset peliluokat perivät tämän 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. AI Agent in action

Tämän tehtävän tekeminen edellyttää, että käytössäsi on VS Code GitHub copilot. Voit toki tehdä tehtävän myös jollain muulla AI-avusteisella koodaustyökalulla tai jopa ilman AI:ta (joka voi olla melko työlästä).

Jatketaan edellisen tehtävän koodin parissa.

Ennen kun koodiin alkaa tulla muutoksia, tee palautusrepositorioosi kopio projektin sisältävästä hakemistosta. Anna kopiolle nimi kivi-paperi-sakset-original. Edellisen tehtävän jälkeinen tilanne jää kopioon.

Avaa Copilotin Chat-ikkuna Agent-moodissa:

Tehdään sovellus muutamassa vaiheessa

Yritä saada agentti rakentamaan sovelluksellesi web-käyttöliittymä

  • muistuta agenttia, että kyseessä on Poetry-projekti
  • komenna agenttia käyttämään mahdollisimman paljon olemasaolevaa koodia
  • ohjelma kannattaa suorittaa siten, että pyydät agentin käynnistämään sen, näin agentti osaa korjata koodin jos se ei jostain syystä käynnisty
  • jos agentti luo sovelluksen, joka käyttää porttia 5000 ja käytössäsi on Mac, pyydä agentilta jonkin muun portin käyttöä, 5000 on Macissa ehkä varattu portti

Kun sovellus toimii, käske agenttia tekemään sovellukselle automatisoidut testit. Pyydä agenttia myös varmistamaan, että testit menevät läpi

Pyydä agenttia muuttamaan sovellusta (ja testejä) siten, että jokaista peliä pelataan niin kauan kunnes toinen osapuoli on saavuttanut viisi voittoa

Tee peliin vielä agentin avulla jokin haluamasi muutos

Muuta vielä koodia ilman agentin apua siten, että pelit päättyvät kun toinen pelaajista saavuttaa kolme voittoa

Varmista, että myös testit toimivat edelleen

Käy läpi agentin tekemä koodi. Jos koodissa on jotain sinulle vierasta, pyydä agenttia selittämään, mistä on kyse

Kirjoita raportti kokemuksistasi hakemistoon viikko7 talletettavaan tiedostoon agent.md

Kerro raportissa

  • Päätyikö agentti toimivaan ratkaisuun?
  • Miten varmistuit, että ratkaisu toimii?
  • Oletko ihan varma, että ratkaisu toimii oikein?
  • Kuinka paljon jouduit antamaan agentille komentoja matkan varrella?
  • Kuinka hyvät agentit tekemät testit olivat?
  • Onko agentin tekemä koodi ymmärrettävää?
  • Miten agentti on muuttanut edellisessä tehtässä tekemääsi koodia?
  • Mitä uutta opit?

6. Kurssipalaute

Anna kurssipalautetta osoitteessa https://norppa.helsinki.fi/targets/95023982/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ä 10-27.12.2025.

HUOM jos menet palautteenanto-osoitteeseen ennen loppupalautteen alkupäivää, näet kurssin “jatkuvan palauten” lomakkeen. Tässä tehtävässä tarkoitetaan kuitenkin 10.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/ohtu2025