//zisti existenciu skupiny mravcov, ktore idu z policka so suradnicami "suradnice" na policku "vpravo" //od nich a tymi co idu naopak //spracuje ich suboj public static void ZistiPohybVZahajSuboj(Mravenisko mravenisko, Suradnice suradnice, int cas) { List <Mravec> mravceSmerV = new List <Mravec>(); //mravce iduce smerom na v List <Mravec> mravceSmerZ = new List <Mravec>(); //mravce iduce smerom na z List <Mravec> mravceNaOdstranenieV = new List <Mravec>(); List <Mravec> mravceNaOdstranenieZ = new List <Mravec>(); //suradnice kam ide mravce v smere v Suradnice suradniceNaVychode = NasledujucePolickoMraveniska.SmerV(suradnice, mravenisko.ZistiRozmerMraveniska()); //suradnice odkial idu mravce v smere v Suradnice suradniceSmerV = suradnice; foreach (Mravec mravec in nahradneMraveniskoPohybujuce[suradniceNaVychode.ZistiXSuradnicu(), suradniceNaVychode.ZistiYSuradnicu()]) { if (ZistiCiSaSuradniceRovnaju(suradniceSmerV, mravec.ZistiStareSuradnica())) { mravceNaOdstranenieV.Add(mravec); mravceSmerV.Add(mravec); } } mravceNaOdstranenieZ = new List <Mravec>(); //suradnice odkial idu mravce v smere z Suradnice suradniceSmerZ = suradniceNaVychode; //suradnice kam idu mravce v smere z Suradnice suradniceNaZapade = suradnice; foreach (Mravec mravec in nahradneMraveniskoPohybujuce[suradniceNaZapade.ZistiXSuradnicu(), suradniceNaZapade.ZistiYSuradnicu()]) { if (ZistiCiSaSuradniceRovnaju(suradniceSmerZ, mravec.ZistiStareSuradnica())) { mravceNaOdstranenieZ.Add(mravec); mravceSmerZ.Add(mravec); } } //ak ma suboj zmysel, tak ho spusti if (mravceSmerV.Count > 0 && mravceSmerZ.Count > 0 && mravceSmerV[0].ZistiTypyMravcov() != mravceSmerZ[0].ZistiTypyMravcov()) { foreach (Mravec mravec in mravceNaOdstranenieZ) //vymazanie mravcov, ktore idu bojovat z nahradneho mraveniska, aby nevznikli duplikaty, ked sa budu mravce zapisovat { nahradneMraveniskoPohybujuce[suradniceNaZapade.ZistiXSuradnicu(), suradniceNaZapade.ZistiYSuradnicu()].Remove(mravec); } foreach (Mravec mravec in mravceNaOdstranenieV) //vymazanie mravcov, ktore idu bojovat z nahradneho mraveniska, aby nevznikli duplikaty, ked sa budu mravce zapisovat { nahradneMraveniskoPohybujuce[suradniceNaVychode.ZistiXSuradnicu(), suradniceNaVychode.ZistiYSuradnicu()].Remove(mravec); } SubojPohybujuce(mravceSmerV, suradniceNaVychode, mravceSmerZ, suradniceNaZapade, mravenisko, cas); } }
//zisti existenciu skupiny mravcov, ktore idu z policka so suradnicami "suradnice" na policko pod nimi //a tymi co ide opacne //spracuje ich suboj public static void ZistiPohybSZahajSuboj(Mravenisko mravenisko, Suradnice suradnice, int cas) { List <Mravec> mravceSmerS = new List <Mravec>(); //mravce iduce smerom s List <Mravec> mravceSmerJ = new List <Mravec>(); //mravce iduce smerom j List <Mravec> mravceNaOdstranenieS = new List <Mravec>(); //mravce na odstranenie iduce smerom s Suradnice suradniceNaSevere = suradnice; //suradnice Suradnice suradniceSmerS = NasledujucePolickoMraveniska.SmerJ(suradnice, mravenisko.ZistiRozmerMraveniska()); //suradnice odkial idu mravce //smerujuce na s foreach (Mravec mravec in nahradneMraveniskoPohybujuce[suradniceNaSevere.ZistiXSuradnicu(), suradniceNaSevere.ZistiYSuradnicu()]) { if (ZistiCiSaSuradniceRovnaju(mravec.ZistiStareSuradnica(), suradniceSmerS)) { mravceNaOdstranenieS.Add(mravec); mravceSmerS.Add(mravec); } } List <Mravec> mravceNaOdstranenieJ = new List <Mravec>(); //mravce na odstranenie iduce smerom j Suradnice suradniceNaJuhu = NasledujucePolickoMraveniska.SmerJ(suradniceNaSevere, mravenisko.ZistiRozmerMraveniska()); //suradnice kam idu mravce // iduce zo "suradniceNaSevere", teda iduce smerom j Suradnice suradniceSmerJ = suradnice; //suradnice odkial idu mravce smerujuce na j foreach (Mravec mravec in nahradneMraveniskoPohybujuce[suradniceNaJuhu.ZistiXSuradnicu(), suradniceNaJuhu.ZistiYSuradnicu()]) { if (ZistiCiSaSuradniceRovnaju(suradniceSmerJ, mravec.ZistiStareSuradnica())) { mravceNaOdstranenieJ.Add(mravec); mravceSmerJ.Add(mravec); } } //ak ma suboj zmysel, tak ho spusti if (mravceSmerS.Count > 0 && mravceSmerJ.Count > 0 && mravceSmerS[0].ZistiTypyMravcov() != mravceSmerJ[0].ZistiTypyMravcov()) { foreach (Mravec mravec in mravceNaOdstranenieS) //vymazanie mravcov, ktore idu bojovat z nahradneho mraveniska, aby nevznikli duplikaty, ked sa budu mravce zapisovat { nahradneMraveniskoPohybujuce[suradniceNaSevere.ZistiXSuradnicu(), suradniceNaSevere.ZistiYSuradnicu()].Remove(mravec); } foreach (Mravec mravec in mravceNaOdstranenieJ) //vymazanie mravcov, ktore idu bojovat z nahradneho mraveniska, aby nevznikli duplikaty, ked sa budu mravce zapisovat { nahradneMraveniskoPohybujuce[suradniceNaJuhu.ZistiXSuradnicu(), suradniceNaJuhu.ZistiYSuradnicu()].Remove(mravec); } SubojPohybujuce(mravceSmerS, suradniceNaSevere, mravceSmerJ, suradniceNaJuhu, mravenisko, cas); } }
public void ChodDopredu(int rozmerMraveniska) { Suradnice suradnice = ZistiSuradnica(); Suradnice noveSuradnice = default(Suradnice); noveSuradnice = NasledujucePolickoMraveniska.ZistiSuradniceNasledujucehoPolicka(suradnice, ZistiSmerPohybu(), rozmerMraveniska); NastavXSuradnicuPredchadzajuceSuradnice(ZistiXSuradnicu()); NastavYSuradnicuPredchadzajuceSuradnice(ZistiYSuradnicu()); NastavXSuradnicu(noveSuradnice.ZistiXSuradnicu()); NastavYSuradnicu(noveSuradnice.ZistiYSuradnicu()); }
//nastavi cinnosti mravca, v zavislosti od toho vytvori Udalost, parit sa je cinnost viacerych mravcov a najedenie sa //nie je pohybova cinnost a tak maju samostatny typ udalosti public static void NastavenieCinnostiMravca(Halda <Udalost> halda, int cas, Mravec mravec, Mravenisko mravenisko) { CinnostiMravcov cinnostiMravcovNova = ZistenieCinnostiMravca(ZistiTypPolickaSucasne(mravenisko, mravec.ZistiTypyMravcov(), mravec.ZistiSuradnica()), ZistiTypPolickaVpredu(mravenisko, mravec.ZistiTypyMravcov(), NasledujucePolickoMraveniska.ZistiSuradniceNasledujucehoPolicka( mravec.ZistiSuradnica(), mravec.ZistiSmerPohybu(), mravenisko.ZistiRozmerMraveniska())), mravec.ZistiTypyMravcov()); mravec.NastavCinnostMravca(cinnostiMravcovNova); if (cinnostiMravcovNova == CinnostiMravcov.paritSa) { mravec.NastavParitSa(true); if (!NastaveneHodnotyPocasKrokov.ZistiParenie()) { Udalost udalost = new Udalost(cas + 1, (int)TypyUdalosti.paritSa, TypyUdalosti.paritSa); halda.VlozPrvok(udalost, udalost.ZistiCasNastania(), udalost.ZistiPriorita()); NastaveneHodnotyPocasKrokov.NastavParenie(true); } } else if (cinnostiMravcovNova == CinnostiMravcov.najedzSa) { Udalost udalost = new Udalost(cas + 1, (int)TypyUdalosti.vykonanieCinnostiMravcovNepohybovych, TypyUdalosti.vykonanieCinnostiMravcovNepohybovych, mravec); halda.VlozPrvok(udalost, udalost.ZistiCasNastania(), udalost.ZistiPriorita()); } else { Udalost udalost = new Udalost(cas + 1, (int)TypyUdalosti.vykonanieCinnostiMravcovPohybovych + (int)cinnostiMravcovNova, TypyUdalosti.vykonanieCinnostiMravcovPohybovych, mravec); halda.VlozPrvok(udalost, udalost.ZistiCasNastania(), udalost.ZistiPriorita()); } }
//vykresli 2 spojnice spajajuce policka, tieto ciary reprezentuju boj mravcov pri prechadzani medzi tymito polickami, //farby ciar reprezentuju typy mravcov, ktore bojuju takisto vykresli private static void VykresliBojPriPrechadzaniSpojnice(Mravenisko mravenisko, Graphics graphics, int i, int j, int velkostStvorceka) { if (mravenisko.ZistiPolickaBojPrechadzajuce(i, j) != default(List <PolickaPriPrechadzajucomBoji>) && mravenisko.ZistiPolickaBojPrechadzajuce(i, j).Count > 0) { foreach (PolickaPriPrechadzajucomBoji polickaPriPrechadzajucomBoji1 in mravenisko.ZistiPolickaBojPrechadzajuce(i, j)) { PolickaPriPrechadzajucomBoji polickaPriPrechadzajucomBoji2 = polickaPriPrechadzajucomBoji1.ZistiDruhePolicko(); Suradnice suradnice1 = polickaPriPrechadzajucomBoji1.ZistiSuradniceMravcov(); Suradnice suradnice2 = polickaPriPrechadzajucomBoji2.ZistiSuradniceMravcov(); Pen pen1 = new Pen(ZistiFarbuMravcov(polickaPriPrechadzajucomBoji1.ZistiTypMravcov()), 3); Pen pen2 = new Pen(ZistiFarbuMravcov(polickaPriPrechadzajucomBoji2.ZistiTypMravcov()), 3); if (NasledujucePolickoMraveniska.SmerJ(suradnice1, mravenisko.ZistiRozmerMraveniska()).ZistiXSuradnicu() == suradnice2.ZistiXSuradnicu() && NasledujucePolickoMraveniska.SmerJ(suradnice1, mravenisko.ZistiRozmerMraveniska()).ZistiYSuradnicu() == suradnice2.ZistiYSuradnicu()) { if (Math.Abs(suradnice1.ZistiYSuradnicu() - suradnice2.ZistiYSuradnicu()) == 1) { VykresliCiaru(pen1, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2, velkostStvorceka / 2); VykresliCiaru(pen2, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2 + 3, velkostStvorceka / 2); } else { VykresliCiaru(pen1, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka + velkostStvorceka / 2, graphics, velkostStvorceka / 2, velkostStvorceka / 2); VykresliCiaru(pen2, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka + velkostStvorceka / 2, graphics, velkostStvorceka / 2 + 3, velkostStvorceka / 2); VykresliCiaru(pen1, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka - velkostStvorceka / 2, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2, velkostStvorceka / 2); VykresliCiaru(pen2, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka - velkostStvorceka / 2, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2 + 3, velkostStvorceka / 2); } } else if (NasledujucePolickoMraveniska.SmerZ(suradnice1, mravenisko.ZistiRozmerMraveniska()).ZistiXSuradnicu() == suradnice2.ZistiXSuradnicu() && NasledujucePolickoMraveniska.SmerZ(suradnice1, mravenisko.ZistiRozmerMraveniska()).ZistiYSuradnicu() == suradnice2.ZistiYSuradnicu()) { if (Math.Abs(suradnice1.ZistiXSuradnicu() - suradnice2.ZistiXSuradnicu()) == 1) { VykresliCiaru(pen1, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2, velkostStvorceka / 2); VykresliCiaru(pen2, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2, velkostStvorceka / 2 + 3); } else { VykresliCiaru(pen1, suradnice1.ZistiXSuradnicu() * velkostStvorceka - velkostStvorceka / 2, suradnice1.ZistiYSuradnicu() * velkostStvorceka, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2, velkostStvorceka / 2); VykresliCiaru(pen2, suradnice1.ZistiXSuradnicu() * velkostStvorceka - velkostStvorceka / 2, suradnice1.ZistiYSuradnicu() * velkostStvorceka, suradnice1.ZistiXSuradnicu() * velkostStvorceka, suradnice1.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2, velkostStvorceka / 2 + 3); VykresliCiaru(pen1, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka, suradnice2.ZistiXSuradnicu() * velkostStvorceka + velkostStvorceka / 2, suradnice2.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2, velkostStvorceka / 2); VykresliCiaru(pen2, suradnice2.ZistiXSuradnicu() * velkostStvorceka, suradnice2.ZistiYSuradnicu() * velkostStvorceka, suradnice2.ZistiXSuradnicu() * velkostStvorceka + velkostStvorceka / 2, suradnice2.ZistiYSuradnicu() * velkostStvorceka, graphics, velkostStvorceka / 2, velkostStvorceka / 2 + 3); } } } } }