Demo 7
Deadline is Monday at 11:59 (noon).
Learning goals
Ajankäyttösi tällä viikolla
Työtuntien kirjaamisesta saa 0.5 demopistettä.
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! 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ä.
Task 1*. Points in a table (Compulsory)
M: 16. Loops. Create a function LaskeKirjaimet (CountTheLetters in Finnish) which will count how many times a given character appears in the given string.
Function could be called like this
int kMaara = LaskeKirjaimet("kissa", 's');
Write the ComTest-tests for this function
Help 1 Taking one character from a string. String is like a table of char objects. So you can access one character just like you would get single element from a table.
Funktion pitää osata ottaa huomioon myös isot kirjaimet. Esimerkiksi merkkijonosta "Ritari" pitää löytyä r-kirjaimia kaksi kappaletta.
Vinkki: Char-merkin muuttaminen pienaakkoseksi onnistuu käyttämällä Char.ToLower()-metodia. Ks. dokumentaatio.
Tehtävässä saa kääntyvän ohjelman ajamisesta 0.3 p., testien läpäisemisestä 0.6 p. (testit on kirjoitettu valmiiksi) ja dokumentaation katsomisesta 0.1 p.
Task 2*
Complete this task in Visual Studio and paste the answer here.
Create a console application which contains a function for creating a right-angled triangle in ASCII graphics. The function should take two parameters: a single char for the characters in the triangle and a single int for the width and height of the triangle. The function should return a string containing the triangle - it must not print out anything.
The following main program:
public static void Main()
{
string triangle = CreateTriangle('@', 8);
Console.WriteLine(triangle);
}
should print out the following triangle:
@
@@
@@@
@@@@
@@@@@
@@@@@@
@@@@@@@
@@@@@@@@
Instructions: The string should be built in a StringBuilder object. You can append a newline character after every line in the following way (sb stand for the StringBuilder object):
sb.Append('\n');
After having built the StringBuilder object the function should return it as a "regular" string as follows:
return sb.ToString();
Start by expanding on the following idea. Nested loops will allow you to build the StringBuilder cumulatively line by line.
for (int i = 0; i < ???; i++)
{
for (int j = 0; j < ???; j++)
{
// append something to the StringBuilder here
}
}
Liittyen sisemmän silmukan toistoehtoon: Kokeile laittaa toistoehtoon mukaan i-muuttuja. Pelkkä j < i ei kuitenkaan riitä, mitä pitää muuttaa?
Arviointi:
- kääntyvä ohjelma 0.1 p.
- itse kirjoitetut testit ja testien läpäiseminen 0.3 p.
- oikea tulostus 0.6 p.
type: cs/doc/comtest
lazy: false
editorModes: 10
pointsRule:
cumulative: true
allowUserMin: 0.0
allowUserMax: 1.0
maxPoints: 1.0 p
run: 0.9
doc: 0.1
rows: 6
header: "Task 1 (1.0 p)"
indent: 4
Task 3
Complete this task in Visual Studio and paste the answer here.
Task 4-5 (2 p.)
The following program creates 20 balls in random places around the game field. The balls are stored in an array called balls. Try running the program in Visual Studio.
public class Balls : PhysicsGame
{
public override void Begin()
{
SetWindowSize(800, 600);
Level.Size = new Vector(800, 600);
PhysicsObject[] balls = CreateRandomBalls(20, 30.0);
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Exit");
}
/// <summary>
/// Creates balls in random places.
/// </summary>
/// <param name="number">How many balls should be created</param>
/// <param name="size">The size of the balls</param>
/// <returns>The created balls in an array</returns>
private PhysicsObject[] CreateRandomBalls(int number, double size)
{
PhysicsObject[] balls = new PhysicsObject[number];
for (int i = 0; i < number; i++)
{
PhysicsObject p = new PhysicsObject(size, size, Shape.Circle);
balls[i] = p;
p.Position = RandomGen.NextVector(Level.BoundingRect);
Add(p);
}
return balls;
}
}
Start by modifying the Begin subroutine to add one more ball in a position of your choosing. Make this ball blue so it can be told apart from the others.
After that write a function:
public PhysicsObject NearestBall(PhysicsObject[] balls, Vector point)
{
// fill in
}
which finds and returns the ball (a PhysicsObject) nearest to a given point.
Then, call this NearestBall function from Begin by passing it two arguments: the balls array and the position of the newly created blue ball (ball.Position).
The function should return a reference to the ball nearest to the blue one. Color this returned ball red.
In short, the function is used in the following way (add these lines to Begin):
PhysicsObject nearest = NearestBall(balls, ball.Position);
nearest.Color = Color.Red;
After completing the task you may award yourself 2 points via Set Custom Points.
Arviointi: Tässä tehtävässä on käytössä itsearviointi. Kun olet saanut tehtävän valmiiksi, niin aseta itsellesi 2 pistettä Set Custom Points -toiminnolla.
Mitä palautuslaatikkoon laitetaan? Palauta tähän palautuslaatikkoon vain Begin-aliohjelma, yllä annettu TeeSatunnaisetPallot-aliohjelma, sekä LahinPallo-aliohjelma. Luokka on alla jo valmiina, joten sitä ei palauteta tähän laatikkoon.
Vinkkejä: Demossa 6 etsittiin kokonaislukutaulukon lähintä lukua hinta-arvio-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ä 6, jossa laskettiin kahden pisteen etäisyys toisistaan. Muista, että fysiikkaolion paikan saat fysiikkaolion Position-ominaisuuden avulla.
Task 6
This task will follow up on 4-5.
Let's work on the blue ball we added. Create a subroutine that will move the blue ball to the position of your cursor whenever you click the left mouse button. These instructions will help with finding the position of the cursor.
Continue by coloring the ball nearest to the clicked position red. This should happen every time the button is clicked, so you have to color the correct ball red while also making sure the other balls retain their original color.
Ohje tehtävän tekemiseen:
Tee hiiren vasemman painikkeen kuuntelijaksi delegaatti, jossa hoidetaan sekä pallon siirtely että lähimmän pallon päivittäminen.
Mouse.Listen(MouseButton.Left, ButtonState.Pressed, delegate ()
{
// Siirrä sinistä palloa
// Päivitä lähin pallo
}, "");Selitys: Delegaatti on nimetön aliohjelma, jota tässä kutsutaan hiiren napin painamisen yhteydessä. Delegaatilla on käytössään kaikki paikalliset muuttujat, joten tämä kuuntelija tulee tehdä samaan aliohjelmaan sinisen pallon kanssa (Beginiin).
V1
Remember that if you don’t like Ville tasks you don’t have to do them.
Do Ville tasks: 5.9-5.13 and 9.8 Ville usermanual
Write here what you learnd and what you though these Ville-tasks. A few lines are enough.
TDD1
This assignment is currently only in Finnish, sorry!
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
Tee konsoliohjelma, joka tulostaa ASCII-grafiikka-"puun" (ASCII-grafiikalla tarkoitetaan kirjoitusmerkeillä tuotettua "taidetta"). Puun alaosassa on yhden merkin korkuinen ja kolme merkkiä leveä 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.
Voit joko (a) pääohjelmassa pyytää käyttäjää syöttämään puun leveys (eli kolmion alimman rivin merkkien lukumäärä), merkki jolla kolmio täytetään, sekä merkki jolla jalka täytetään, tai (b) käyttää seuraavaa valmista pääohjelmaa:
public static void Main()
{
string puu = LuoPuu(9, '@', '|');
Console.WriteLine(puu);
}
Ohjelman tuloste näyttäisi tällöin seuraavanlaiselta:
@
@@@
@@@@@
@@@@@@@
@@@@@@@@@
|||
Vinkki: StringBuilder.Append-metodille voit antaa toisena parametrina toistojen määrän.
Vinkki: Puun kolmion osan rakentamisessa kannattaa lähteä seuraavasta ajatuksesta.
- Lisää aluksi sopiva määrä välilyöntejä. Tähän voit käyttää StringBuilder-olion Append-metodia.
- Sitten lisää sopiva määrä puun merkkejä. Tähänkin voit käyttää Append-metodia.
Kaksinkertaista for-silmukkaa ei tarvitse välttämättä tehdä tässä tehtävässä. Hyödynnä parametrina saamaasi leveys-muuttujaa ja silmukan i-muuttujaa.
Vinkki: Yhden merkin voit lukea käyttäjältä näin:
char merkki = Console.ReadKey().KeyChar;
B1-2 (2 p.)
This assignment is currently only in Finnish, sorry!
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.
B3 Sum of matrixes
M: 15.5 Multi-dimensional tables, 16. Loops. Create a function that sums together to matrixes. First the function needs to create a correct size result matrix. What you should assume of the matrixes given as a parameter? Document your assumptions to the comments. Then the function counts the sum into the result matrix.
You could dall the function like this
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 = Summa(mat1, mat2);
}
And here the sum matrix mat3would look like this:
{{10, 4, 11}, { 3, 4, 7}, { 7, 21, 0}}
The sum matrix could also be printed out as a string using the demo 6 Jonoksi function by following these instructions.
B4
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:
tulostaisi
10.00 4.00 11.00
3.00 4.00 7.00
7.00 21.00 0.00
Demo 6 malliratkaisuissa on valmis funktio matriisin muuttamisesta merkkijonoksi, mutta toki voit tehdä itsekin oman tulostusaliohjelman.
Ajamisesta saa 0.2 pistettä, oikeasta tulosteesta 0.6 ja dokumentaation generoinnista 0.2 pistettä.
G1
This assignment is currently only in Finnish, sorry!
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
This assignment is currently only in Finnish, sorry!
Tee pieni (tasohyppely tms.) peli, jossa on
- liikuteltava pelaaja, jolla voi "ampua" jotain, ja joilla voi osua vihollisiin
- vihollisia/seiniä/esteitä tai jotain, jolla on elämäpisteitä eli eivät häviä yhdestä. Vinkki: perintä.
- olioilla on tekstuurit
Huom! Et voi ajaa TIMissä peliäsi, koska pelin ulkopuolisia tiedostoja (tekstuurit, ym.) ei voi viedä 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.