From 30e9e48281623802a1c25d7d3ad8be20dcd0c7d0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Konsta=20Ker=C3=A4nen?= <kerakoju@jyu.fi>
Date: Thu, 3 Apr 2025 14:18:21 +0300
Subject: [PATCH] =?UTF-8?q?palautukseen=20valmis=20harjoitusty=C3=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../.idea/.idea.DebugKoe/.idea/.gitignore     |  13 +
 .../.idea/.idea.DebugKoe/.idea/encodings.xml  |   4 +
 .../.idea.DebugKoe/.idea/indexLayout.xml      |   8 +
 DebugKoe/.idea/.idea.DebugKoe/.idea/vcs.xml   |   6 +
 DebugKoe/DebugKoe.sln                         |  16 +
 DebugKoe/DebugKoe/DebugKoe.cs                 |  80 +++
 DebugKoe/DebugKoe/DebugKoe.csproj             |  16 +
 "Harjoitusty\303\266/OilSaber/OilSaber.cs"    | 660 +++++++++++-------
 demo 7 t 2/demo 7 t 2/demo 7 t 2.cs           |  23 +-
 9 files changed, 554 insertions(+), 272 deletions(-)
 create mode 100644 DebugKoe/.idea/.idea.DebugKoe/.idea/.gitignore
 create mode 100644 DebugKoe/.idea/.idea.DebugKoe/.idea/encodings.xml
 create mode 100644 DebugKoe/.idea/.idea.DebugKoe/.idea/indexLayout.xml
 create mode 100644 DebugKoe/.idea/.idea.DebugKoe/.idea/vcs.xml
 create mode 100644 DebugKoe/DebugKoe.sln
 create mode 100644 DebugKoe/DebugKoe/DebugKoe.cs
 create mode 100644 DebugKoe/DebugKoe/DebugKoe.csproj

diff --git a/DebugKoe/.idea/.idea.DebugKoe/.idea/.gitignore b/DebugKoe/.idea/.idea.DebugKoe/.idea/.gitignore
new file mode 100644
index 0000000..d2e2e60
--- /dev/null
+++ b/DebugKoe/.idea/.idea.DebugKoe/.idea/.gitignore
@@ -0,0 +1,13 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/contentModel.xml
+/.idea.DebugKoe.iml
+/modules.xml
+/projectSettingsUpdater.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/DebugKoe/.idea/.idea.DebugKoe/.idea/encodings.xml b/DebugKoe/.idea/.idea.DebugKoe/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/DebugKoe/.idea/.idea.DebugKoe/.idea/encodings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
+</project>
\ No newline at end of file
diff --git a/DebugKoe/.idea/.idea.DebugKoe/.idea/indexLayout.xml b/DebugKoe/.idea/.idea.DebugKoe/.idea/indexLayout.xml
new file mode 100644
index 0000000..7b08163
--- /dev/null
+++ b/DebugKoe/.idea/.idea.DebugKoe/.idea/indexLayout.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="UserContentModel">
+    <attachedFolders />
+    <explicitIncludes />
+    <explicitExcludes />
+  </component>
+</project>
\ No newline at end of file
diff --git a/DebugKoe/.idea/.idea.DebugKoe/.idea/vcs.xml b/DebugKoe/.idea/.idea.DebugKoe/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/DebugKoe/.idea/.idea.DebugKoe/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/DebugKoe/DebugKoe.sln b/DebugKoe/DebugKoe.sln
new file mode 100644
index 0000000..228dd28
--- /dev/null
+++ b/DebugKoe/DebugKoe.sln
@@ -0,0 +1,16 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DebugKoe", "DebugKoe\DebugKoe.csproj", "{8EC97E31-5CF6-4C37-872D-D993F323A841}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{8EC97E31-5CF6-4C37-872D-D993F323A841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8EC97E31-5CF6-4C37-872D-D993F323A841}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8EC97E31-5CF6-4C37-872D-D993F323A841}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8EC97E31-5CF6-4C37-872D-D993F323A841}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+EndGlobal
diff --git a/DebugKoe/DebugKoe/DebugKoe.cs b/DebugKoe/DebugKoe/DebugKoe.cs
new file mode 100644
index 0000000..2187af2
--- /dev/null
+++ b/DebugKoe/DebugKoe/DebugKoe.cs
@@ -0,0 +1,80 @@
+using Tarkistaja;
+
+
+public class DebugKoe : IDebugKoe
+{
+    // ***** Debug-koe *****
+
+    // Debug-kokeessa Tarkistaja.dll kutsuu PalautaTrue- ja
+    // HaeSuurimmanLuvunPaikka -funktioita.
+
+    // Sinun tehtävänäsi on asettaa näihin funktioihin keskeytyskohdat oikeisin
+    // kohtiin ja vain keskeytyskohtien sekä debuggerin avulla muuttaa funktioiden
+    // käyttäytymistä siten, että ne palauttavat halutut arvot.
+    // Itse koodia ei saa muokata.
+
+    // Läpäistyäsi kokeen ilmoita ohjaajalle, jolloin ohjaaja käy kokeen vielä
+    // läpi kanssasi.
+
+    
+    /// <summary>
+    /// Tehtävä 1.
+    /// 
+    /// Muuta funktion paluuarvoa ohjelman suorituksen aikana
+    /// käyttäen debuggeria siten, että funktio palauttaa true.
+    /// </summary>
+    public bool PalautaTrue()
+    {
+        // Seuraava bool pitää muuttaa trueksi käyttäen debuggeria.
+        bool lapaistaanko = false; 
+
+        return lapaistaanko;
+    }
+
+
+    /// <summary>
+    /// Tehtävä 2.
+    /// 
+    /// Funktiolle annetaan parametrina taulukko lukuja, joka sisältää 999 samaa
+    /// yhtä sattumanvaraista lukua. 
+    /// Lisäksi jossain kohdassa taulukkoa on yksi, muita lukuja suurempi luku.
+    /// Funktion tarkoituksena on palauttaa tämän yhden, muita suuremman luvun paikka,
+    /// mutta funktion koodissa onkin vika, minkä takia funktio palauttaa aina vain -1.
+    ///
+    /// Tehtävänäsi on löytää tämän yhden, kaikkia muita lukuja suuremman, luvun
+    /// paikka parametrina annetusta taulukosta käyttäen ehdollista keskeytyskohtaa.
+    ///	Sitten korvaat debuggeria käyttäen luvunPaikka-muuttujan arvon suuremman
+    ///	luvun oikealla paikalla (toteutuksessa luvunPaikka on aina vain -1), 
+    /// jotta funktio palauttaa oikean arvon.
+    /// 
+    /// Tehtävässä täytyy käyttää ehdollista keskeytyskohtaa. Pelkkä taulukon
+    /// selaaminen läpi ei riitä vastaukseksi.
+    /// 
+    /// </summary>
+    /// <param name="taulukko">Läpikäytävä kokonaislukutaulukko</param>
+    /// <returns>Indeksi, jossa erilainen kohta oli</returns>
+    public int HaeSuuremmanLuvunPaikka(int[] taulukko)
+    {
+        int luvunPaikka = -1;
+
+        int luku = taulukko[0];
+        int edellinenLuku = luku;
+
+        for (int i = 1; i < taulukko.Length; i++)
+        {
+            edellinenLuku = luku;   
+            luku = taulukko[i];
+        }
+
+        return luvunPaikka;
+    }
+
+
+    /// <summary>
+    /// Pääohjelma. Voit jättää tämän huomiotta.
+    /// </summary>
+    public static void Main()
+    {
+        new Tarkistaja.Tarkistaja(new DebugKoe(), DebugExamLanguage.FINNISH).Aloita();
+    }
+}
\ No newline at end of file
diff --git a/DebugKoe/DebugKoe/DebugKoe.csproj b/DebugKoe/DebugKoe/DebugKoe.csproj
new file mode 100644
index 0000000..9befb1e
--- /dev/null
+++ b/DebugKoe/DebugKoe/DebugKoe.csproj
@@ -0,0 +1,16 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <OutputType>Exe</OutputType>
+        <TargetFramework>net8.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <Reference Include="Tarkistaja">
+        <HintPath>..\..\..\..\Users\konst\Downloads\Tarkistaja.dll</HintPath>
+      </Reference>
+    </ItemGroup>
+
+</Project>
diff --git "a/Harjoitusty\303\266/OilSaber/OilSaber.cs" "b/Harjoitusty\303\266/OilSaber/OilSaber.cs"
index 8f248e6..1e77d40 100644
--- "a/Harjoitusty\303\266/OilSaber/OilSaber.cs"
+++ "b/Harjoitusty\303\266/OilSaber/OilSaber.cs"
@@ -1,11 +1,7 @@
-using System;
+
 using System.Collections.Generic;
-using System.Runtime.Intrinsics.X86;
-using FarseerPhysics.Dynamics;
+
 using Jypeli;
-using Jypeli.Assets;
-using Jypeli.Controls;
-using Jypeli.Widgets;
 
 namespace OilSaber;
 
@@ -16,150 +12,81 @@ namespace OilSaber;
 /// </summary>
 public class OilSaber : PhysicsGame
 {
-    // Määritellään lista pelaajan painikkeille
-    private HashSet<Key> Painikkeet = new HashSet<Key>();
-    private int PelaajaHp = 3; //laskuri pelaajan Hp:lle
-    private List<PhysicsObject> morkot = new List<PhysicsObject>(); // Lista möröille
-    private List<PhysicsObject> morkot2 = new List<PhysicsObject>(); //Lista Morko2:llie
-    private PhysicsObject Morko2; //tehdään vihollisista globaaleja muuttujia, jotta niitä voidaan käyttää aliohjelmissa
-    private PhysicsObject Morko;//tehdään vihollisista globaaleja muuttujia, jotta niitä voidaan käyttää aliohjelmissa
-
+    /// <summary>
+    /// Määritellään lista pelaajan painikkeille
+    /// </summary>
+    private HashSet<Key> _painikkeet = new HashSet<Key>();
+    
+    
+    /// <summary>
+    /// laskuri pelaajan Hp:lle
+    /// </summary>
+    private int _pelaajaHp = 3;
+    
+    
+    /// <summary>
+    /// Lista möröille
+    /// </summary>
+    private List<PhysicsObject> _morkot = new List<PhysicsObject>();
+    
+    
+    /// <summary>
+    /// Lista Morko2:llie
+    /// </summary>
+    private List<PhysicsObject> _morkot2 = new List<PhysicsObject>();
+    
+    
+    /// <summary>
+    /// tehdään vihollisista globaaleja muuttujia, jotta niitä voidaan käyttää aliohjelmissa
+    /// </summary>
+    private PhysicsObject _morko2;
+    
+    
+    
+    /// <summary>
+    /// Tehdään pelaajasta globaali muuttuja, jotta sitä voidaan käyttää aliohjelmissa
+    /// </summary>
+    private PhysicsObject _pelaaja;
+
+
+    /// <summary>
+    /// Tehdään pisteistä globaali muuttuja, jotta sitä voidaan käyttää aliohjelmissa
+    /// </summary>
+    private int _pisteet;
+    private Label _pistelaskuri;
+    private Label _pelaajaHpLaskuri;
+    
     public override void Begin()
     {
         Level.Background.Color = Color.Black;
-
-        //pelaaja
-        PhysicsObject pelaaja = new PhysicsObject(45, 45, Shape.Rectangle);
-        pelaaja.Color = Color.Blue;
-        pelaaja.Tag = "pelaaja";
-        Add(pelaaja);
-        pelaaja.MaxVelocity = 400;
-
-        //Mörkö
-
-        void lisaaMorko(int maara)
-        {
-            for (int i = 0; i < maara; i++)
-            {
-                PhysicsObject Morko = new PhysicsObject(30, 30, Shape.Circle);
-                Morko.Color = Color.Green;
-                Morko.Tag = "Morko";
-                double x = RandomGen.NextDouble(Level.Left, Level.Right);
-                double y = Level.Top;
-                Morko.CollisionIgnoreGroup = 2;
-                Morko.Position = new Vector(x, y); // Aseta satunnainen sijainti
-                Morko.Velocity = new Vector(0, -100);
-                AddCollisionHandler(Morko, Morkotuhoa); //törmäyskäsittelijä jolla pelaaja voi tuhota mörköjä
-                AddCollisionHandler(Morko, HP); //törmäyskäsittelijä, jolla pelaaja voidaan tuhota
-                Add(Morko);
-                morkot.Add(Morko);
-            }
-        }
-
-        //Morko2
-        void lisaaMorko2(int maara)
-        {
-            for (int i = 0; i < maara; i++)
-            {
-               Morko2 = new PhysicsObject(70, 70, Shape.Circle);
-                Morko2.Color = Color.OrangeRed;
-                Morko2.Tag = "Morko2";
-                double x = RandomGen.NextDouble(Level.Left, Level.Right);
-                double y = Level.Top;
-                Morko2.CollisionIgnoreGroup = 2;
-                Morko2.Position = new Vector(x, y); // Aseta satunnainen sijainti
-                Morko2.Velocity = new Vector(0, -200);
-                AddCollisionHandler(Morko2, Morkotuhoa2); //törmäyskäsittelijä jolla pelaaja voi tuhota mörköjä
-                AddCollisionHandler(Morko2, HP2); //törmäyskäsittelijä, jolla pelaaja voidaan tuhota
-                Add(Morko2);
-                morkot2.Add(Morko2);
-                // ajastin ampumiselle
-                Timer morko2AmpumisAika = new Timer();
-                morko2AmpumisAika.Interval = 3;
-                if (pelaaja != null || Morko2 != null)
-                {
-                    morko2AmpumisAika.Timeout += morko2ampuu;
-                }
-                morko2AmpumisAika.Start();
-            }
-        }
-
-        //funktio mörköjen suunnan vaihtamiselle
-        void VaihdaMorkojenSuunta()
-        {
-            foreach (var morko in morkot)
-            {
-                if (morko.Left < Level.Left ||
-                    morko.Right > Level.Right) //jos möröt ovat ruudun reunalla, niin ne kääntyvät
-                {
-                    morko.Velocity = -morko.Velocity;
-                }
-
-                if (morko.Top > Level.Top ||
-                    morko.Bottom < Level.Bottom) //jos möröt ovat ruudun reunalla, niin ne kääntyvät
-                {
-                    morko.Velocity = -morko.Velocity;
-                }
-
-                if (pelaaja != null && morko != null)
-                {
-                    Vector suunta = (pelaaja.Position - morko.Position).Normalize(); //laskee pelaajan vektorin
-                    morko.Move(suunta * 200); //lähettää möröt pelaajaa kohti
-                }
-            }
-            foreach (var morko2 in morkot2)
-            {
-                if (morko2.Left < Level.Left ||
-                    morko2.Right > Level.Right) //jos möröt ovat ruudun reunalla, niin ne kääntyvät
-                {
-                    morko2.Velocity = -morko2.Velocity;
-                }
-
-                if (morko2.Top > Level.Top ||
-                    morko2.Bottom < Level.Bottom) //jos möröt ovat ruudun reunalla, niin ne kääntyvät
-                {
-                    morko2.Velocity = -morko2.Velocity;
-                }
-
-                if (pelaaja != null && morko2 != null)
-                {
-                    Vector suunta = (pelaaja.Position - morko2.Position).Normalize(); //laskee pelaajan vektorin
-                    morko2.Move(suunta * 200); //lähettää möröt pelaajaa kohti
-                }
-            }
-
-        }
-
-        //ajastin mörköjen suunnan vaihteluun
-        Timer MorkoSuunta = new Timer();
-        MorkoSuunta.Interval = 3;
-        MorkoSuunta.Timeout += VaihdaMorkojenSuunta;
-        MorkoSuunta.Start();
+        LisaaPelaaja();
+        Pistelaskuri();
+        _Tarkistamorot();
+        MorkoSuunnistus();
+        UpdateLiike();
+        _kuuntelepainikkeet();
+        
+        //Pelaajan hp laskuri
+        _pelaajaHpLaskuri = new Label();
+        _pelaajaHpLaskuri.TextColor = Color.White;
+        _pelaajaHpLaskuri.BorderColor = Color.Black;
+        _pelaajaHpLaskuri.Position = new Vector(Screen.Right -100, Screen.Top - 50);
+        _pelaajaHpLaskuri.Text = "Hp:" + _pelaajaHp;
+        Add(_pelaajaHpLaskuri);
         
-
-// funktio tarkistaa onko mörköjä jäljellä. Jos ei ole, niin se lisää niitä
-        void tarkistamorot()
-        {
-            if (morkot.Count == 00)
-            {
-                lisaaMorko(5);
-                if (morkot2.Count == 00);
-                {
-                    lisaaMorko2(3);
-                }
-            }
-        }
-
         //ajastin tarkistaa joka 1,5s välein onko mörköjä jäljellä ja kutsuu tarvittaessa "tarkistamorot"
         Timer onkoVihollista = new Timer();
         onkoVihollista.Interval = 1.5;
-        onkoVihollista.Timeout += tarkistamorot;
+        onkoVihollista.Timeout += _Tarkistamorot;
         onkoVihollista.Start();
-
-
-
-
-        //liikkumisen määrrittely
+    }
+    
+    
+    /// <summary>
+    /// Pelin painikkeiden määrrittely
+    /// </summary>
+    private void _kuuntelepainikkeet()
+    {
         Keyboard.Listen(Key.Up, ButtonState.Pressed, Lisaasuunta, "liikuta pelaaja ylös", Key.Up);
         Keyboard.Listen(Key.Up, ButtonState.Released, Poistasuunta, "pysäytä pelaaja", Key.Up);
 
@@ -177,159 +104,382 @@ public class OilSaber : PhysicsGame
 
         // pelistä poistuminen
         Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
-
-// lista johon lisätään painetut painikkeet ja päivitetään tilanne
-        void Lisaasuunta(Key Painike)
+    }
+    
+    
+    /// <summary>
+    /// ajastin mörköjen suunnan vaihteluun
+    /// </summary>
+    private void MorkoSuunnistus()
+    {
+        Timer morkoSuunta = new Timer();
+        morkoSuunta.Interval = 3;
+        morkoSuunta.Timeout += VaihdaMorkojenSuunta;
+        morkoSuunta.Start();
+    }
+    
+    
+    /// <summary>
+    /// Pistelaskuri
+    /// </summary>
+    private void Pistelaskuri()
+    {
+        _pistelaskuri = new Label();
+        _pistelaskuri.TextColor = Color.LightYellow;
+        _pistelaskuri.BorderColor = Color.Black;
+        _pistelaskuri.Position = new Vector(Screen.Left + 100, Screen.Top - 50);
+        _pistelaskuri.Text = "Pisteet:0";
+        Add(_pistelaskuri);
+    }
+    
+    
+    /// <summary>
+    /// pelaaja
+    /// </summary>
+    private void LisaaPelaaja()
+    {
+        _pelaaja = new PhysicsObject(45, 45, Shape.Rectangle);
+        _pelaaja.Color = Color.Blue;
+        _pelaaja.Tag = "pelaaja";
+        Add(_pelaaja);
+        _pelaaja.MaxVelocity = 400;
+    }
+    
+    
+    /// <summary>
+    /// pelaajan hp joka tyhjentyessään tuhoaa pelaajan(Morko2)
+    /// </summary>
+    /// <param name="morko2"></param>
+    /// <param name="toinen"></param>
+    private void _TarkistaHp2(PhysicsObject morko2, PhysicsObject toinen)
+    {
+        if (toinen.Tag.ToString() == "pelaaja")
         {
-            Painikkeet.Add(Painike);
-            UpdateLiike();
+            _pelaajaHp--;
+            if (_pelaajaHp <= 0)
+            {
+                Remove(_pelaaja);
+                MessageDisplay.Add("Tuhouduit!");
+            }
+            else
+            {
+                MessageDisplay.Add(_pelaajaHp + "/3 HP");
+            }
         }
-
-// lista josta poistetaan vapautetu painikkeet ja päivitetään tilanne
-        void Poistasuunta(Key Painike)
+    }
+    
+    
+    /// <summary>
+    /// pelaajan hp joka tyhjentyessään tuhoaa pelaajan
+    /// </summary>
+    /// <param name="morko"></param>
+    /// <param name="toinen"></param>
+    private void _TarkistaHp(PhysicsObject morko, PhysicsObject toinen)
+    {
+        if (toinen.Tag.ToString()== "pelaaja")
         {
-            Painikkeet.Remove(Painike);
-            UpdateLiike();
+            _pelaajaHp--;
+            if (_pelaajaHp <= 0)
+            {
+                Remove(_pelaaja);
+                MessageDisplay.Add("Tuhouduit!");
+                ConfirmExit();
+            }
+            else
+            {
+                MessageDisplay.Add(_pelaajaHp + "/3 HP");
+            }
+            _pelaajaHpLaskuri.Text = "HP:" + _pelaajaHp;
         }
-
-// Päivittää painettujen painikkeiden listan ja määrittelee miten pelaaja liikkuu
-        void UpdateLiike()
+    }
+    
+    
+    /// <summary>
+    /// funktio jolla mörkö2 tuhotaan
+    /// </summary>
+    /// <param name="morko2"></param>
+    /// <param name="toinen"></param>
+    private void Morkotuhoa2(PhysicsObject morko2, PhysicsObject toinen)
+    {
+        if (toinen.Tag.ToString() == "luoti")
         {
-            Vector Liike = new Vector();
-
-            if (Painikkeet.Contains(Key.Up)) Liike += new Vector(0, 300);
-            if (Painikkeet.Contains(Key.Down)) Liike += new Vector(0, -300);
-            if (Painikkeet.Contains(Key.Left)) Liike += new Vector(-300, 0);
-            if (Painikkeet.Contains(Key.Right)) Liike += new Vector(300, 0);
-
-            pelaaja.Velocity = Liike;
+            Remove(morko2);
+            _morkot2.Remove(morko2);
+            Remove(toinen);
         }
-
-        //pelaaja ampuu
-        void PelaajaAmmu()
+        MessageDisplay.Clear();
+        MessageDisplay.Add("+10p");
+        _pisteet += 15;
+        _pistelaskuri.Text = "Pisteet:" + _pisteet; 
+    }
+    
+    
+    /// <summary>
+    /// funktio jolla möröt tuhotaan
+    /// </summary>
+    /// <param name="morko"></param>
+    /// <param name="toinen"></param>
+    private void Morkotuhoa(PhysicsObject morko, PhysicsObject toinen)
+    {
+        if (toinen.Tag.ToString()== "luoti")
         {
-            Ammu();
-        }
+                
+            Remove(morko);
+            _morkot.Remove(morko);
+            Remove(toinen);
 
-        // määritellään luoti  ja sen liikkuminen
-        void Ammu()
-        {
-            PhysicsObject uusiLuoti = new PhysicsObject(5, 10, Shape.Diamond);
-            uusiLuoti.Color = Color.Red;
-            uusiLuoti.Position = pelaaja.Position + new Vector(0, 20);
-            uusiLuoti.Velocity = new Vector(0, 700);
-            uusiLuoti.CollisionIgnoreGroup = 1; // Estetään törmäykset pelaajan kanssa
-            uusiLuoti.Tag = "luoti"; //tunniste törmäystä varten
-            Add(uusiLuoti);
-            Timer.SingleShot(3.0, () => Remove(uusiLuoti)); // Poistetaan luoti kun se menee liian korkealle
         }
-
-        void morko2ampuu()
+        MessageDisplay.Clear();
+        MessageDisplay.Add("+10p");
+        _pisteet += 10;
+        _pistelaskuri.Text = "Pisteet:" + _pisteet; 
+    }
+    
+    
+    /// <summary>
+    /// pelaajan hp joka tyhjentyessään tuhoaa pelaajan(Morko2ampuu)
+    /// </summary>
+    /// <param name="uusiLuoti2"></param>
+    /// <param name="toinen"></param>
+    private void _TarkistaHP3(PhysicsObject uusiLuoti2, PhysicsObject toinen)
+    {
+        if (toinen.Tag.ToString() == "pelaaja")
         {
-            foreach(var morko2 in morkot2)
+            _pelaajaHp--;
+            if (_pelaajaHp <= 0)
             {
-                Ammu2(morko2);  
+                Remove(_pelaaja);
+                MessageDisplay.Add("Tuhouduit!");
+                ConfirmExit();
             }
-            
+            else
+            {
+                MessageDisplay.Add(_pelaajaHp + "/3 HP");
+            }
+            _pelaajaHpLaskuri.Text = "HP:" + _pelaajaHp;
         }
-        // määritellään Mörkö2 ampuminen pelaajaa kohti
-        void Ammu2(PhysicsObject Morko2)
+    }
+    
+    
+    /// <summary>
+    /// määritellään Mörkö2 ampuminen pelaajaa kohti
+    /// </summary>
+    /// <param name="morko2"></param>
+    private void Ammu2(PhysicsObject morko2)
+    {
+        PhysicsObject uusiLuoti2 = new PhysicsObject(10, 10, Shape.Diamond);
+        uusiLuoti2.Color = Color.Pink;
+        Vector suunta = (_pelaaja.Position - morko2.Position).Normalize(); //laskee pelaajan vektorin
+        uusiLuoti2.Position = morko2.Position + suunta;
+        uusiLuoti2.Velocity = suunta * 700;
+        uusiLuoti2.CollisionIgnoreGroup = 2; // Estetään törmäykset Mörköjen kanssa kanssa
+        uusiLuoti2.Tag = "luoti2"; //tunniste törmäystä varten
+        AddCollisionHandler(uusiLuoti2, _TarkistaHP3);// mahdollistetaan pelaajan vahingoittaminen
+        Add(uusiLuoti2);
+        Timer.SingleShot(3.0, () => Remove(uusiLuoti2)); // Poistetaan luoti kun se menee liian pitkälle
+    }
+    
+    
+    /// <summary>
+    /// Kutsutaan Ammu2 jokaiselle morko2:lle
+    /// </summary>
+    private void _Morko2ampuu()
+    {
+        foreach(var morko2 in _morkot2)
         {
-            PhysicsObject uusiLuoti2 = new PhysicsObject(10, 10, Shape.Diamond);
-            uusiLuoti2.Color = Color.BrightGreen;
-            Vector suunta = (pelaaja.Position - Morko2.Position).Normalize(); //laskee pelaajan vektorin
-            uusiLuoti2.Position = Morko2.Position + suunta;
-            uusiLuoti2.Velocity = suunta * 700;
-            uusiLuoti2.CollisionIgnoreGroup = 2; // Estetään törmäykset Mörköjen kanssa kanssa
-            uusiLuoti2.Tag = "luoti2"; //tunniste törmäystä varten
-            AddCollisionHandler(uusiLuoti2, HP3);// mahdollistetaan pelaajan vahingoittaminen
-            Add(uusiLuoti2);
-            Timer.SingleShot(3.0, () => Remove(uusiLuoti2)); // Poistetaan luoti kun se menee liian pitkälle
+            Ammu2(morko2);  
         }
-        //pelaajan hp joka tyhjentyessään tuhoaa pelaajan(Morko2ampuu)
-        void HP3(PhysicsObject uusiLuoti2, PhysicsObject toinen)
+            
+    }
+    
+    
+    /// <summary>
+    ///  määritellään luoti  ja sen liikkuminen
+    /// </summary>
+    private void Ammu()
+    {
+        PhysicsObject uusiLuoti = new PhysicsObject(5, 10, Shape.Diamond);
+        uusiLuoti.Color = Color.Red;
+        uusiLuoti.Position = _pelaaja.Position + new Vector(0, 20);
+        uusiLuoti.Velocity = new Vector(0, 700);
+        uusiLuoti.CollisionIgnoreGroup = 1; // Estetään törmäykset pelaajan kanssa
+        uusiLuoti.Tag = "luoti"; //tunniste törmäystä varten
+        Add(uusiLuoti);
+        Timer.SingleShot(3.0, () => Remove(uusiLuoti)); // Poistetaan luoti kun se menee liian korkealle
+    }
+    
+    
+    /// <summary>
+    /// pelaaja ampuu
+    /// </summary>
+    private void PelaajaAmmu()
+    { 
+        Ammu();
+    }
+    
+    
+    /// <summary>
+    /// Päivittää painettujen painikkeiden listan ja määrittelee miten pelaaja liikkuu
+    /// </summary>
+    private void UpdateLiike()
+    {
+        Vector liike = new Vector();
+
+        if (_painikkeet.Contains(Key.Up)) liike += new Vector(0, 300);
+        if (_painikkeet.Contains(Key.Down)) liike += new Vector(0, -300);
+        if (_painikkeet.Contains(Key.Left)) liike += new Vector(-300, 0);
+        if (_painikkeet.Contains(Key.Right)) liike += new Vector(300, 0);
+
+        _pelaaja.Velocity = liike;
+    }
+    
+    
+    /// <summary>
+    /// lista johon lisätään painetut painikkeet ja päivitetään tilanne
+    /// </summary>
+    /// <param name="painike"></param>
+    private void Lisaasuunta(Key painike)
+    {
+        _painikkeet.Add(painike);
+        UpdateLiike();
+    }
+
+        
+/// <summary>
+/// lista josta poistetaan vapautetu painikkeet ja päivitetään tilanne
+/// </summary>
+/// <param name="painike"></param>
+    private void Poistasuunta(Key painike)
+    {
+        _painikkeet.Remove(painike);
+        UpdateLiike();
+    }
+    
+    
+    /// <summary>
+    /// funktio tarkistaa onko mörköjä jäljellä. Jos ei ole, niin se lisää niitä
+    /// </summary>
+    private void _Tarkistamorot()
+    {
+        if (_morkot.Count == 00)
         {
-            if (toinen.Tag == "pelaaja")
+            LisaaMorko(5);
+            
+            if (_morkot2.Count == 00)
             {
-                PelaajaHp--;
-                if (PelaajaHp <= 0)
-                {
-                    Remove(pelaaja);
-                    MessageDisplay.Add("Tuhouduit!");
-                }
-                else
-                {
-                    MessageDisplay.Add(PelaajaHp + "/3 HP");
-                }
             }
-        }
-        
 
-
-        //funktio jolla möröt tuhotaan
-        void Morkotuhoa(PhysicsObject morko, PhysicsObject toinen)
+            {
+                LisaaMorko2(3);
+            }
+        }
+    }
+    
+    
+    /// <summary>
+    /// funktio mörköjen suunnan vaihtamiselle
+    /// </summary>
+    private void VaihdaMorkojenSuunta()
+    {
+        foreach (var morko in _morkot)
         {
-            if (toinen.Tag == "luoti")
+            if (morko.Left < Level.Left ||
+                morko.Right > Level.Right) //jos möröt ovat ruudun reunalla, niin ne kääntyvät
             {
-                Remove(morko);
-                morkot.Remove(morko);
-                MessageDisplay.Add("+10p");
-                Remove(toinen);
+                morko.Velocity = -morko.Velocity;
+            }
 
+            if (morko.Top > Level.Top ||
+                morko.Bottom < Level.Bottom) //jos möröt ovat ruudun reunalla, niin ne kääntyvät
+            {
+                morko.Velocity = -morko.Velocity;
             }
-        }
 
-        //funktio jolla mörkö2 tuhotaan
-        void Morkotuhoa2(PhysicsObject morko2, PhysicsObject toinen)
+            if (_pelaaja != null)
+            {
+                Vector suunta = (_pelaaja.Position - morko.Position).Normalize(); //laskee pelaajan vektorin
+                morko.Move(suunta * 200); //lähettää möröt pelaajaa kohti
+            }
+        }
+        foreach (var morko2 in _morkot2)
         {
-            if (toinen.Tag == "luoti")
+            if (morko2.Left < Level.Left ||
+                morko2.Right > Level.Right) //jos möröt ovat ruudun reunalla, niin ne kääntyvät
             {
-                Remove(morko2);
-                morkot2.Remove(morko2);
-                MessageDisplay.Add("+10p");
-                Remove(toinen);
+                morko2.Velocity = -morko2.Velocity;
+            }
 
+            if (morko2.Top > Level.Top ||
+                morko2.Bottom < Level.Bottom) //jos möröt ovat ruudun reunalla, niin ne kääntyvät
+            {
+                morko2.Velocity = -morko2.Velocity;
             }
-        }
 
-        //pelaajan hp joka tyhjentyessään tuhoaa pelaajan
-        void HP(PhysicsObject morko, PhysicsObject toinen)
-        {
-            if (toinen.Tag == "pelaaja")
+            if (_pelaaja != null)
             {
-                PelaajaHp--;
-                if (PelaajaHp <= 0)
-                {
-                    Remove(pelaaja);
-                    MessageDisplay.Add("Tuhouduit!");
-                }
-                else
-                {
-                    MessageDisplay.Add(PelaajaHp + "/3 HP");
-                }
+                Vector suunta = (_pelaaja.Position - morko2.Position).Normalize(); //laskee pelaajan vektorin
+                morko2.Move(suunta * 200); //lähettää möröt pelaajaa kohti
             }
         }
 
-        //pelaajan hp joka tyhjentyessään tuhoaa pelaajan(Morko2)
-        void HP2(PhysicsObject morko2, PhysicsObject toinen)
+    }
+    
+    /// <summary>
+    /// Morko2
+    /// </summary>
+    /// <param name="maara"></param>
+    private void LisaaMorko2(int maara)
+    {
+        for (int i = 0; i < maara; i++)
         {
-            if (toinen.Tag == "pelaaja")
+            _morko2 = new PhysicsObject(70, 70, Shape.Circle);
+            _morko2.Color = Color.OrangeRed;
+            _morko2.Tag = "Morko2";
+            double x = RandomGen.NextDouble(Level.Left, Level.Right);
+            double y = Level.Top;
+            _morko2.CollisionIgnoreGroup = 2;
+            _morko2.Position = new Vector(x, y); // Aseta satunnainen sijainti
+            _morko2.Velocity = new Vector(0, -200);
+            AddCollisionHandler(_morko2, Morkotuhoa2); //törmäyskäsittelijä jolla pelaaja voi tuhota mörköjä
+            AddCollisionHandler(_morko2, _TarkistaHp2); //törmäyskäsittelijä, jolla pelaaja voidaan tuhota
+            Add(_morko2);
+            _morkot2.Add(_morko2);
+                
+            //ajastin ampumiselle
+            Timer morko2AmpumisAika = new Timer();
+            morko2AmpumisAika.Interval = 3;
+            if (_pelaaja != null || _morko2 != null)
             {
-                PelaajaHp--;
-                if (PelaajaHp <= 0)
-                {
-                    Remove(pelaaja);
-                    MessageDisplay.Add("Tuhouduit!");
-                }
-                else
-                {
-                    MessageDisplay.Add(PelaajaHp + "/3 HP");
-                }
+                morko2AmpumisAika.Timeout += _Morko2ampuu;
             }
+            morko2AmpumisAika.Start();
+        }
+    }
+    /// <summary>
+    /// Mörkö
+    /// </summary>
+    /// <param name="maara"></param>
+    private void LisaaMorko(int maara)
+    {
+        for (int i = 0; i < maara; i++)
+        {
+            PhysicsObject morko = new PhysicsObject(30, 30, Shape.Circle);
+            morko.Color = Color.Green;
+            morko.Tag = "Morko";
+            double x = RandomGen.NextDouble(Level.Left, Level.Right);
+            double y = Level.Top;
+            morko.CollisionIgnoreGroup = 2;
+            morko.Position = new Vector(x, y); // Aseta satunnainen sijainti
+            morko.Velocity = new Vector(0, -100);
+            AddCollisionHandler(morko, Morkotuhoa); //törmäyskäsittelijä jolla pelaaja voi tuhota mörköjä
+            AddCollisionHandler(morko, _TarkistaHp); //törmäyskäsittelijä, jolla pelaaja voidaan tuhota
+            Add(morko);
+            _morkot.Add(morko);
         }
     }
 }
         
+
         
 
     
diff --git a/demo 7 t 2/demo 7 t 2/demo 7 t 2.cs b/demo 7 t 2/demo 7 t 2/demo 7 t 2.cs
index 68e9e53..5a6c71a 100644
--- a/demo 7 t 2/demo 7 t 2/demo 7 t 2.cs	
+++ b/demo 7 t 2/demo 7 t 2/demo 7 t 2.cs	
@@ -8,27 +8,16 @@ using System.Collections.Generic;
 /// <summary>
 /// 
 /// </summary>
-public class demo_7_t_2
+public class demo_11_t_4
 {
     /// <summary>
     /// 
     /// </summary>
     public static void Main()
     {
-        string kolmio = LuoKolmio('@', 8);
-        Console.WriteLine(kolmio);
+        List<int[]> pysakit = new List<int[]>();
+        pysakit.Add(new int[] {5,4});
+        pysakit.Add(new int[] {3,2});
+        int matkustajiaAluksi = 6;
     }
-
-    public static string LuoKolmio(char materiaali, int koko)
-    {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 1; i <= koko; i++)
-        {
-            sb.Append(materiaali, i);
-            sb.Append("\n");
-        }
-        return sb.ToString();
-        
-    }
-    
-}
\ No newline at end of file
+       
\ No newline at end of file
-- 
GitLab