Exemplo n.º 1
0
        public void IzvrsiKolonizacije()
        {
            foreach (KeyValuePair <Zvijezda, Flota> flotaStac in floteStacionarne)
            {
                Zvijezda zvijezda = flotaStac.Key;
                Flota    flota    = flotaStac.Value;

                #region Kolonizacija
                foreach (Flota.Kolonizacija kolonizacija in flota.kolonizacije)
                {
                    zvijezda.Naseli(this);

                    Planet planet = zvijezda.planeti[kolonizacija.planet];
                    double maxDodatnaPopulacija = 0;
                    if (planet.kolonija == null)
                    {
                        Kolonija kolonija = new Kolonija(this, planet, 10, 0);
                        maxDodatnaPopulacija = kolonija.Efekti[Kolonija.PopulacijaMax];
                    }
                    else
                    {
                        maxDodatnaPopulacija = (planet.kolonija.Efekti[Kolonija.PopulacijaMax] - planet.kolonija.Populacija);
                    }

                    long populacijaBroda  = kolonizacija.brod.dizajn.populacija;
                    long radnaMjestaBroda = kolonizacija.brod.dizajn.radnaMjesta;
                    long brBrodova        = (long)(Math.Min(kolonizacija.brBrodova, Math.Ceiling(maxDodatnaPopulacija / populacijaBroda)));
                    if (planet.kolonija == null)
                    {
                        planet.kolonija = new Kolonija(
                            this,
                            planet,
                            populacijaBroda * brBrodova,
                            radnaMjestaBroda * brBrodova);
                        poruke.AddLast(Poruka.NovaKolonija(planet.kolonija));
                    }
                    else
                    {
                        planet.kolonija.dodajKolonizator(
                            populacijaBroda * brBrodova,
                            radnaMjestaBroda * brBrodova);
                    }

                    flota.ukloniBrod(kolonizacija.brod.dizajn, brBrodova);
                }
                flota.kolonizacije.Clear();
                #endregion

                if (flota.brodovi.Count == 0)
                {
                    floteStacionarne.PendRemove(zvijezda);
                }
            }
            floteStacionarne.ApplyRemove();
        }
Exemplo n.º 2
0
        private void postaviIgraca(Igrac igrac, Zvijezda pocetnaZvj, PocetnaPopulacija pocetnaPop)
        {
            igrac.odabranaZvijezda = pocetnaZvj;
            igrac.posjeceneZvjezde.Add(pocetnaZvj);
            pocetnaZvj.Naseli(igrac);

            List <PotencijalnaPocetnaKolonija> potencijalneKolonije = new List <PotencijalnaPocetnaKolonija>();

            foreach (Planet pl in pocetnaZvj.planeti)
            {
                if (pl.tip != Planet.Tip.NIKAKAV)
                {
                    Dictionary <string, double> efekti = new Kolonija(igrac, pl, 1000, 1000).maxEfekti();
                    potencijalneKolonije.Add(new PotencijalnaPocetnaKolonija(
                                                 pl,
                                                 efekti[Kolonija.BrRadnika] / efekti[Kolonija.PopulacijaBr],
                                                 efekti[Kolonija.PopulacijaMax],
                                                 efekti[Kolonija.RudePoRudaru]));
                }
            }

            potencijalneKolonije.Sort(
                (k1, k2) =>
                (k1.prikladnost != k2.prikladnost) ?
                -(k1.prikladnost).CompareTo(k2.prikladnost) :
                -(k1.rudePoRudaru).CompareTo(k2.rudePoRudaru));

            if (potencijalneKolonije.Count > pocetnaPop.BrKolonija)
            {
                potencijalneKolonije.RemoveRange(pocetnaPop.BrKolonija, potencijalneKolonije.Count - pocetnaPop.BrKolonija);
            }

            double[] dodjeljenaPop = new double[potencijalneKolonije.Count];
            double   preostalaPop  = pocetnaPop.Populacija;
            double   ukupnaPop     = pocetnaPop.Populacija;
            double   sumaDobrota   = 0;

            for (int i = 0; i < dodjeljenaPop.Length; i++)
            {
                sumaDobrota += potencijalneKolonije[i].prikladnost;
            }

            for (int i = 0; i < dodjeljenaPop.Length; i++)
            {
                double dodjela = ukupnaPop * potencijalneKolonije[i].prikladnost / sumaDobrota;
                dodjela          = Math.Floor(Math.Min(dodjela, potencijalneKolonije[i].populacijaMax));
                preostalaPop    -= dodjela;
                dodjeljenaPop[i] = dodjela;
            }

            int najboljiPlanet = 0;

            for (int i = 0; i < dodjeljenaPop.Length; i++)
            {
                double dodjela = Math.Floor(
                    Math.Min(
                        preostalaPop,
                        potencijalneKolonije[i].populacijaMax - dodjeljenaPop[i])
                    );

                preostalaPop     -= dodjela;
                dodjeljenaPop[i] += dodjela;

                if (dodjeljenaPop[i] > dodjeljenaPop[najboljiPlanet])
                {
                    najboljiPlanet = i;
                }
            }

            for (int i = 0; i < dodjeljenaPop.Length; i++)
            {
                Planet pl = potencijalneKolonije[i].planet;

                pl.kolonija = new Kolonija(
                    igrac,
                    pl,
                    (long)dodjeljenaPop[i],
                    (long)Math.Floor(dodjeljenaPop[i] * pocetnaPop.UdioRadnihMjesta));

                igrac.kolonije.Add(pl.kolonija);
            }

            igrac.OdabranPlanet = potencijalneKolonije[najboljiPlanet].planet;
        }