Advertisement
csaki

Szavanna szimulátor (v0.2, működő)

Apr 30th, 2013
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.02 KB | None | 0 0
  1. using System;
  2. using System.Timers;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6.  
  7. // http://aries.ektf.hu/~hz/wiki7/mprog2gy/gyak-11
  8.  
  9. namespace szavannaSzimulator
  10. {
  11.     class Cella
  12.     {
  13.         public int X;
  14.         public int Y;
  15.  
  16.         public Cella(int X, int Y)
  17.         {
  18.             this.X = X;
  19.             this.Y = Y;
  20.         }
  21.  
  22.     }
  23.  
  24.     abstract class Allat
  25.     {
  26.         // Mezők
  27.         static protected Random rand = new Random();
  28.         public readonly Szavanna Terulet;
  29.         protected int _Eletkor;
  30.         public readonly int maxEletkor;
  31.         public uint Ehes;
  32.         protected bool _eletbenVan;
  33.  
  34.         // Property
  35.         public bool eletbenVan
  36.         {
  37.             get
  38.             {
  39.                 return _eletbenVan;
  40.             }
  41.         }
  42.         public int Eletkor
  43.         {
  44.             get { return _Eletkor; }
  45.             set
  46.             {
  47.                 if (0 < value && value < 1000)
  48.                 {
  49.                     _Eletkor = value;
  50.                 }
  51.             }
  52.         }
  53.  
  54.         // Függvények
  55.  
  56.         public virtual void Oregszik()
  57.         {
  58.             Eletkor++;
  59.             if (Eletkor > maxEletkor) Meghal();
  60.             if (this is Ragadozo && Ehes > 2) Meghal();
  61.         }
  62.  
  63.         // Absztrakt függvények
  64.         public abstract void Eszik();
  65.         public abstract bool vaneKedveSzaporodni();
  66.         public abstract bool vaneAlkalmasPar();
  67.         public abstract Allat allatLetrehoz();
  68.         // Absztrakt függvények
  69.  
  70.         public bool sikerultSzaporodni;
  71.         public List<Cella> cellaListaSzaporodashoz;
  72.         protected int utolsoSzaporodas = 0;
  73.         public virtual void Szaporodik()
  74.         {
  75.             sikerultSzaporodni = false;
  76.             if (!vaneKedveSzaporodni()) return;
  77.             if (Terulet.kornyezoAllatokListaja(this).Count == 0) return;
  78.             if (!vaneAlkalmasPar()) return;
  79.             var lista = Terulet.uresCellakListaja(this);
  80.             if (lista.Count == 0) return;
  81.  
  82.             cellaListaSzaporodashoz = lista;
  83.             sikerultSzaporodni = true;
  84.         }
  85.  
  86.         public void Mozog()
  87.         {
  88.             List<Cella> cellaLista = Terulet.uresCellakListaja(this);
  89.             if (cellaLista.Count == 0) return;
  90.  
  91.             Terulet.Atmozgat(this, cellaLista[rand.Next(cellaLista.Count)]);
  92.         }
  93.  
  94.         public void Meghal()
  95.         {
  96.             _eletbenVan = false;
  97.             Terulet.Elpusztul(this);
  98.         }
  99.  
  100.         // Konstruktor
  101.         public Allat(int maxEletkor, Szavanna terulet)
  102.         {
  103.             Terulet = terulet;
  104.             this.maxEletkor = maxEletkor;
  105.             Ehes = 0;
  106.             _eletbenVan = true;
  107.             Eletkor = 1;
  108.         }
  109.     }
  110.  
  111.     // ####################################### //
  112.  
  113.     class Ragadozo : Allat
  114.     {
  115.         public Ragadozo(int maxEletkor, Szavanna terulet) : base(maxEletkor, terulet) { }
  116.  
  117.         public override Allat allatLetrehoz()
  118.         {
  119.             return new Ragadozo(rand.Next(20, 30), Terulet);
  120.         }
  121.  
  122.         public override void Eszik()
  123.         {
  124.             var lista = Terulet.kornyezoAllatokListaja(this);
  125.             if (lista.Count == 0)
  126.             {
  127.                 Ehes++;
  128.                 return;
  129.             }
  130.  
  131.             for (int i = 0; i < lista.Count; i++)
  132.             {
  133.                 if (lista[i] is Novenyevo)
  134.                 {
  135.                     Terulet.Elpusztul(lista[i]);
  136.                     Ehes = 0;
  137.                     return;
  138.                 }
  139.             }
  140.             Ehes++;
  141.         }
  142.  
  143.         public override bool vaneKedveSzaporodni()
  144.         {
  145.             if (Ehes > 0) return false;
  146.             else return true;
  147.         }
  148.  
  149.         public override bool vaneAlkalmasPar()
  150.         {
  151.             var lista = Terulet.kornyezoAllatokListaja(this);
  152.             foreach (var x in lista)
  153.             {
  154.                 if (x is Ragadozo) return true;
  155.             }
  156.             return false;
  157.         }
  158.  
  159.         public override void Szaporodik()
  160.         {
  161.             sikerultSzaporodni = false;
  162.             if (Terulet.elteltEvekSzama % 5 == 0)
  163.                 base.Szaporodik();
  164.  
  165.             if (sikerultSzaporodni)
  166.             {
  167.                 if (cellaListaSzaporodashoz.Count != 0)
  168.                 {
  169.                     Terulet.Elhelyez(allatLetrehoz(), cellaListaSzaporodashoz[rand.Next(cellaListaSzaporodashoz.Count)]);
  170.                 }
  171.             }
  172.         }
  173.     }
  174.  
  175.     // ####################################### //
  176.  
  177.     class Novenyevo : Allat
  178.     {
  179.         public Novenyevo(int maxEletkor, Szavanna terulet) : base(maxEletkor, terulet) { }
  180.  
  181.         public override Allat allatLetrehoz()
  182.         {
  183.             return new Novenyevo(rand.Next(11, 14), Terulet);
  184.         }
  185.  
  186.         public override void Eszik()
  187.         {
  188.             if (Ehes > 0) Ehes--;
  189.             else Ehes = 0;
  190.         }
  191.  
  192.         public override bool vaneKedveSzaporodni()
  193.         {
  194.             if (Ehes > 0) return false;
  195.             else return true;
  196.         }
  197.  
  198.         public override bool vaneAlkalmasPar()
  199.         {
  200.             var lista = Terulet.kornyezoAllatokListaja(this);
  201.             foreach (var x in lista)
  202.             {
  203.                 if (x is Novenyevo) return true;
  204.             }
  205.             return false;
  206.         }
  207.  
  208.         public override void Szaporodik()
  209.         {
  210.             sikerultSzaporodni = false;
  211.             if (Terulet.elteltEvekSzama % 2 == 0)
  212.                 base.Szaporodik();
  213.  
  214.             if (sikerultSzaporodni)
  215.             {
  216.                 if (cellaListaSzaporodashoz.Count != 0)
  217.                 {
  218.                     Terulet.Elhelyez(allatLetrehoz(), cellaListaSzaporodashoz[rand.Next(cellaListaSzaporodashoz.Count)]);
  219.                 }
  220.             }
  221.         }
  222.     }
  223.  
  224.  
  225.     class Szavanna
  226.     {
  227.         public int elteltEvekSzama = 0;
  228.         static Random rand = new Random();
  229.         Allat[,] szavannaMatrix;
  230.         int Xtengely;
  231.         int Ytengely;
  232.  
  233.  
  234.         public Szavanna(int szelesseg, int magassag)
  235.         {
  236.             szavannaMatrix = new Allat[szelesseg, magassag];
  237.             Xtengely = szelesseg;
  238.             Ytengely = magassag;
  239.         }
  240.  
  241.         public void Elpusztul(Allat allat)
  242.         {
  243.             Cella c = Megkeres(allat);
  244.             if (c == null) return;
  245.             szavannaMatrix[c.X, c.Y] = null;
  246.         }
  247.  
  248.  
  249.         public Cella Megkeres(Allat allat)
  250.         {
  251.             for (int i = 0; i < Xtengely; i++)
  252.             {
  253.                 for (int j = 0; j < Ytengely; j++)
  254.                 {
  255.                     if (allat == szavannaMatrix[i, j]) return new Cella(i, j);
  256.                 }
  257.             }
  258.             return null;
  259.         }
  260.  
  261.         public void elteltEgyEv()
  262.         {
  263.             Keveres();
  264.             Allat a;
  265.             for (int i = 0; i < Xtengely; i++)
  266.             {
  267.                 for (int j = 0; j < Ytengely; j++)
  268.                 {
  269.                     a = szavannaMatrix[i, j];
  270.  
  271.                     if (a != null && !a.eletbenVan) a = null;
  272.                     if (a == null) continue;
  273.                     a.Eszik();
  274.                     a.Szaporodik();
  275.                     a.Mozog();
  276.                     a.Oregszik();
  277.                 }
  278.             }
  279.             elteltEvekSzama++;
  280.             Kirajzolas();
  281.         }
  282.  
  283.         public void Keveres()
  284.         {
  285.             // ...
  286.         }
  287.  
  288.         public void Elhelyez(Allat allat, Cella ujPozicio)
  289.         {
  290.             if (szavannaMatrix[ujPozicio.X, ujPozicio.Y] != null) return;
  291.             szavannaMatrix[ujPozicio.X, ujPozicio.Y] = allat; // beállítjuk a cellán az állatot
  292.         }
  293.  
  294.         public void Atmozgat(Allat allat, Cella ujPozicio)
  295.         {
  296.             Cella c = Megkeres(allat);
  297.             if (c == null) return;
  298.             if (szavannaMatrix[ujPozicio.X, ujPozicio.Y] != null) return;
  299.  
  300.             szavannaMatrix[c.X, c.Y] = null;
  301.             szavannaMatrix[ujPozicio.X, ujPozicio.Y] = allat;
  302.  
  303.         }
  304.  
  305.         public void Feltolt()
  306.         {
  307.             for (int i = 0; i < Xtengely; i++)
  308.             {
  309.                 for (int j = 0; j < Ytengely; j++)
  310.                 {
  311.                     if (rand.Next(100) > 70) // 30% eséllyel adunk hozzá állatot
  312.                     {
  313.                         if (rand.Next(100) >= 70) // 20% eséllyel adunk hozzá ragadozót
  314.                         {
  315.                             szavannaMatrix[i, j] = new Ragadozo(rand.Next(20, 30), this);
  316.                         }
  317.                         else // 65% eséllyel pedig növényevőt
  318.                         {
  319.                             szavannaMatrix[i, j] = new Novenyevo(rand.Next(11, 15), this);
  320.                         }
  321.                     }
  322.                 }
  323.             }
  324.         }
  325.  
  326.         public void Kirajzolas()
  327.         {
  328.             int ragadozokSzama = 0;
  329.             int novenyevokSzama = 0;
  330.  
  331.             for (int i = 0; i < Xtengely; i++) // végigmegyünk a mátrixon, és a típusnak megfelelően kirajzoljuk az állatot
  332.             {
  333.                 for (int j = 0; j < Ytengely; j++)
  334.                 {
  335.                     if (szavannaMatrix[i, j] is Ragadozo)
  336.                     {
  337.                         Console.ForegroundColor = ConsoleColor.Red;
  338.                         Console.Write("R");
  339.                         ragadozokSzama++;
  340.                     }
  341.                     else if (szavannaMatrix[i, j] is Novenyevo)
  342.                     {
  343.                         Console.ForegroundColor = ConsoleColor.Green;
  344.                         Console.Write("N");
  345.                         novenyevokSzama++;
  346.                     }
  347.                     else
  348.                     {
  349.                         Console.ForegroundColor = ConsoleColor.DarkGray;
  350.                         Console.Write("+");
  351.                     }
  352.                 }
  353.                 Console.WriteLine();
  354.             }
  355.             Console.ForegroundColor = ConsoleColor.White;
  356.             Console.WriteLine("\n Ragadozók: {0}\t\tNövényevők: {1} \t\t Eltelt évek: {2}", ragadozokSzama, novenyevokSzama, elteltEvekSzama);
  357.         }
  358.  
  359.         public List<Cella> uresCellakListaja(Allat allat)
  360.         {
  361.             Cella c = Megkeres(allat);
  362.             List<Cella> temp = new List<Cella>();
  363.             for (int i = -1; i < 2; i++) // feltöltünk egy listát az állatot körülvevő üres helyekkel
  364.             {
  365.                 for (int j = -1; j < 2; j++)
  366.                 {
  367.                     if (c.X + i < Xtengely &&
  368.                         c.X + i >= 0 &&
  369.                         c.Y + j < Ytengely &&
  370.                         c.Y + j >= 0)
  371.                     {
  372.                         if (szavannaMatrix[c.X + i, c.Y + j] == null) // csak azt adjuk hozzá, ahol nem áll állat
  373.                         {
  374.                             if (i != 0 || j != 0)
  375.                                 temp.Add(new Cella(c.X + i, c.Y + j));
  376.                         }
  377.                     }
  378.                 }
  379.             }
  380.             return temp;
  381.  
  382.             #region Sakkos megoldás
  383.             //foreach (var x in allatLista)
  384.             //{
  385.             //    if (x.Pozicio.X == allat.Pozicio.X && x.Pozicio.Y + 1 == allat.Pozicio.Y) // fel
  386.             //    {
  387.  
  388.             //    }
  389.             //    else if (x.Pozicio.X == allat.Pozicio.X && x.Pozicio.Y - 1 == allat.Pozicio.Y) // le
  390.             //    {
  391.  
  392.             //    }
  393.             //    else if (x.Pozicio.X + 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y) // jobbra
  394.             //    {
  395.  
  396.             //    }
  397.             //    else if (x.Pozicio.X - 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y) // balra
  398.             //    {
  399.  
  400.             //    }
  401.             //    else if (x.Pozicio.X + 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y + 1) // jobbra fel
  402.             //    {
  403.  
  404.             //    }
  405.             //    else if (x.Pozicio.X - 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y + 1) // balra fel
  406.             //    {
  407.  
  408.             //    }
  409.             //    else if (x.Pozicio.X + 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y - 1) // jobbra le
  410.             //    {
  411.  
  412.             //    }
  413.             //    else if (x.Pozicio.X - 1 == allat.Pozicio.X && x.Pozicio.Y == allat.Pozicio.Y - 1) // balra le
  414.             //    {
  415.  
  416.             //    }
  417.             #endregion             // nem funkcionál jól
  418.         }
  419.  
  420.         public List<Allat> kornyezoAllatokListaja(Allat allat)
  421.         {
  422.             Cella c = Megkeres(allat);
  423.             List<Allat> temp = new List<Allat>();
  424.             for (int i = -1; i < 2; i++)
  425.             {
  426.                 for (int j = -1; j < 2; j++)
  427.                 {
  428.                     if (c.X + i < Xtengely &&
  429.                         c.X + i >= 0 &&
  430.                         c.Y + j < Ytengely &&
  431.                         c.Y + j >= 0)
  432.                     {
  433.                         if (szavannaMatrix[c.X + i, c.Y + j] != null)
  434.                         {
  435.                             if (i != 0 || j != 0)
  436.                             {
  437.                                 temp.Add(szavannaMatrix[c.X + i, c.Y + j]);
  438.                             }
  439.                         }
  440.                     }
  441.                 }
  442.             }
  443.             return temp;
  444.         }
  445.     }
  446.  
  447.  
  448.     class Program
  449.     {
  450.         static Szavanna szavanna = new Szavanna(22, 70);
  451.         static void Main(string[] args)
  452.         {            
  453.             szavanna.Feltolt();
  454.  
  455.             Console.ForegroundColor = ConsoleColor.White;
  456.             Console.WriteLine("Üdv a SZAVANNA SZIMULÁTORBAN!");
  457.  
  458.             Timer timer = new Timer();
  459.             timer.Enabled = true;
  460.             timer.Interval = 1000;
  461.             timer.Elapsed += timer_Elapsed;
  462.             timer.Start();
  463.  
  464.             Console.ReadLine();
  465.         }
  466.  
  467.         static void timer_Elapsed(object sender, ElapsedEventArgs e)
  468.         {
  469.             Console.SetCursorPosition(0, 0);
  470.            
  471.             szavanna.elteltEgyEv();            
  472.         }
  473.     }
  474. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement