using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Hangyaboly
{
public class Hangyaboly
{
protected virtual Random Random { get; set; }
protected virtual int MunkasFogyasztas { get; set; }
protected virtual int HarcosFogyasztas { get; set; }
protected virtual int KiralynoFogyasztas { get; set; }
public virtual int MunkasokSzama { get; set; }
public virtual int HarcosokSzama { get; set; }
public virtual int KiralynokSzama { get; set; }
public virtual int Taplalek { get; set; }
public virtual bool Kihalt { get { return KiralynokSzama == 0; } }
private const string ConsolePrefix = "# (Boly): ";
private void Print(string uzenet)
{
Console.WriteLine(ConsolePrefix + uzenet);
}
public Hangyaboly(Random _random, int _munkasokSzama = 10, int _harcosokSzama = 10, int _kiralynokSzama = 1, int _munkasFogyasztas = 1, int _harcosFogyasztas = 2, int _kiralynoFogyasztas = 10, int _induloTaplalek=20)
{
Random = _random;
MunkasokSzama = _munkasokSzama;
HarcosokSzama = _harcosokSzama;
KiralynokSzama = _kiralynokSzama;
MunkasFogyasztas = _munkasFogyasztas;
HarcosFogyasztas = _harcosFogyasztas;
KiralynoFogyasztas = _kiralynoFogyasztas;
Taplalek = _induloTaplalek;
Console.WriteLine("Megalapultunk!");
Console.WriteLine("\t\tMunkás\tHarcos\tKirálynő");
Console.WriteLine("Mennyiség\t{0}\t{1}\t{2}", MunkasokSzama, HarcosokSzama, KiralynokSzama);
Console.WriteLine("Fogyasztás!\t{0}\t{1}\t{2}", MunkasFogyasztas, HarcosFogyasztas, KiralynoFogyasztas);
Console.WriteLine("Összesen {0} táplálék van a raktárban", Taplalek);
}
public void Vedekezes(int tamadokSzama)
{
if (Kihalt) return;
Print(String.Format("Egy ellenséges hangyasereg támadott meg, harcosaid száma {0}, támadók száma {1}", HarcosokSzama, tamadokSzama));
int osszVeszteseg;
int harcosVeszteseg;
int munkasVeszteseg;
int kiralynoVeszteseg;
int taplalekVeszteseg;
if (tamadokSzama > HarcosokSzama)
{
osszVeszteseg = tamadokSzama - HarcosokSzama;
taplalekVeszteseg = osszVeszteseg > Taplalek ? Taplalek : osszVeszteseg;
harcosVeszteseg = osszVeszteseg > HarcosokSzama ? HarcosokSzama : osszVeszteseg;
osszVeszteseg -= harcosVeszteseg;
munkasVeszteseg = osszVeszteseg > MunkasokSzama ? MunkasokSzama : osszVeszteseg;
osszVeszteseg -= munkasVeszteseg;
kiralynoVeszteseg = osszVeszteseg > KiralynokSzama ? KiralynokSzama : osszVeszteseg;
osszVeszteseg -= kiralynoVeszteseg;
HarcosokSzama -= harcosVeszteseg;
MunkasokSzama -= munkasVeszteseg;
KiralynokSzama -= kiralynoVeszteseg;
if (Kihalt)
{
Print(String.Format("Az ellenség lerohanta a bolyt. Senki se maradt életben"));
}
else
{
Print(String.Format("Az ellenség áttört a védelmünkön, és {0} táplálékot rabolt el.", taplalekVeszteseg));
Print(String.Format("A csataban {0} harcost, {1} munkást, {2} kiralynőt vesztettünk", harcosVeszteseg, munkasVeszteseg, kiralynoVeszteseg));
}
}
else
{
Print(String.Format("A harcosok visszaverték a sereget"));
}
}
public void Fogyasztas()
{
if (Kihalt) return;
Print(String.Format("Étel/ital osztás történt."));
int EhenhaltKiralynokSzama = Fogyaszt(KiralynokSzama, KiralynoFogyasztas);
int EhenhaltHarcosokSzama = Fogyaszt(HarcosokSzama, HarcosFogyasztas);
int EhenhaltMunkasokSzama = Fogyaszt(MunkasokSzama, MunkasFogyasztas);
KiralynokSzama -= EhenhaltKiralynokSzama;
HarcosokSzama -= EhenhaltHarcosokSzama;
MunkasokSzama -= EhenhaltMunkasokSzama;
if (Kihalt)
{
Print(String.Format("Nem volt elég élelem, minden királynőt elvesztettünk, a boly elesett"));
return;
}
if (EhenhaltKiralynokSzama > 0 ||
EhenhaltHarcosokSzama > 0 ||
EhenhaltMunkasokSzama > 0)
{
string message = "Sajnos nem volt elég kaja, így éhenhalt" +
(EhenhaltKiralynokSzama > 0 ? " " + EhenhaltKiralynokSzama.ToString() + " királynő" : "") +
(EhenhaltHarcosokSzama > 0 ? " " + EhenhaltHarcosokSzama.ToString() + " harcos" : "") +
(EhenhaltMunkasokSzama > 0 ? " " + EhenhaltMunkasokSzama.ToString() + " munkás" : "") +
".";
Print(message);
}
else
{
Print(String.Format("Minden hangya kapott élelmet"));
}
Print(String.Format("A raktárban {0} táplálék maradt", Taplalek));
}
private int Fogyaszt(int _szam, int _fogyasztas)
{
int veszteseg = 0;
if (Taplalek < _szam * _fogyasztas)
{
bool l = (_fogyasztas * _szam - Taplalek) % _fogyasztas == 0;
veszteseg = ((_fogyasztas * _szam - Taplalek) / _fogyasztas + (l ? 0 : 1));
Taplalek = 0;
}
else
{
Taplalek -= _fogyasztas * _szam;
}
return veszteseg;
}
public void Szaporodas(int kor)
{
if (Kihalt) return;
int szaporulat = kor * 10;
if (Random.Next(1, 100) == 1)
{
KiralynokSzama += 1;
MunkasokSzama += (szaporulat - 1);
Print(String.Format("1 új királynő és {0} új munkás született", szaporulat - 1));
}
else
{
int ujHarcosSzam = Random.Next(1, szaporulat / 2);
int ujMunkasSzam = szaporulat - ujHarcosSzam;
HarcosokSzama += ujHarcosSzam;
MunkasokSzama += ujMunkasSzam;
Print(String.Format("{0} új harcos és {1} új munkás született", ujHarcosSzam, ujMunkasSzam));
}
}
public void Gyujtes()
{
if (Kihalt) return;
int gyujtottTaplalek = (MunkasokSzama * 3);
Taplalek += gyujtottTaplalek;
Print(String.Format("A munkások {0} egység táplálékot gyűjtöttek.", gyujtottTaplalek));
}
public void Status()
{
if (Kihalt)
{
Console.WriteLine("A boly elveszett");
return;
}
else
{
Console.WriteLine("\tTáplálék\tMunkás\tHarcos\tKirálynő");
Console.WriteLine("Mennyiség\t{0}\t{1}\t{2}\t{3}", Taplalek, MunkasokSzama, HarcosokSzama, KiralynokSzama);
}
}
}
class Program
{
static void Main(string[] args)
{
int korszam = 60;
int i = 0;
Random rnd = new Random();
Hangyaboly hangyaboly = new Hangyaboly(rnd);
while (i < korszam && !hangyaboly.Kihalt)
{
if (rnd.Next(0, 100) <= 50)
hangyaboly.Vedekezes(rnd.Next(1, (i + 1) * (i + 1)));
hangyaboly.Fogyasztas();
hangyaboly.Szaporodas(i+1);
hangyaboly.Gyujtes();
hangyaboly.Status();
++i;
}
Console.ReadKey();
}
}
}