From bf1f7dcffce799c2d947461f13a6db5f9d2afed6 Mon Sep 17 00:00:00 2001 From: Kopperoinen Paulus Juho <paulus.j.kopperoinen@student.jyu.fi> Date: Fri, 24 Nov 2023 17:08:29 +0200 Subject: [PATCH] =?UTF-8?q?Vaihdoin=20nimet=20sellaisiksi,=20ettei=20niiss?= =?UTF-8?q?=C3=A4=20ole=20=5F.=20Muutin=20kent=C3=A4n=20sellaiseksi,=20ett?= =?UTF-8?q?=C3=A4=20se=20luodaan=20silmukoilla,=20eik=C3=A4=20sellaisella?= =?UTF-8?q?=20merkkikartalla.=20MuutinArvoOmena=20aliohjelman=20ArvoPaikak?= =?UTF-8?q?si,=20ja=20tein=20siit=C3=A4=20funktion,=20koska=20minulla=20ei?= =?UTF-8?q?=20ollut=20aiemmin=20yht=C3=A4k=C3=A4=C3=A4n=20funktiota,=20jok?= =?UTF-8?q?a=20palauttaisi=20jotain=20ohjelmassa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Matopeli/Matopeli/Matopeli.cs | 345 ++++++++++++++++++---------------- 1 file changed, 180 insertions(+), 165 deletions(-) diff --git a/Matopeli/Matopeli/Matopeli.cs b/Matopeli/Matopeli/Matopeli.cs index ea15621..38e6445 100644 --- a/Matopeli/Matopeli/Matopeli.cs +++ b/Matopeli/Matopeli/Matopeli.cs @@ -11,31 +11,9 @@ namespace matopeli; public class Matopeli : PhysicsGame { - private static readonly string[] Tasonkuva = { - "#####################", - "# #", - "# #", - "# #", - "# #", - "# #", - "# m #", - "# #", - "# #", - "# #", - "# #", - "# #", - "# #", - "# #", - "# #", - "# #", - "#o #", - "#####################", - }; - - - private Objektit _mato; - private Objektit _omena; - private Objektit _matoMuu; + private Objektit mato; + private Objektit omena; + private Objektit matomuu; private IntMeter Pistelaskuri; public IntMeter Ennatyslaskuri; @@ -44,23 +22,23 @@ public class Matopeli : PhysicsGame private readonly List<PhysicsObject> MatoKeho = new List<PhysicsObject>(); private int Leveys; - private int Korkeus; - private double Nopeus; - - private Vector _omenaAlkuPaikka; + private int KenttaKoko; + private double Nopeus; + private int KentanSijainti; private static readonly Image Seinakuva = LoadImage("seina.png"); private static readonly Image Matopaakuva = LoadImage("matopaa.png"); - private readonly Image _matokehokuva = LoadImage("matokeho.png"); - private readonly Image _omenakuva = LoadImage("omena.png"); + private readonly Image matokehokuva = LoadImage("matokeho.png"); + private readonly Image omenakuva = LoadImage("omena.png"); - private bool _suuntaYlos; - private bool _suuntaAlas; - private bool _suuntaOikea; - private bool _suuntaVasen; + private bool suuntaYlos; + private bool suuntaAlas; + private bool suuntaOikea; + private bool suuntaVasen; - private bool _matoLiikkunut; - private bool _omenaKentalla; + private bool matoLiikkunut; + private bool omenaKentalla; + /// <summary> /// Kun peli käynnistetään ensimmäisen kerran @@ -80,11 +58,7 @@ public class Matopeli : PhysicsGame MatoSijainti.Clear(); ClearAll(); Asetukset(); - TileMap tiles = TileMap.FromStringArray(Tasonkuva); - tiles['#'] = LuoSeina; - tiles['m'] = LuoMato; - tiles.Insert(Leveys,Korkeus); - _omenaAlkuPaikka = _mato.Position; + LuoMato(Luoseinat(KenttaKoko, Leveys)); Asetaohjaimet(); LuoAikalaskuri(); LuoPistelaskuri(); @@ -109,12 +83,12 @@ public class Matopeli : PhysicsGame /// <summary> /// Laskee pisteet, joita kerätään omenoita syömällä /// </summary> - void LuoPistelaskuri() + private void LuoPistelaskuri() { Pistelaskuri = new IntMeter(0); Label pistenaytto = new Label(); - pistenaytto.X = Screen.Left + 500; - pistenaytto.Y = Screen.Top - 5; + pistenaytto.X = KentanSijainti+ KenttaKoko/2 * Leveys; + pistenaytto.Y = KentanSijainti + (KenttaKoko+2) * Leveys; pistenaytto.TextColor = Color.Brown; pistenaytto.Color = Color.LightGreen; pistenaytto.Title = "Pisteet: "; @@ -129,14 +103,15 @@ public class Matopeli : PhysicsGame private void Asetukset() { Leveys = 40; - Korkeus = 40; - _suuntaYlos = false; - _suuntaAlas = false; - _suuntaOikea = true; - _suuntaVasen = false; + KenttaKoko = 16; + KentanSijainti = -300; + suuntaYlos = false; + suuntaAlas = false; + suuntaOikea = true; + suuntaVasen = false; Nopeus = 0.1; - _matoLiikkunut = false; - _omenaKentalla = true; + matoLiikkunut = false; + omenaKentalla = true; } @@ -148,22 +123,21 @@ public class Matopeli : PhysicsGame AloitaUusiPeli(); } + /// <summary> /// Luo madon kentälle /// </summary> /// <returns></returns> - private PhysicsObject LuoMato() + private void LuoMato(Vector paikka) { - _mato = new Objektit(Leveys-5, Korkeus-5); - _mato.Image = Matopaakuva; - Add(_mato); - _mato.Tag = "mato"; - - AddCollisionHandler(_mato, "omena", delegate(IPhysicsObject _, IPhysicsObject _) {MatoSyoOmenan(); }); - AddCollisionHandler(_mato, "seina", delegate(IPhysicsObject _, IPhysicsObject _) {MatoKuolee(); }); - AddCollisionHandler(_mato, "matokeho", delegate(IPhysicsObject _, IPhysicsObject _) {MatoKuolee(); }); - - return _mato; + mato = new Objektit(Leveys-5, Leveys-5); + mato.Image = Matopaakuva; + Add(mato); + mato.Tag = "mato"; + mato.Position = ArvoPaikka(paikka,3); + AddCollisionHandler(mato, "omena", delegate(IPhysicsObject omena, IPhysicsObject mato) {MatoSyoOmenan(); }); + AddCollisionHandler(mato, "seina", delegate(IPhysicsObject seina, IPhysicsObject mato) {MatoKuolee(); }); + AddCollisionHandler(mato, "matokeho", delegate(IPhysicsObject matomuu, IPhysicsObject mato) {MatoKuolee(); }); } @@ -172,74 +146,112 @@ public class Matopeli : PhysicsGame /// </summary> private void LuoOmena() { - Vector paikka = ArvoOmenaPaikka(); - _omena = new Objektit(Korkeus-10, Leveys-10); - _omena.Shape = Shape.Circle; - _omena.Position = paikka; - _omena.Image = _omenakuva; - _omena.Tag = "omena"; - Add(_omena); - _omenaKentalla = true; + int i = 1; + Vector paikka = ArvoPaikka(new Vector(KentanSijainti,KentanSijainti),0); + while (i>0) + { + if (paikka != mato.Position) + { + break; + } + paikka = ArvoPaikka(new Vector(KentanSijainti,KentanSijainti),0); + } + omena = new Objektit(Leveys-10, Leveys-10); + omena.Shape = Shape.Circle; + omena.Position = paikka; + omena.Image = omenakuva; + omena.Tag = "omena"; + Add(omena); + omenaKentalla = true; } /// <summary> - /// tehtävä on arpoa omenalle paikka, johon se luodaan. En ole vieläkään varma kuinka hyvin tämä toimii. + /// Arpoo sattumanvaraisen paikan kentältä ja palauttaa kyseisen vektorin /// </summary> - private Vector ArvoOmenaPaikka() + /// <param name="alkupaikka">Mihin arvottavaa paikkaa halutaan suhteuttaa</param> + /// <param name="Keskitys">Kuinka paljon halutaan saada arvottavan paikan maksimaalinen arvo pois reunoilta</param> + /// <returns></returns> + private Vector ArvoPaikka(Vector alkupaikka, int Keskitys) { - Vector omenaPaikka; + Vector Paikka; double x; double y; - - y = RandomGen.NextInt(-10, 5); - y = _omenaAlkuPaikka.Y + y * Leveys; - - x = RandomGen.NextInt(-8, 8); - x = _omenaAlkuPaikka.X + x * Leveys; - - if (x - _mato.X < Leveys && y - _mato.Y < Leveys) - { - y = RandomGen.NextInt(-10, 5); - y = _omenaAlkuPaikka.Y + y * Leveys; + Vector omenaxy0 = new Vector(alkupaikka.X + Leveys, alkupaikka.X); + + y = RandomGen.NextInt(1 + Keskitys, KenttaKoko-1-Keskitys); + y = omenaxy0.Y + y * Leveys; - x = RandomGen.NextInt(-8, 8); - x = _omenaAlkuPaikka.X + x * Leveys; - } + x = RandomGen.NextInt(1+Keskitys, KenttaKoko-1-Keskitys); + x = omenaxy0.X + x * Leveys; - omenaPaikka = new Vector(x, y); - return omenaPaikka; + Paikka = new Vector(x, y); + return Paikka; } /// <summary> /// Luo kentän reunat /// </summary> - private PhysicsObject LuoSeina() + /// <param name="maara">luotavan kentän yhtä reunaa varten luotavien palikoiden määrä</param> + /// <param name="koko">kuinka isoja palikoita tehdään</param> + private Vector Luoseinat(int maara, int koko) { - PhysicsObject seina = new PhysicsObject(Leveys, Korkeus); + double x = KentanSijainti; + double y = KentanSijainti; + for (int i = 0; i < maara; i++) + { + LuoSeina(koko,new Vector(x,y)); + x += koko; + } + for (int i = 0; i < maara+1; i++) + { + LuoSeina(koko,new Vector(x,y)); + y += koko; + } + for (int i = 0; i < maara+1; i++) + { + LuoSeina(koko,new Vector(x,y)); + x -= koko; + } + for (int i = 0; i < maara+2; i++) + { + LuoSeina(koko,new Vector(x,y)); + y -= koko; + } + + return new Vector(x, y); + } + + + /// <summary> + /// Luo kentän palikat, joista kentän reunat muodostuvat + /// </summary> + private void LuoSeina(int leveys, Vector paikka) + { + PhysicsObject seina = new PhysicsObject(leveys,leveys); seina.MakeStatic(); seina.Color = Color.Green; - seina.Image = Seinakuva; seina.Tag = "seina"; - return seina; + seina.Position = paikka; + seina.Image = Seinakuva; + Add(seina); } /// <summary> /// Tehdään aliohjelma, joka luo uusia osia madon perään. /// </summary> - public PhysicsObject LuoMatoKeho() + private void LuoMatoKeho() { - _matoMuu = new Objektit(Leveys-6, Korkeus-6); - _matoMuu.Tag = "matokeho"; - _matoMuu.Image = _matokehokuva; + matomuu = new Objektit(Leveys-6, Leveys-6); + matomuu.Tag = "matokeho"; + matomuu.Image = matokehokuva; Vector paikka = MatoSijainti[MatoSijainti.Count -1 - MatoKeho.Count]; - _matoMuu.Position = paikka; - Add(_matoMuu); - MatoKeho.Add(_matoMuu); - AddCollisionHandler(_matoMuu, "omena", delegate(IPhysicsObject _, IPhysicsObject _) {LuoUusiOmena(); }); - return _matoMuu; + matomuu.Position = paikka; + Add(matomuu); + MatoKeho.Add(matomuu); + AddCollisionHandler(matomuu, "omena", delegate(IPhysicsObject mato, IPhysicsObject omena) {LuoUusiOmena(); }); } @@ -248,8 +260,8 @@ public class Matopeli : PhysicsGame /// </summary> private void LuoUusiOmena() { - _omena.Destroy(); - _omenaKentalla = false; + omena.Destroy(); + omenaKentalla = false; } @@ -258,9 +270,9 @@ public class Matopeli : PhysicsGame /// </summary> private void MatoSyoOmenan() { - _omena.Destroy(); + omena.Destroy(); Pistelaskuri.Value += 1; - _omenaKentalla = false; + omenaKentalla = false; } @@ -270,19 +282,19 @@ public class Matopeli : PhysicsGame private void VaihdaSuuntaYlos() { - if (_suuntaAlas) + if (suuntaAlas) { - _suuntaOikea = false; - _suuntaVasen = false; - _suuntaYlos = false; - _suuntaAlas = true; + suuntaOikea = false; + suuntaVasen = false; + suuntaYlos = false; + suuntaAlas = true; } else { - _suuntaOikea = false; - _suuntaVasen = false; - _suuntaYlos = true; - _suuntaAlas = false; + suuntaOikea = false; + suuntaVasen = false; + suuntaYlos = true; + suuntaAlas = false; } } @@ -292,19 +304,19 @@ public class Matopeli : PhysicsGame /// </summary> private void VaihdaSuuntaAlas() { - if (_suuntaYlos) + if (suuntaYlos) { - _suuntaOikea = false; - _suuntaVasen = false; - _suuntaYlos = true; - _suuntaAlas = false; + suuntaOikea = false; + suuntaVasen = false; + suuntaYlos = true; + suuntaAlas = false; } else { - _suuntaOikea = false; - _suuntaVasen = false; - _suuntaYlos = false; - _suuntaAlas = true; + suuntaOikea = false; + suuntaVasen = false; + suuntaYlos = false; + suuntaAlas = true; } } @@ -314,20 +326,20 @@ public class Matopeli : PhysicsGame /// </summary> private void VaihdaSuuntaOikea() { - if (_suuntaVasen) + if (suuntaVasen) { - _suuntaOikea = false; - _suuntaVasen = true; - _suuntaYlos = false; - _suuntaAlas = false; + suuntaOikea = false; + suuntaVasen = true; + suuntaYlos = false; + suuntaAlas = false; } else { - _suuntaOikea = true; - _suuntaVasen = false; - _suuntaYlos = false; - _suuntaAlas = false; + suuntaOikea = true; + suuntaVasen = false; + suuntaYlos = false; + suuntaAlas = false; } } @@ -338,19 +350,19 @@ public class Matopeli : PhysicsGame /// </summary> private void VaihdaSuuntaVasen() { - if (_suuntaOikea) + if (suuntaOikea) { - _suuntaOikea = true; - _suuntaVasen = false; - _suuntaYlos = false; - _suuntaAlas = false; + suuntaOikea = true; + suuntaVasen = false; + suuntaYlos = false; + suuntaAlas = false; } else { - _suuntaOikea = false; - _suuntaVasen = true; - _suuntaYlos = false; - _suuntaAlas = false; + suuntaOikea = false; + suuntaVasen = true; + suuntaYlos = false; + suuntaAlas = false; } } @@ -372,21 +384,21 @@ public class Matopeli : PhysicsGame /// </summary> private void PaivitaKentta() { - if (_matoLiikkunut == false) + if (matoLiikkunut == false) { return; } - if (_omenaKentalla == false) + if (omenaKentalla == false) { LuoMatoKeho(); LuoOmena(); } - MatoSijainti.Add(new Vector(_mato.X,_mato.Y)); + MatoSijainti.Add(new Vector(mato.X,mato.Y)); LiikutaMatoa(); LiikutaKehoa(); - MatoSijainti.Add(new Vector(_mato.X,_mato.Y)); + MatoSijainti.Add(new Vector(mato.X,mato.Y)); } @@ -395,30 +407,30 @@ public class Matopeli : PhysicsGame /// </summary> private void LiikutaMatoa() { - _matoLiikkunut = false; - if (_suuntaYlos) + matoLiikkunut = false; + if (suuntaYlos) { - _mato.Y = _mato.Y + Leveys; - _mato.Angle = Angle.FromDegrees(90); + mato.Y = mato.Y + Leveys; + mato.Angle = Angle.FromDegrees(90); } - if (_suuntaAlas) + if (suuntaAlas) { - _mato.Y= _mato.Y - Leveys; - _mato.Angle = Angle.FromDegrees(270); + mato.Y= mato.Y - Leveys; + mato.Angle = Angle.FromDegrees(270); } - if (_suuntaOikea) + if (suuntaOikea) { - _mato.X= _mato.X + Leveys; - _mato.Angle = Angle.FromDegrees(0); + mato.X= mato.X + Leveys; + mato.Angle = Angle.FromDegrees(0); } - if (_suuntaVasen) + if (suuntaVasen) { - _mato.X= _mato.X - Leveys; - _mato.Angle = Angle.FromDegrees(180); + mato.X= mato.X - Leveys; + mato.Angle = Angle.FromDegrees(180); } - _matoLiikkunut = true; + matoLiikkunut = true; } @@ -431,7 +443,7 @@ public class Matopeli : PhysicsGame { return; } - _matoLiikkunut = false; + matoLiikkunut = false; MatoKeho[0].X = MatoSijainti[MatoSijainti.Count - 1].X; MatoKeho[0].Y = MatoSijainti[MatoSijainti.Count - 1].Y; @@ -441,10 +453,13 @@ public class Matopeli : PhysicsGame MatoKeho[i].Y = MatoSijainti[MatoSijainti.Count - 2*i].Y; } - _matoLiikkunut = true; + matoLiikkunut = true; } - - + + + /// <summary> + /// Pelin fysiikkaobjektit luodaan tämän classin mukaisesti + /// </summary> public class Objektit : PhysicsObject { public Objektit(double leveys, double korkeus) -- GitLab