Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Timers;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- // http://aries.ektf.hu/~hz/wiki7/mprog2gy/gyak-11
- namespace szavannaSzimulator
- {
- class Cella
- {
- public int X;
- public int Y;
- public Cella(int X, int Y)
- {
- this.X = X;
- this.Y = Y;
- }
- }
- abstract class Allat
- {
- // Mezők
- static protected Random rand = new Random();
- public readonly Szavanna Terulet;
- protected int _Eletkor;
- public readonly int maxEletkor;
- public uint Ehes;
- protected bool _eletbenVan;
- // Property
- public bool eletbenVan
- {
- get
- {
- return _eletbenVan;
- }
- }
- public int Eletkor
- {
- get { return _Eletkor; }
- set
- {
- if (0 < value && value < 1000)
- {
- _Eletkor = value;
- }
- }
- }
- // Függvények
- public virtual void Oregszik()
- {
- Eletkor++;
- if (Eletkor > maxEletkor) Meghal();
- if (this is Ragadozo && Ehes > 2) Meghal();
- }
- // Absztrakt függvények
- public abstract void Eszik();
- public abstract bool vaneKedveSzaporodni();
- public abstract bool vaneAlkalmasPar();
- public abstract Allat allatLetrehoz();
- // Absztrakt függvények
- public bool sikerultSzaporodni;
- public List<Cella> cellaListaSzaporodashoz;
- protected int utolsoSzaporodas = 0;
- public virtual void Szaporodik()
- {
- sikerultSzaporodni = false;
- if (!vaneKedveSzaporodni()) return;
- if (Terulet.kornyezoAllatokListaja(this).Count == 0) return;
- if (!vaneAlkalmasPar()) return;
- var lista = Terulet.uresCellakListaja(this);
- if (lista.Count == 0) return;
- cellaListaSzaporodashoz = lista;
- sikerultSzaporodni = true;
- }
- public void Mozog()
- {
- List<Cella> cellaLista = Terulet.uresCellakListaja(this);
- if (cellaLista.Count == 0) return;
- Terulet.Atmozgat(this, cellaLista[rand.Next(cellaLista.Count)]);
- }
- public void Meghal()
- {
- _eletbenVan = false;
- Terulet.Elpusztul(this);
- }
- // Konstruktor
- public Allat(int maxEletkor, Szavanna terulet)
- {
- Terulet = terulet;
- this.maxEletkor = maxEletkor;
- Ehes = 0;
- _eletbenVan = true;
- Eletkor = 1;
- }
- }
- // ####################################### //
- class Ragadozo : Allat
- {
- public Ragadozo(int maxEletkor, Szavanna terulet) : base(maxEletkor, terulet) { }
- public override Allat allatLetrehoz()
- {
- return new Ragadozo(rand.Next(20, 30), Terulet);
- }
- public override void Eszik()
- {
- var lista = Terulet.kornyezoAllatokListaja(this);
- if (lista.Count == 0)
- {
- Ehes++;
- return;
- }
- for (int i = 0; i < lista.Count; i++)
- {
- if (lista[i] is Novenyevo)
- {
- Terulet.Elpusztul(lista[i]);
- Ehes = 0;
- return;
- }
- }
- Ehes++;
- }
- public override bool vaneKedveSzaporodni()
- {
- if (Ehes > 0) return false;
- else return true;
- }
- public override bool vaneAlkalmasPar()
- {
- var lista = Terulet.kornyezoAllatokListaja(this);
- foreach (var x in lista)
- {
- if (x is Ragadozo) return true;
- }
- return false;
- }
- public override void Szaporodik()
- {
- sikerultSzaporodni = false;
- if (Terulet.elteltEvekSzama % 5 == 0)
- base.Szaporodik();
- if (sikerultSzaporodni)
- {
- if (cellaListaSzaporodashoz.Count != 0)
- {
- Terulet.Elhelyez(allatLetrehoz(), cellaListaSzaporodashoz[rand.Next(cellaListaSzaporodashoz.Count)]);
- }
- }
- }
- }
- // ####################################### //
- class Novenyevo : Allat
- {
- public Novenyevo(int maxEletkor, Szavanna terulet) : base(maxEletkor, terulet) { }
- public override Allat allatLetrehoz()
- {
- return new Novenyevo(rand.Next(11, 14), Terulet);
- }
- public override void Eszik()
- {
- if (Ehes > 0) Ehes--;
- else Ehes = 0;
- }
- public override bool vaneKedveSzaporodni()
- {
- if (Ehes > 0) return false;
- else return true;
- }
- public override bool vaneAlkalmasPar()
- {
- var lista = Terulet.kornyezoAllatokListaja(this);
- foreach (var x in lista)
- {
- if (x is Novenyevo) return true;
- }
- return false;
- }
- public override void Szaporodik()
- {
- sikerultSzaporodni = false;
- if (Terulet.elteltEvekSzama % 2 == 0)
- base.Szaporodik();
- if (sikerultSzaporodni)
- {
- if (cellaListaSzaporodashoz.Count != 0)
- {
- Terulet.Elhelyez(allatLetrehoz(), cellaListaSzaporodashoz[rand.Next(cellaListaSzaporodashoz.Count)]);
- }
- }
- }
- }
- class Szavanna
- {
- public int elteltEvekSzama = 0;
- static Random rand = new Random();
- Allat[,] szavannaMatrix;
- int Xtengely;
- int Ytengely;
- public Szavanna(int szelesseg, int magassag)
- {
- szavannaMatrix = new Allat[szelesseg, magassag];
- Xtengely = szelesseg;
- Ytengely = magassag;
- }
- public void Elpusztul(Allat allat)
- {
- Cella c = Megkeres(allat);
- if (c == null) return;
- szavannaMatrix[c.X, c.Y] = null;
- }
- public Cella Megkeres(Allat allat)
- {
- for (int i = 0; i < Xtengely; i++)
- {
- for (int j = 0; j < Ytengely; j++)
- {
- if (allat == szavannaMatrix[i, j]) return new Cella(i, j);
- }
- }
- return null;
- }
- public void elteltEgyEv()
- {
- Keveres();
- Allat a;
- for (int i = 0; i < Xtengely; i++)
- {
- for (int j = 0; j < Ytengely; j++)
- {
- a = szavannaMatrix[i, j];
- if (a != null && !a.eletbenVan) a = null;
- if (a == null) continue;
- a.Eszik();
- a.Szaporodik();
- a.Mozog();
- a.Oregszik();
- }
- }
- elteltEvekSzama++;
- Kirajzolas();
- }
- public void Keveres()
- {
- // ...
- }
- public void Elhelyez(Allat allat, Cella ujPozicio)
- {
- if (szavannaMatrix[ujPozicio.X, ujPozicio.Y] != null) return;
- szavannaMatrix[ujPozicio.X, ujPozicio.Y] = allat; // beállítjuk a cellán az állatot
- }
- public void Atmozgat(Allat allat, Cella ujPozicio)
- {
- Cella c = Megkeres(allat);
- if (c == null) return;
- if (szavannaMatrix[ujPozicio.X, ujPozicio.Y] != null) return;
- szavannaMatrix[c.X, c.Y] = null;
- szavannaMatrix[ujPozicio.X, ujPozicio.Y] = allat;
- }
- public void Feltolt()
- {
- for (int i = 0; i < Xtengely; i++)
- {
- for (int j = 0; j < Ytengely; j++)
- {
- if (rand.Next(100) > 70) // 30% eséllyel adunk hozzá állatot
- {
- if (rand.Next(100) >= 70) // 20% eséllyel adunk hozzá ragadozót
- {
- szavannaMatrix[i, j] = new Ragadozo(rand.Next(20, 30), this);
- }
- else // 65% eséllyel pedig növényevőt
- {
- szavannaMatrix[i, j] = new Novenyevo(rand.Next(11, 15), this);
- }
- }
- }
- }
- }
- public void Kirajzolas()
- {
- int ragadozokSzama = 0;
- int novenyevokSzama = 0;
- for (int i = 0; i < Xtengely; i++) // végigmegyünk a mátrixon, és a típusnak megfelelően kirajzoljuk az állatot
- {
- for (int j = 0; j < Ytengely; j++)
- {
- if (szavannaMatrix[i, j] is Ragadozo)
- {
- Console.ForegroundColor = ConsoleColor.Red;
- Console.Write("R");
- ragadozokSzama++;
- }
- else if (szavannaMatrix[i, j] is Novenyevo)
- {
- Console.ForegroundColor = ConsoleColor.Green;
- Console.Write("N");
- novenyevokSzama++;
- }
- else
- {
- Console.ForegroundColor = ConsoleColor.DarkGray;
- Console.Write("+");
- }
- }
- Console.WriteLine();
- }
- Console.ForegroundColor = ConsoleColor.White;
- Console.WriteLine("\n Ragadozók: {0}\t\tNövényevők: {1} \t\t Eltelt évek: {2}", ragadozokSzama, novenyevokSzama, elteltEvekSzama);
- }
- public List<Cella> uresCellakListaja(Allat allat)
- {
- Cella c = Megkeres(allat);
- List<Cella> temp = new List<Cella>();
- for (int i = -1; i < 2; i++) // feltöltünk egy listát az állatot körülvevő üres helyekkel
- {
- for (int j = -1; j < 2; j++)
- {
- if (c.X + i < Xtengely &&
- c.X + i >= 0 &&
- c.Y + j < Ytengely &&
- c.Y + j >= 0)
- {
- if (szavannaMatrix[c.X + i, c.Y + j] == null) // csak azt adjuk hozzá, ahol nem áll állat
- {
- if (i != 0 || j != 0)
- temp.Add(new Cella(c.X + i, c.Y + j));
- }
- }
- }
- }
- return temp;
- #region Sakkos megoldás
- //foreach (var x in allatLista)
- //{
- // if (x.Pozicio.X == allat.Pozicio.X && x.Pozicio.Y + 1 == allat.Pozicio.Y) // fel
- // {
- // }
- // else if (x.Pozicio.X == allat.Pozicio.X && x.Pozicio.Y - 1 == allat.Pozicio.Y) // le
- // {
- // }
- // else if (x.Pozicio.X + 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y) // jobbra
- // {
- // }
- // else if (x.Pozicio.X - 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y) // balra
- // {
- // }
- // else if (x.Pozicio.X + 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y + 1) // jobbra fel
- // {
- // }
- // else if (x.Pozicio.X - 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y + 1) // balra fel
- // {
- // }
- // else if (x.Pozicio.X + 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y - 1) // jobbra le
- // {
- // }
- // else if (x.Pozicio.X - 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y - 1) // balra le
- // {
- // }
- #endregion // nem funkcionál jól
- }
- public List<Allat> kornyezoAllatokListaja(Allat allat)
- {
- Cella c = Megkeres(allat);
- List<Allat> temp = new List<Allat>();
- for (int i = -1; i < 2; i++)
- {
- for (int j = -1; j < 2; j++)
- {
- if (c.X + i < Xtengely &&
- c.X + i >= 0 &&
- c.Y + j < Ytengely &&
- c.Y + j >= 0)
- {
- if (szavannaMatrix[c.X + i, c.Y + j] != null)
- {
- if (i != 0 || j != 0)
- {
- temp.Add(szavannaMatrix[c.X + i, c.Y + j]);
- }
- }
- }
- }
- }
- return temp;
- }
- }
- class Program
- {
- static Szavanna szavanna = new Szavanna(22, 70);
- static void Main(string[] args)
- {
- szavanna.Feltolt();
- Console.ForegroundColor = ConsoleColor.White;
- Console.WriteLine("Üdv a SZAVANNA SZIMULÁTORBAN!");
- Timer timer = new Timer();
- timer.Enabled = true;
- timer.Interval = 1000;
- timer.Elapsed += timer_Elapsed;
- timer.Start();
- Console.ReadLine();
- }
- static void timer_Elapsed(object sender, ElapsedEventArgs e)
- {
- Console.SetCursorPosition(0, 0);
- szavanna.elteltEgyEv();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement