Viikko 7
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