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