using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SimulaceLesa { using Kalendar = SortedSet; using Les = List>; abstract class Zviera { static int nextId = 0; int id; public Zviera() { id = ++nextId; } protected int najdiVLeseAOdstran(Les l) { for (int i = 0; i < l.Count; i++) { if (l[i].Contains(this)) { l[i].Remove(this); return i; } } throw new Exception("Zviera nie je v lese."); } public bool mensinez(Zviera z) { return (z.id < id); } public abstract float Hmotnost(); public abstract float rychlost(); public virtual bool jePredator() { return false; } public virtual void WakeUp(int c, Kalendar k) { } public virtual void Feed(int c, Kalendar k) { } public virtual void Depart(int c, Kalendar k, Les l) { } public virtual void Arrive(int c, Kalendar k, Les l, int kam) { } } class Lev : Zviera { public override float Hmotnost() { return 190.0f; } public override float rychlost() { return 80f; } public override bool jePredator() { return true; } public override void WakeUp(int c, Kalendar k) { k.Add(new FeedEvent(c + Event.r.Next(1200, 1800), this)); } public override void Feed(int c, Kalendar k) { int x; x = Event.r.Next(0, 100); if (x == 0) return; if (x <= 33) { k.Add(new FeedEvent(c + Event.r.Next(1200, 1800), this)); } else { k.Add(new DepartEvent(c + 10, this)); } } public override void Depart(int c, Kalendar k, Les l) { int index = najdiVLeseAOdstran(l); int rand = Event.r.Next(0, 2); if ((rand == 0 && index > 0) || index == 9) { k.Add(new ArriveEvent(c + 3600, this, index - 1)); } else { k.Add(new ArriveEvent(c + 3600, this, index + 1)); } } public override void Arrive(int c, Kalendar k, Les l, int kam) { k.Add(new FeedEvent(c + 600, this)); l[kam].Add(this); } } class Danek : Zviera { public override float Hmotnost() { return 50.0f; } public override float rychlost() { return 40f; } public override void WakeUp(int c, Kalendar k) { k.Add(new FeedEvent(c + Event.r.Next(300, 600), this)); } public override void Depart(int c, Kalendar k, Les l) { int index = najdiVLeseAOdstran(l); if (index < 9) { k.Add(new ArriveEvent(c + 7200, this, index + 1)); } } public override void Feed(int c, Kalendar k) { int x; x = Event.r.Next(0, 5); if (x <= 1) { k.Add(new FeedEvent(c + Event.r.Next(1200, 1800), this)); } else { k.Add(new DepartEvent(c + 10, this)); } } public override void Arrive(int c, Kalendar k, Les l, int kam) { k.Add(new FeedEvent(c + 600, this)); l[kam].Add(this); } } abstract class Event : IComparable { protected int c; protected Zviera z; public static Random r = new Random(); public Event(int cas, Zviera zviera) { c = cas; z = zviera; } public int Cas { get { return c; } } public abstract void Run(Kalendar kalendar, Les les); public int CompareTo(object obj) { if (obj == null) return 1; Event other = obj as Event; if (c < other.c) return -1; if (c > other.c) return 1; if (z.mensinez(other.z)) return -1; if (other.z.mensinez(z)) return 1; return 0; } } class WakeUpEvent : Event { public WakeUpEvent(int cas, Zviera zviera) : base(cas, zviera) { } public override void Run(Kalendar kalendar, Les les) { Console.WriteLine("V case {0} zvire {1} melo probuzeni", this.c, this.z); z.WakeUp(c, kalendar); } } class FeedEvent : Event { public FeedEvent(int cas, Zviera zviera) : base(cas, zviera) { } public override void Run(Kalendar kalendar, Les les) { Console.WriteLine("V case {0} zvire {1} zralo", this.c, this.z); z.Feed(c, kalendar); } } class DepartEvent : Event { public DepartEvent(int cas, Zviera zviera) : base(cas, zviera) { } public override void Run(Kalendar kalendar, Les les) { Console.WriteLine("V case {0} zvire {1} odeslo", this.c, this.z); z.Depart(c, kalendar, les); } } class ArriveEvent : Event { private int k; public ArriveEvent(int cas, Zviera zviera, int kam) : base(cas, zviera) { k = kam; } public override void Run(Kalendar kalendar, Les les) { Console.WriteLine("V case {0} zvire {1} prislo", this.c, this.z); z.Arrive(c, kalendar, les, k); } } class Program { static bool vsichniDanciDoma(Les l) { for (int i = 0; i < l.Count - 1; i++) { foreach (Zviera z in l[i]) { if (z is Danek) { return false; } } } return true; } public static void Simuluj(int pd,int pl, out int cas,out int casDanku) { Les les = new Les(); for (int i = 0; i < 10; i++) { les.Add(new List()); } for (int i = 0; i < pd; i++) { les[0].Add(new Danek()); } for (int i = 0; i < pl; i++) { les[9].Add(new Lev()); } Kalendar kalendar = new Kalendar(); foreach (List krovi in les) { foreach (Zviera z in krovi) { kalendar.Add(new WakeUpEvent(0, z)); } } cas = 0; casDanku = -1; while (kalendar.Count != 0) { Event e = kalendar.Min; kalendar.Remove(e); cas = e.Cas; e.Run(kalendar, les); if (casDanku < 0 && vsichniDanciDoma(les)) { casDanku = e.Cas; } } } } } namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int pd = (int)PocetDanku.Value; int pl = (int)PocetLvu.Value; int casDanku, casLvu; MessageBox.Show(pd.ToString()); SimulaceLesa.Program.Simuluj(pd, pl, out casLvu, out casDanku); textBox1.Text = string.Format("Cas danku je {0}, cas lvu je {1}", casDanku, casLvu); } private void label1_Click(object sender, EventArgs e) { } private void textBox1_TextChanged(object sender, EventArgs e) { } } }