wiki:k2012/demot/demo9-luonnos
Last modified 6 years ago Last modified on 2012-03-07 15:57:24

Demot » Demo 9, 12.3.2012

» Ville » TDD » Tavalliset » Bonus » Guru

Demot ovat tällä kertaa hieman tavallista iisimmät johtuen siitä että tekoaikaa on vähemmän; palautus normaalisti maanantaina 12.3. klo 7:30 mennessä. Jos haluat haastetta lisää niin sekä bonus että guru tarjoavat sitä ihan mukavasti. PP-tehtäviä ei ole tällä kertaa, mutta ensi viikolla taas on.

V1

Tee Ville-tehtävät: 5.11, 6.4, 6.5, 7.2. Muista: Villen käyttöohje ja Ville-tehtävien palauttamisohjeet.

TDD1

Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen. Palauta DemoWWW:ssä tekstitiedosto tdd.txt (jonka siis arvostelet yhden pisteen arvoiseksi), missä kerrot minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samassa tiedostossa palautetta ja kehitysehdotuksia Comtestin käytöstä. Mikäli ComTest ei toimi yliopiston mikroluokissa, kokeile ensin asentaa ComTest-VS-plugin. Sitten tarkista, että ComTest haetaan oikeasta paikasta: Valitse Visual Studiossa Tools -> ComTest -> Options. Tarkista, että Path to ComTest.jar executable kentässä on N:\bin\ComTest.jar ja olet yhdistänyt koneesi N-verkkolevyyn. Kysy tarvittaessa ohjaajalta neuvoa.

Tehtävä 1

Tee algoritmi kokonaislukutaulukon sekoittamiseksi. Tee (void-)aliohjelma, joka ottaa parametrina int-taulukon ja sekoittaa sen alkiot. Testaa algoritmiasi taulukolla, johon on alustettu järjestyksessä luvut 1, 2, 3, ..., 52. Palauta toimiva ohjelmakooditiedosto, jossa on hyvin kommentoituna, mitä algoritmissa tehdään.

Huom: Tässä ei ole tarkoitus "keksiä" omaa algoritmia, vaan käyttää ideaa jostakin valmiista algoritmista sekoittamiseen. Hyvä algoritmi on esim: Fisher-Yates shuffle. Tästä on toteutus Jypelin RandomGen -luokan Shuffle-aliohjelmassa. Voit matkia esimerkiksi tätä. Jos matkit tätä, niin vaihda T:n tilalle int ja listan tilalle int-taulukko. Funktion alkuun pitää lisätä nyt Random rand = new Random(); jotta rand-olio on olemassa, Jypelin esimerkissä se on olemassa koska se on RandomGen-luokan attribuutti.

Vinkki: Ethän laita lukuja 1, 2, 3, ... jne taulukkoon "manuaalisesti", koska siihen on helpompikin tapa :-). Aina pitää miettiä että voiko tämän saman asian tehdä (helposti) vaikka tuhannelle tai miljoonalle luvulle.

Tehtävä 2

Palataan hetkeksi kurssin alkupuolen laatikkotehtävään. Muuta ohjelmaa siten, että PiirraNelio-aliohjelmalle viedään Vector-olio kahden reaaliluvun (ja koon) sijaan. Tämä vektori toimii piirrettävän laatikon vasemman alakulman pisteenä. Funktio piirtää laatikon ja palauttaa sitten piirtämänsä laatikon oikean yläkulman koordinaatin. Nyt seuraavan laatikon piirtäminen on yksinkertaista koska se voidaan aloittaa edellisen kutsun palauttamasta paikasta. (Game-parametrin voit halutessasi jättää pois, jolloin static-sana jää pois esittelyriviltä eikä tällöin this-parametriä myöskään anneta).

Begin-aliohjelma näyttäisi tältä.

public override void Begin() {
  Vector piste = new Vector(0, 0);
  piste = PiirraNelio(piste);
  piste = PiirraNelio(piste);
  piste = PiirraNelio(piste);
}

Piirrä vielä pieni punainen ympyrä, joka on pisteessä (0, 0). Ympyrän saat muiden olioiden päälle varmasti kun lisäät sen "ylemmälle" tasolle

Add(pallo, 1); 
// Huomaa: luku 1 tarkoittaa tasoa numero 1. 
// Add(pallo) lisäisi pallon tasolle 0

Kuva siitä, miltä toimiva ohjelma näyttää ruudulla:

https://trac.cc.jyu.fi/projects/ohj1/attachment/wiki/s2011/demot/demo9/demo9-t2.png

Tehtävä 3

Jatka edellistä tehtävää siten, että jos pääohjelmaa muutetaan seuraavasti:

public override void Begin()
{
  Vector piste = new Vector(0, 0);
  piste = PiirraNelio(piste);
  piste = PiirraNelio(piste);
  piste = PiirraNelio(piste);
  piste -= new Vector(0, NELION_KOKO); 
  piste = PiirraNelioAlas(piste);
  piste = PiirraNelioAlas(piste);
}

niin ohjelma piirtää viisi laatikkoa, joista keskimmäinen on korkeimmalla. PiirraNelioAlas saa parametrinaan uuden laatikon vasemman ylänurkan koordinaatin ja palauttaa piirtämänsä laatikon oikean alanurkan koordinaatin.

https://trac.cc.jyu.fi/projects/ohj1/attachment/wiki/s2011/demot/demo9/demo9-t3.png

HUOM! Määrittele NELION_KOKO luokan vakioksi, eli const double NELION_KOKO = ....

Tehtävä 4

Lisää edelliseen vielä aliohjelma PiirraNeliot, joka piirtää annetun määrän laatikoita ylöspäin ja sitten annetun määrän alaspäin. Sama kuva saataisiin siis kutsulla:

public override void Begin()
{
  Vector piste = new Vector(0, 0);
  PiirraNeliot(piste, 3, 2); // 3 ylös ja 2 alas
}

Kuva pitäisi näyttää samalta kuin tehtävässä 3.

Tehtävä 5-6

M: 22. Dynaamiset tietorakenteet. Olkoon meillä lista String-olioita. Tee funktio, joka etsii listan pisimmän jonon ja palauttaa sen (merkkijonona). Pääohjelma tulostaa pisimmän sanan ja poistaa sitten listasta KAIKKI tämän sanan esiintymät. Lista-olioilla on RemoveAll-metodi, mutta sen käyttöä ei tässä vaadita, eikä tämän kurssin tiedoilla sitä valitettavasti opita käyttämään. Tarkoitus on hoitaa poistaminen käyttämällä silmukkaa ja lista-olion "tavallista" Remove-metodia.

Vinkki: Huomaa erityisesti Remove-metodin paluuarvon tyyppi (bool) ja dokumentaatio:

true if item is successfully removed; otherwise, false. This method also returns false if item was not found in the List.

B1-2

Tee seuraava Console Application -peli.

Kaksi pelaajaa kilpailee siitä, kumpi saa noppaa heittämällä ensin 100 pistettä. Jokaisella vuorolla pelaaja heittää toistuvasti noppaa, kunnes saa joko numeron 1 tai pelaaja sanoo "pankki" jolloin hänen vuorollaan heitettyjen silmälukujen summa lisätään hänen kokonaispistemääräänsä.

Pelaaja kullakin heittokerralla joutuu siis tekemään seuraavan valinnan

  • heitto - arvotaan nopan silmäluku 1-6, ja jos tulos on
    • 1: pelaaja menettää kaikki omalla vuorollaan heittämänsä pisteet ja vuoro vaihtuu vastustajalle
    • 2-6: silmäluku lisätään pelaajan "turn totaliin" ja pelaajan vuoro jatkuu
  • pankki - pelaajan omalla vuorollaan heittämät pisteet (eli "turn total") lisätään hänen kokonaispistemääräänsä ja vuoro vaihtuu vastustajalle

G1-2

Tee ohjelma, joka saa jostakin taulukon (tai käyttää vakiotaulukkoa), jossa on kokonaislukuja. Taulukossa sama luku voi esiintyä useasti. Kirjoita aliohjelma, joka saa tuon taulukon parametrinaan ja palauttaa taulukon, jossa on taulukon alkiot kukin vain yhden kerran järjestettynä niiden esiintymiskertojen määrän mukaan nousevaan järjestykseen. taulukosta {1, 2, 3, 34, 34, 2, 1, 34, 1, 1, 1} palautetaan {3, 2, 34, 1} .

G3

Tee Palloja karkuun -ohjelmaan eri vaikeustasoja. Mieti itse mikä olisi järkevä tapa toteuttaa vaikeustasot. Käyttäjän pitäisi itse pystyä valitsemaan vaikeustaso. Tee jokaiselle vaikeustasolle oma parhaiden pisteiden lista.