Demo 7

Deadline is Monday at 11:59 (noon).

Learning goals

# Oppimistavoitteet

Ajankäyttösi tällä viikolla

Työtuntien kirjaamisesta saa 0.5 demopistettä.

Mitä työtunteihin lasketaan?

# d7tunnit

Huomautus tehtävien pisteytyksistä

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.

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.

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.

# d3teht6a

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();

Extra hint

Vinkki 2, jos ei vieläkään aukea (avaa tämä vasta sitten kun olet itse miettinyt).

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
# d7t1

Task 3

Complete this task in Visual Studio and paste the answer here.

# pituuksienKa

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ä

# d7teht4

Task 6

This task will follow up on 4-5.

  1. 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.

  2. 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.

See a video of the solution in action.

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).

# d7teht5

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.

# VilleV1

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).

# demo7tdd

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.

  1. Lisää aluksi sopiva määrä välilyöntejä. Tähän voit käyttää StringBuilder-olion Append-metodia.
  2. 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;
# d7kuusi

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.

# d8tehtb3

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:

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

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ä.

# d7b1

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 :-)

# d7g1

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ä.

# d7g2

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.