Demo 7
Palauta viimeistään ma klo 11:59.
Osaamistavoitteet
Tämän demokerran päätteeksi
- osaat jo soveltaa taulukoita, funktioita ja silmukoita paremmin
Ajankäyttösi tällä viikolla
Työtuntien kirjaamisesta saa 0.5 demopistettä. Aseta pisteesi Set Custom Points -toiminnolla.
Demokerran päätteeksi kirjoita arvio tällä viikolla käyttämästäsi työmäärästä. Laske työmäärään mukaan kaikki tällä viikolla käyttämäsi aika: lähiopetukseen osallistuminen, oppimateriaalin lukeminen, demotehtävien tekeminen, luentovideon katsominen, demojen purkutilaisuuteen osallistuminen (maanantaina) ja niin edelleen. Voit päivittää lukua viikon edetessä, se voi helpottaa arvion tekemistä. Huom! Siis tähän ei laiteta kurssin alusta kaikkia tunteja yhteensä, vaan vain tämän viikon tunnit.
Jokaisella opiskelijalla on oikeus ja velvollisuus arvioida itse omien pisteidensä oikeellisuus. Mikäli ohjelmasi ei toimi, niin aseta itsellesi Custom pointsit itsearviosi mukaisesti, esim. mikäli ajattelet että olet saavuttanut 50% tehtävän tavoitteista niin silloin laitat itsellesi enintään 0.5 pistettä. Vastaavasti, jos arvioit että tehtäväsi on 90%:sti oikein, mutta automaattinen arviointi antaa sinulle jostain syystä vähemmän pisteitä, aseta itsellesi 0.9 pistettä.
PP, perjantai 23.2.
PP2-tehtävät (näistä saa pisteitä vain käymällä PP-ryhmässä).
Tehtävä 1*
M: 16. Toistorakenteet, 12. Muokattavat merkkijonot
Tee tämä tehtävä Visual Studiossa. Valmis ja toimiva ohjelma palautetaan kuitenkin TIMiin normaalisti.
Tee konsolisovellus ja sinne funktio, joka palauttaa suorakulmaisen kolmion ASCII-grafiikalla. Funktio ottaa parametreina char
-merkin sekä yhden luvun, joka on kolmion leveys ja korkeus. Funktio palauttaa string
-olion. Esimerkiksi seuraava pääohjelma
public static void Main()
{
string kolmio = LuoKolmio('@', 8);
Console.WriteLine(kolmio);
}
tulostaisi tällaisen kolmion:
@
@@
@@@
@@@@
@@@@@
@@@@@@
@@@@@@@
@@@@@@@@
Ohje: Merkkijono rakennetaan StringBuilder
-olioon. Kunkin rivin päätteeksi lisätään rivinvaihto seuraavasti (tässä sb
on StringBuilder
-muuttujan nimi):
sb.Append('\n');
Funktio palauttaa lopuksi StringBuilder
-olion "tavallisena" merkkijonona sanomalla
return sb.ToString();
Lähde laajentamaan seuraavasta ajatuksesta. Mieti itse mihin kohtaan allaoleva pituus
täytyy funktioon kirjoittaa.
for (int i = 1; i < pituus; i++)
{
for (int j = 1; [MIETI TOISTOEHTO ITSE]; j++)
{
// Tässä kohtaa lisää StringBuilder-olioon merkkejä.
}
// Tässäkin kohtaa pitää tehdä jotakin
}
Liittyen sisemmän silmukan toistoehtoon: Sisempää silmukkaa tulee suorittaa enintään i
kertaa.
Tehtävä 2
Tee tämä ohjelma Visual Studiossa. Ohjelma palautetaan kuitenkin TIMiin normaalisti.
Tee konsoliohjelma, joka tulostaa ASCII-grafiikka-"puun" (ASCII-grafiikalla tarkoitetaan kirjoitusmerkeillä tuotettua "taidetta"). Puun alaosassa on 1:3 jalka/runko, jonka päällä kolmio siten, että alin "kerros" on N merkkiä (N=pariton), seuraava N-2, sitten N-4 jne, jolloin ylimpään kerrokseen jää yksi merkki. Alla esimerkki tulostuksesta.
Ohjelma toimii siten, että käyttäjältä kysytään puun leveys (eli kolmion alimman rivin merkkien lukumäärä), merkki jolla kolmio täytetään, sekä merkki jolla jalka täytetään. Esimerkki koko ohjelman toiminnasta.
Miten levea puu > 9
Mistä puu on tehty > $
Mistä jalka on tehty > |
$
$$$
$$$$$
$$$$$$$
$$$$$$$$$
|||
Vinkki: StringBuilder.Append-metodille voit antaa toisena parametrina toistojen määrän.
Vinkki: Yhden merkin voit lukea käyttäjältä näin:
char merkki = Console.ReadKey().KeyChar;
Tehtävä 3-4 (2 p.)
M: 15. Taulukot, 16. Silmukat.
Seuraava ohjelma luo 20 palloa satunnaisiin paikkoihin ympäri kenttää. Pallot tallennetaan pallot
-taulukkoon. Kokeile ajaa tämä ohjelma Visual Studiossa.
public class Lahinpallo : PhysicsGame
{
public override void Begin()
{
SetWindowSize(800, 600);
Level.Size = new Vector(800, 600);
PhysicsObject[] pallot = TeeSatunnaisetPallot(20, 30.0);
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
}
/// <summary>
/// Tekee palloja satunnaisiin paikkoihin
/// </summary>
/// <param name="montako">Montako palloa tehdään</param>
/// <param name="koko">Pallon koko</param>
/// <returns>Pallot</returns>
private PhysicsObject[] TeeSatunnaisetPallot(int montako, double koko)
{
PhysicsObject[] pallot = new PhysicsObject[montako];
for (int i = 0; i < montako; i++)
{
PhysicsObject p = new PhysicsObject(koko, koko, Shape.Circle);
pallot[i] = p;
p.Position = RandomGen.NextVector(Level.BoundingRect);
Add(p);
}
return pallot;
}
}
Tee Begin
:iin vielä yksi fysiikkaolio-pallo haluamaasi paikkaan, vaikkapa kohtaan x=100, y=100.
Anna pallolle väriksi sininen, jotta se erottuu muista palloista.
Sen jälkeen tee funktio
public PhysicsObject LahinPallo(PhysicsObject[] pallot, Vector piste)
{
// täydennä ...
}
joka etsii ja palauttaa annettua pistettä lähimmän pallon, siis PhysicsObject
-olion.
Seuraavaksi, kutsu Begin
:ssä LahinPallo
-funktiota siten että annat argumentteina pallot
-taulukon, ja juuri äsken tekemäsi sinisen pallon paikan (pallo.Position
).
Saat paluuarvona lähimmän pallon olioviitteen. Värjää lähin pallo punaiseksi. Funktiota voidaan käyttää seuraavasti. (Laita tämä Begin
:iin.)
PhysicsObject lahinPallo = LahinPallo(pallot, piste);
lahinPallo.Color = Color.Red;
Kun olet saanut tehtävän valmiiksi, niin aseta itsellesi 2 pistettä Set Custom Points -toiminnolla.
Vinkkejä: Demossa 6 etsittiin kokonaislukutaulukon lähintä lukua miidi-tehtävässä. Sen idea sopii täysin, nyt vaan pitää palauttaa lähin fysiikkaolio. Demo 6:ssa alkion tyyppinä oli int
, nyt PhysicsObject
. Etäisyyden voit helpoiten laskea Jypelin Vector-luokasta löytyvällä Vector.Distance
-funktiolla tai käyttämällä samaa ideaa kuin demo 6:n tehtävässä 5, jossa laskettiin kahden pisteen euklidinen etäisyys. Muista, että fysiikkaolion paikan saat fysiikkaolion Position
-ominaisuuden avulla.
Tehtävä 5
Tässä tehtävässä voit hyödyntää tekemiäsi tehtäviä 3-4.
Lisää peliin pieni sininen pallo. Tee aliohjelma, joka siirtää pienen sinisen pallon siihen kohtaan, mihin klikkasit hiirellä. Hiiren paikan ruudulla saat tätä ohjetta käyttäen.
Jatka tehtävää niin että lähimmän pallon kohdalle ilmestyy punainen pallo. Sama toistuu kun hiirellä klikataan uudestaan jonnekin muualle, niin sinisen kuin punaisen pallon paikka päivittyy.
Tehtävä 6*
M: 16. Silmukat. Tee funktio LaskeKirjaimet
, joka laskee merkkijonossa olevien annetun kirjaimen esiintymien lukumäärän. Testaa pääohjelmalla (tai ComTestillä), jossa on kutsuja tyyliin (keksi lisää testejä):
int sMaara = LaskeKirjaimet("kissa", 's');
int kMaara = LaskeKirjaimet("kissa", 'k');
Funktion pitää osata ottaa huomioon myös isot kirjaimet. Esimerkiksi merkkijonosta "Ritari"
pitää löytyä r
-kirjaimia kaksi kappaletta.
Tehtävässä saa ohjelman ajamisesta 0.3p, testien läpäisemisestä 0.6p ja dokumentaation katsomisesta 0.1p.
V1
Tee Ville-tehtävät: 5.9 - 5.13 sekä 9.8.
Muista: Villen käyttöohje.
Palauta tehtävä kirjoittamalla alla olevaan tekstilaatikkoon mitä opit ja mitä mieltä olit tämän kerran Ville-tehtävistä ja auttoivatko Ville-tehtävät sinua yhtään. Muutama rivi riittää.
TDD1
Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest), saat merkitä yhden lisäpisteen. Kirjoita alle olevaan vastauslaatikkoon minkä tehtävän ja minkä funktion/funktioiden toiminnan testasit. Voit antaa samalla vastauksen kautta palautetta ja kehitysehdotuksia Comtestin käytöstä.
Valitettavasti tehtäviä 1-5 on hieman hankala testata automaattisesti (periaatteessa lähintä palloa voisi tutkailla). Tehtävät 6 ja B2 kuitenkin sopivat tähän hyvin. B1 soveltuu myös, mutta on hieman hankalampi testata (2-ulotteisen taulukon testaaminen).
B1-2 (2 p.)
Lisää Tehtävän 2 puuhun satunnaisia koristeita sinne tänne. Aseta pisteesi Set Custom Points -toiminnolla.
Miten levea puu > 15
Mistä puu on tehty > $
Mistä jalka on tehty > /
o
$$$
$o$o$
$o$$o$o
o$$$o$$$o
o$$$o$$$$oo
$$o$$o$$$$$$$
$$$$$$$$$$$$$$$
///
Vinkki: Kannattaa ehkä tehdä apufunktio kolmion yksittäisen rivin rakentamiseen, jossa arvotaan minkä verran koristeita riviin tulee. Palautuksena String
jonka sitten liität StringBuilder
-olioon pääohjelmassa.
B2
M: 15.5 Moniulotteiset taulukot, 16. Silmukat. Tee funktio, joka summaa yhteen kaksi matriisia vastinalkioittain. Funktio siis joutuu ensin luomaan oikeankokoisen tulosmatriisin. Mitä on syytä olettaa parametrimatriiseilta? Dokumentoi kommentteihin oletuksesi. Sitten funktio laskee tulosmatriisiin komponenteittain summan. Esimerkiksi:
B3?
—public static void Main(String[] args)
{
double[,] mat1 = {{1,2,3}, {2,2,2}, {4,2,3}};
double[,] mat2 = {{9,2,8}, {1,2,5}, {3,19,-3}};
double[,] mat3 = Summaa(mat1, mat2);
Console.WriteLine(Demo6.Matriisit.Jonoksi(mat3, " ", "{0,5:0.00}"));
}
tulostaisi
10.00 4.00 11.00
3.00 4.00 7.00
7.00 21.00 0.00
Demo6.Matriisit.Jonoksi käyttö ei ole pakollista, voit tehdä itsekin oman tulostusaliohjelman.
Ajamisesta saa 0.2 pistettä, oikeasta tulosteesta 0.6 ja dokumentaation generoinnista 0.2 pistettä.
Demo6.Matriisit.Jonoksi-linkki ei toimi. Tulee tuttu 404.
—Linkki korjattu . -AJL
—G1
M: 15.5 Moniulotteiset taulukot. Nyt GameOfLife on säännöillä b3s23 (born 3, stay 2 ja 3) eli synnytään 3:lla naapurilla ja pysytään 2:lla tai 3:lla naapurilla. Muuta SeuraavaSukupolvi
-aliohjelma sellaiseksi, että sille voidaan viedä jonkinlaisena taulukkona säännöt ja silmukoiden sisään ei tule enää yhtään if-lausetta (Huom! myös ?-lause on if-lause, samoin switch :-)
G2
Tee pieni (tasohyppely tms.) peli, jossa on
- liikuteltava pelaaja, jolla voi "ampua" jotain, ja joilla voi osua vihuihin
- vihuja/seiniä/esteitä tai jotain, jolla on elämäpisteitä eli eivät häviä yhdestä. Vinkki: perintä.
- olioilla tekstuurit
Huom! Et voi ajaa TIMissä peliäsi, koska pelin ulkopuolisia tiedostoja (tekstuurit, ym.) ei voi vielä TIMiin. Saat pisteet pelin ajamisesta, mutta TIM tulee valittamaan sinulle puuttuvista tiedostoista Microsoft.Xna.Framework.Content.ContentLoadException
poikkeuksien muodossa.
Ajamisesta saa 0.8 pistettä ja dokumentaation generoinnista 0.2 pistettä.
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.