示例#1
0
        public void dodajPokretnuFlotu(Dictionary <Dizajn, long> brodovi, Flota izvornaFlota,
                                       Zvijezda polaziste, Zvijezda odrediste, Flota pridruzi)
        {
            if (izvornaFlota == pridruzi)
            {
                return;
            }

            if (pridruzi != null)
            {
                pridruzi.preuzmiBrodove(izvornaFlota, brodovi);
            }
            else
            {
                PokretnaFlota flota = new PokretnaFlota(polaziste, odrediste, noviIdFlote());
                flota.preuzmiBrodove(izvornaFlota, brodovi);
                flotePokretne.Add(flota);
            }

            if (izvornaFlota.brodovi.Count == 0)
            {
                if (floteStacionarne[polaziste].id == izvornaFlota.id)
                {
                    floteStacionarne.Remove(polaziste);
                }
            }
        }
示例#2
0
 public PokretnaFlota(Zvijezda polaznaZvj, Zvijezda odredisnaZvj,
                      int id, double x, double y)
     : base(x, y, id)
 {
     this.odredisnaZvj = odredisnaZvj;
     this.polaznaZvj   = polaznaZvj;
 }
示例#3
0
        public Planet(Tip tip, int pozicija, Zvijezda zvjezda, double velicina, double kvalitetaAtmosfere, double gustocaAtmosfere, double mineraliPovrsinski, double mineraliDubinski)
        {
            this.tip      = tip;
            this.zvjezda  = zvjezda;
            this.pozicija = pozicija;
            if (zvjezda != null)
            {
                ime = zvjezda.ime + " " + rimskiBrojevi[pozicija];
            }
            else
            {
                ime = "";
            }
            this.kolonija = null;

            this.velicina           = (int)(Fje.IzIntervala(velicina, tipovi[tip].velicinaMin, tipovi[tip].velicinaMax));
            this.kvalitetaAtmosfere = kvalitetaAtmosfere;
            this.gustocaAtmosfere   = Fje.IzIntervala(gustocaAtmosfere, minGustocaAtmosfere(), maxGustocaAtmosfere());
            this.mineraliPovrsinski = Fje.IzIntervala(mineraliPovrsinski, tipovi[tip].povrsinskiMineraliMin, tipovi[tip].povrsinskiMineraliMax);
            this.mineraliDubinski   = Fje.IzIntervala(mineraliDubinski, this.mineraliPovrsinski, tipovi[tip].dubinskiMineraliMax);

            if (this.mineraliDubinski - this.mineraliPovrsinski > tipovi[tip].mineraliMaxRazlika)
            {
                this.mineraliDubinski = this.mineraliPovrsinski + tipovi[tip].mineraliMaxRazlika;
            }

            if (zvjezda != null)
            {
                slika = Slike.OdrediSlikuPlaneta(tip, this.gustocaAtmosfere, this.kvalitetaAtmosfere, this.temperatura());
            }
            else
            {
                slika = null;
            }
        }
示例#4
0
        public Igrac(Tip tip, string ime, Organizacija organizacija,
                     System.Drawing.Color boja, int id)
        {
            this.id                   = id;
            this.tip                  = tip;
            this.ime                  = ime;
            this.boja                 = boja;
            this.organizacija         = organizacija;
            random                    = new Random();
            odabranaZvijezda          = null;
            _odabranPlanet            = null;
            koncentracijaPoenaRazvoja = 1;

            foreach (Tehnologija.TechInfo t in Tehnologija.TechInfo.tehnologijeRazvoj)
            {
                tehnologije.Add(t.kod, new Tehnologija(t));
            }

            foreach (Tehnologija.TechInfo t in Tehnologija.TechInfo.tehnologijeIstrazivanje)
            {
                tehnologije.Add(t.kod, new Tehnologija(t));
            }

            filtarPoruka.Add(Poruka.Tip.Brod, true);
            filtarPoruka.Add(Poruka.Tip.Kolonija, true);
            filtarPoruka.Add(Poruka.Tip.Prica, true);
            filtarPoruka.Add(Poruka.Tip.Tehnologija, true);
            filtarPoruka.Add(Poruka.Tip.ZgradaKolonija, true);
        }
示例#5
0
 public PokretnaFlota(Zvijezda polaznaZvj, Zvijezda odredisnaZvj,
                      int id)
     : base(polaznaZvj, id)
 {
     this.odredisnaZvj = odredisnaZvj;
     this.polaznaZvj   = polaznaZvj;
 }
示例#6
0
        public Zvijezda najblizaZvijezda(double x, double y, double r)
        {
            double   minR = double.MaxValue;
            Zvijezda ret  = null;

            foreach (Zvijezda zvj in this.zvijezde)
            {
                if (zvj.tip == Zvijezda.Tip_Nikakva)
                {
                    continue;
                }
                double tr = Math.Sqrt((zvj.x - x) * (zvj.x - x) + (zvj.y - y) * (zvj.y - y));
                if (tr < minR)
                {
                    minR = tr;
                    ret  = zvj;
                }
            }

            if (r >= 0 && minR > r)
            {
                return(null);
            }

            return(ret);
        }
示例#7
0
        private Igrac(int id, Tip tip, string ime, Color boja, Organizacija organizacija,
                      Zvijezda odabranaZvijezda, Planet odabranPlanet, LinkedList <Poruka> poruke,
                      List <DizajnZgrada> dizajnoviBrodova, Dictionary <string, Tehnologija> tehnologije,
                      LinkedList <Tehnologija> tehnologijeURazvoju, double koncentracijaPoenaRazvoja,
                      LinkedList <Tehnologija> tehnologijeUIstrazivanju, HashSet <Zvijezda> posjeceneZvjezde,
                      MyDictionary <Zvijezda, Flota> floteStacionarne, MySet <PokretnaFlota> flotePokretne)
        {
            this.id                        = id;
            this.tip                       = tip;
            this.ime                       = ime;
            this.boja                      = boja;
            this.organizacija              = organizacija;
            this.odabranaZvijezda          = odabranaZvijezda;
            this._odabranPlanet            = odabranPlanet;
            this.poruke                    = poruke;
            this.dizajnoviBrodova          = dizajnoviBrodova;
            this.tehnologije               = tehnologije;
            this.tehnologijeURazvoju       = tehnologijeURazvoju;
            this.koncentracijaPoenaRazvoja = koncentracijaPoenaRazvoja;
            this.tehnologijeUIstrazivanju  = tehnologijeUIstrazivanju;
            this.posjeceneZvjezde          = posjeceneZvjezde;
            this.floteStacionarne          = floteStacionarne;
            this.flotePokretne             = flotePokretne;

            random = new Random();
            PrebrojiBrodove(this.flotePokretne);
            PrebrojiBrodove(this.floteStacionarne.Values);

            filtarPoruka.Add(Poruka.Tip.Brod, true);
            filtarPoruka.Add(Poruka.Tip.Kolonija, true);
            filtarPoruka.Add(Poruka.Tip.Prica, true);
            filtarPoruka.Add(Poruka.Tip.Tehnologija, true);
            filtarPoruka.Add(Poruka.Tip.ZgradaKolonija, true);
        }
示例#8
0
        public void izracunajPoeneIstrazivanja(IgraZvj igra)
        {
            Dictionary <Zvijezda, long> istrazivanjePoSustavuBaza = new Dictionary <Zvijezda, long>();

            foreach (Zvijezda zvj in igra.mapa.zvijezde)
            {
                istrazivanjePoSustavuBaza[zvj] = 0;
                foreach (Planet pl in zvj.planeti)
                {
                    if (pl.kolonija != null)
                    {
                        if (pl.kolonija.Igrac == this)
                        {
                            istrazivanjePoSustavuBaza[zvj] += (long)(pl.kolonija.Populacija * efekti["ISTRAZIVANJE_PO_STANOVNIKU"]);
                        }
                    }
                }
                istrazivanjePoSustavuBaza[zvj] = (long)Math.Floor(Math.Sqrt(istrazivanjePoSustavuBaza[zvj]));
            }

            istrazivanjeSustav = igra.mapa.zvijezde[0];
            foreach (Zvijezda zvjI in istrazivanjePoSustavuBaza.Keys)
            {
                istrazivanjePoSustavu[zvjI] = 0;
                foreach (Zvijezda zvjJ in istrazivanjePoSustavuBaza.Keys)
                {
                    istrazivanjePoSustavu[zvjI] += (long)(istrazivanjePoSustavuBaza[zvjJ] / (1 + zvjI.udaljenost(zvjJ) / efekti["ISTRAZIVANJE_KOM_UDALJENOST"]));
                }

                if (istrazivanjePoSustavu[zvjI] > istrazivanjePoSustavu[istrazivanjeSustav])
                {
                    istrazivanjeSustav = zvjI;
                }
            }
        }
示例#9
0
        public static ZvjezdanaUprava Ucitaj(PodaciCitac ulaz, List <Igrac> igraci,
                                             Dictionary <int, Zvijezda> zvijezde,
                                             Dictionary <int, Zgrada.ZgradaInfo> zgradeInfoID)
        {
            Igrac    igrac    = igraci[ulaz.podatakInt(PohIgrac)];
            Zvijezda zvijezda = zvijezde[ulaz.podatakInt(PohZvijezda)];
            double   udioInd  = ulaz.podatakDouble(PohGradUdio);
            Dictionary <string, double> ostatakGradnje = ulaz.podatakDoubleRjecnik(PohGradOst);

            int           brZgrada = ulaz.podatakInt(PohZgrada);
            List <Zgrada> zgrade   = new List <Zgrada>();

            for (int i = 0; i < brZgrada; i++)
            {
                zgrade.Add(Zgrada.Ucitaj(ulaz[PohZgrada + i]));
            }

            int[] zgradeID = ulaz.podatakIntPolje(PohGrad);
            LinkedList <Zgrada.ZgradaInfo> redCivilneGradnje = new LinkedList <Zgrada.ZgradaInfo>();

            for (int i = 0; i < zgradeID.Length; i++)
            {
                redCivilneGradnje.AddLast(zgradeInfoID[zgradeID[i]]);
            }

            return(new ZvjezdanaUprava(zvijezda, igrac, ostatakGradnje, udioInd,
                                       redCivilneGradnje, zgrade));
        }
示例#10
0
        public ZvjezdanaUprava(Zvijezda zvijezda, Igrac igrac)
            : base(igrac)
        {
            this.zvijezda = zvijezda;

            foreach (string kljuc in KljuceviEfekata)
            {
                Efekti.Add(kljuc, 0);
            }
        }
示例#11
0
        public void dodajBrod(Dizajn dizajn, long kolicina, Zvijezda zvijezda)
        {
            if (!floteStacionarne.ContainsKey(zvijezda))
            {
                floteStacionarne.Add(zvijezda, new Flota(zvijezda.x, zvijezda.y, noviIdFlote()));
            }

            floteStacionarne[zvijezda].dodajBrod(new Brod(dizajn, kolicina));
            dizajn.brojBrodova += kolicina;
        }
示例#12
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();
        }
示例#13
0
        public static Planet Ucitaj(PodaciCitac ulaz, Zvijezda zvijezda, int pozicija)
        {
            Tip tip      = (Tip)ulaz.podatakInt(PohTip);
            int velicina = ulaz.podatakInt(PohVelicina);

            double kvalitetaAtmosfere = ulaz.podatakDouble(PohAtmKval);
            double gustocaAtmosfere   = ulaz.podatakDouble(PohAtmGust);
            double mineraliPovrsinski = ulaz.podatakDouble(PohMineralPov);
            double mineraliDubinski   = ulaz.podatakDouble(PohMineralDub);

            return(new Planet(tip, pozicija, zvijezda, velicina, kvalitetaAtmosfere,
                              gustocaAtmosfere, mineraliPovrsinski, mineraliDubinski));
        }
示例#14
0
        private Planet(Tip tip, int pozicija, Zvijezda zvjezda, int velicina, double kvalitetaAtmosfere, double gustocaAtmosfere, double mineraliPovrsinski, double mineraliDubinski)
        {
            this.tip      = tip;
            this.zvjezda  = zvjezda;
            this.pozicija = pozicija;
            ime           = zvjezda.ime + " " + rimskiBrojevi[pozicija];
            this.kolonija = null;

            this.velicina           = velicina;
            this.kvalitetaAtmosfere = kvalitetaAtmosfere;
            this.gustocaAtmosfere   = gustocaAtmosfere;
            this.mineraliPovrsinski = mineraliPovrsinski;
            this.mineraliDubinski   = mineraliDubinski;

            slika = Slike.OdrediSlikuPlaneta(tip, this.gustocaAtmosfere, this.kvalitetaAtmosfere, this.temperatura());
        }
示例#15
0
        public Planet(Planet predlozak, Zvijezda zvjezda, Kolonija kolonija)
        {
            this.tip      = predlozak.tip;
            this.zvjezda  = zvjezda;
            this.pozicija = predlozak.pozicija;
            this.ime      = zvjezda.ime + " " + rimskiBrojevi[pozicija];
            this.kolonija = kolonija;
            this.slika    = predlozak.slika;

            this.velicina           = predlozak.velicina;
            this.kvalitetaAtmosfere = predlozak.kvalitetaAtmosfere;
            this.gustocaAtmosfere   = predlozak.gustocaAtmosfere;
            this.mineraliDubinski   = predlozak.mineraliDubinski;
            this.mineraliPovrsinski = predlozak.mineraliPovrsinski;

            slika = Slike.OdrediSlikuPlaneta(tip, this.gustocaAtmosfere, this.kvalitetaAtmosfere, this.temperatura());
        }
示例#16
0
        public ZvjezdanaUprava(Zvijezda zvijezda, Igrac igrac, Dictionary <string, double> ostatakGradnje,
                               double udioGradnje, LinkedList <Zgrada.ZgradaInfo> redGradnje, IEnumerable <Zgrada> zgrade)
            : base(igrac, redGradnje, ostatakGradnje)
        {
            this.zvijezda    = zvijezda;
            this.udioGradnje = udioGradnje;

            foreach (Zgrada zgrada in zgrade)
            {
                this.Zgrade.Add(zgrada.tip, zgrada);
            }

            foreach (string kljuc in KljuceviEfekata)
            {
                Efekti.Add(kljuc, 0);
            }
        }
示例#17
0
        public static Zvijezda Ucitaj(PodaciCitac ulaz, int id)
        {
            int    tip      = ulaz.podatakInt(PohTip);
            double x        = ulaz.podatakDouble(PohX);
            double y        = ulaz.podatakDouble(PohY);
            double velicina = ulaz.podatakDouble(PohVelicina);
            string ime      = ulaz.podatak(PohIme);

            Zvijezda zvj = new Zvijezda(id, tip, x, y, velicina, ime);

            if (tip >= 0)
            {
                for (int i = 0; i < Mapa.GraditeljMape.BR_PLANETA; i++)
                {
                    zvj.planeti.Add(Planet.Ucitaj(ulaz[Planet.PohranaTip + i], zvj, i));
                }
            }

            return(zvj);
        }
示例#18
0
        public static Mapa Ucitaj(PodaciCitac ulaz)
        {
            int             brZvjezda     = ulaz.podatakInt(PohBrZijezda);
            List <Zvijezda> zvijezde      = new List <Zvijezda>();
            List <int[]>    tmpCrvotocine = new List <int[]>();

            for (int i = 0; i < brZvjezda; i++)
            {
                zvijezde.Add(Zvijezda.Ucitaj(ulaz[Zvijezda.PohranaTip + i], i));
                tmpCrvotocine.Add(Zvijezda.UcitajCrvotocine(ulaz[Zvijezda.PohranaTip + i]));
            }
            for (int i = 0; i < brZvjezda; i++)
            {
                foreach (int veza in tmpCrvotocine[i])
                {
                    zvijezde[i].crvotocine.Add(zvijezde[veza]);
                }
            }

            return(new Mapa(zvijezde));
        }
示例#19
0
        public List <Flota> slicneFlote(Zvijezda polaziste, Zvijezda odrediste)
        {
            List <Flota> rez = new List <Flota>();

            if (polaziste.id == odrediste.id || odrediste == null)
            {
                if (floteStacionarne.ContainsKey(polaziste))
                {
                    rez.Add(floteStacionarne[polaziste]);
                }
                return(rez);
            }
            else
            {
                foreach (PokretnaFlota flota in flotePokretne)
                {
                    if (flota.polaznaZvj.id == polaziste.id && flota.odredisnaZvj.id == odrediste.id)
                    {
                        rez.Add(flota);
                    }
                }
                return(rez);
            }
        }
示例#20
0
            public GraditeljMape(int tipMape, int brIgraca)
            {
                mapa            = new Mapa();
                pocetnePozicije = new List <Zvijezda>();

                Random             rnd = new Random();
                double             x, y;
                int                velicinaMape   = Mapa.velicinaMape[tipMape].velicina;
                HashSet <Zvijezda> pozicijeIgraca = new HashSet <Zvijezda>();

                #region Stvaranje zvijezda
                {
                    const double OSTUPANJE_ZVJ = 0.35;

                    for (y = 0; y < velicinaMape; y++)
                    {
                        for (x = 0; x < velicinaMape; x++)
                        {
                            mapa.zvijezde.Add(new Zvijezda(
                                                  mapa.zvijezde.Count,
                                                  Zvijezda.Tip_Nedodijeljen,
                                                  (x + OSTUPANJE_ZVJ * 2 * rnd.NextDouble()) * UDALJENOST,
                                                  (y + OSTUPANJE_ZVJ * 2 * rnd.NextDouble()) * UDALJENOST
                                                  ));
                        }
                    }
                }
                #endregion

                #region Pozicije igrača
                {
                    List <Zvijezda> igraceveZvijezde       = new List <Zvijezda>();
                    const double    UDALJENOST_OD_SREDISTA = 0.85;
                    double          pomakFi = rnd.Next(2) * Math.PI + 0.25 * Math.PI;
                    double          R       = UDALJENOST * (velicinaMape - 1) / 2.0;

                    for (double igrac = 0; igrac < brIgraca; igrac++)
                    {
                        x = R + UDALJENOST_OD_SREDISTA * R * Math.Cos(pomakFi + (igrac * 2 * Math.PI) / brIgraca);
                        y = R + UDALJENOST_OD_SREDISTA * R * Math.Sin(pomakFi + (igrac * 2 * Math.PI) / brIgraca);
                        double   minR        = double.MaxValue;
                        Zvijezda zvjNajbolja = null;;

                        foreach (Zvijezda zvj in mapa.zvijezde)
                        {
                            double r = Math.Sqrt((x - zvj.x) * (x - zvj.x) + (y - zvj.y) * (y - zvj.y));
                            if (r < minR)
                            {
                                minR        = r;
                                zvjNajbolja = zvj;
                            }
                        }

                        zvjNajbolja.tip = Zvijezda.Tip_PocetnaPozicija;
                        pozicijeIgraca.Add(zvjNajbolja);
                        igraceveZvijezde.Add(zvjNajbolja);
                    }
                }
                #endregion

                #region Imenovanje zvijezda
                {
                    List <int> zvjezdja = new List <int>();
                    Dictionary <int, List <Zvijezda> > zvjezdeUZvjezdju = new Dictionary <int, List <Zvijezda> >();
                    int zvje;
                    int i;

                    Vadjenje <int> vz   = new Vadjenje <int>();
                    Vadjenje <int> dodZ = new Vadjenje <int>();
                    for (i = 0; i < PodaciAlat.zvijezdja.Count; i++)
                    {
                        vz.dodaj(i);
                    }

                    for (i = 0; i < Mapa.velicinaMape[tipMape].brZvijezdja; i++)
                    {
                        zvje = vz.izvadi();
                        for (int j = 0; j < 8; j++)
                        {
                            zvjezdja.Add(zvje);
                        }
                    }

                    vz = new Vadjenje <int>(zvjezdja);
                    foreach (Zvijezda zvj in mapa.zvijezde)
                    {
                        zvje = vz.izvadi();
                        if (!zvjezdeUZvjezdju.ContainsKey(zvje))
                        {
                            zvjezdeUZvjezdju.Add(zvje, new List <Zvijezda>());
                        }

                        zvjezdeUZvjezdju[zvje].Add(zvj);
                    }

                    foreach (int izvj in zvjezdeUZvjezdju.Keys)
                    {
                        if (zvjezdeUZvjezdju[izvj].Count == 1)
                        {
                            zvjezdeUZvjezdju[izvj][0].ime = PodaciAlat.zvijezdja[izvj].nominativ;
                        }
                        else
                        {
                            Vadjenje <Zvijezda> vZvj = new Vadjenje <Zvijezda>(zvjezdeUZvjezdju[izvj]);
                            for (int j = 0; j < zvjezdeUZvjezdju[izvj].Count; j++)
                            {
                                vZvj.izvadi().ime =
                                    PodaciAlat.prefiksZvijezdja[(PodaciAlat.PrefiksZvijezdja)j] +
                                    " " +
                                    PodaciAlat.zvijezdja[izvj].genitiv;
                            }
                        }
                    }
                }
                #endregion

                #region Dodijela tipa zvijezdama i stvaranje planeta
                {
                    Vadjenje <int> tipovi        = new Vadjenje <int>();
                    int            brZvj         = mapa.zvijezde.Count - brIgraca;
                    double         kontrolniBroj = 0;

                    #region  Određivanje broja zvijezda pojedinog tipa
                    for (int tip = 0; tip < Zvijezda.Tipovi.Count; tip++)
                    {
                        for (int i = 0; i < Zvijezda.Tipovi[tip].udioPojave * brZvj; i++)
                        {
                            tipovi.dodaj(tip);
                        }

                        kontrolniBroj += Zvijezda.Tipovi[tip].udioPojave * brZvj;
                        if (kontrolniBroj - tipovi.kolicina() >= 0.5)
                        {
                            tipovi.dodaj(tip);
                        }
                    }
                    for (int i = 0; brZvj > tipovi.kolicina(); i++)
                    {
                        tipovi.dodaj(Zvijezda.Tip_Nikakva);
                    }
                    #endregion

                    #region Pridjeljivanje tipova
                    Dictionary <int, List <Zvijezda> > zvijezdePoTipu = new Dictionary <int, List <Zvijezda> >();
                    foreach (Zvijezda zvj in mapa.zvijezde)
                    {
                        if (zvj.tip != Zvijezda.Tip_PocetnaPozicija)
                        {
                            zvj.tip = tipovi.izvadi();
                            if (!zvijezdePoTipu.ContainsKey(zvj.tip))
                            {
                                zvijezdePoTipu[zvj.tip] = new List <Zvijezda>();
                            }
                            zvijezdePoTipu[zvj.tip].Add(zvj);
                        }
                    }
                    for (int i = mapa.zvijezde.Count - 1; i > 0; i--)
                    {
                        if (mapa.zvijezde[i].tip == Zvijezda.Tip_Nikakva)
                        {
                            mapa.zvijezde.RemoveAt(i);
                        }
                    }
                    for (int i = 0; i < mapa.zvijezde.Count; i++)
                    {
                        mapa.zvijezde[i].id = i;
                    }
                    #endregion

                    #region Određivanje raspodijeljivih planeta
                    Dictionary <int, Vadjenje <Planet.Tip>[]> tipoviPlaneta = new Dictionary <int, Vadjenje <Planet.Tip>[]>();
                    Planet.Tip[] enumTipova = new Planet.Tip[] { Planet.Tip.NIKAKAV, Planet.Tip.ASTEROIDI, Planet.Tip.KAMENI, Planet.Tip.PLINOVITI };
                    Dictionary <Planet.Tip, int> brPlanetaPoTipu = new Dictionary <Planet.Tip, int>();
                    foreach (Planet.Tip tip in enumTipova)
                    {
                        brPlanetaPoTipu.Add(tip, 0);
                    }
                    foreach (int tipZvj in zvijezdePoTipu.Keys)
                    {
                        if (tipZvj == Zvijezda.Tip_Nikakva)
                        {
                            continue;
                        }

                        Dictionary <Planet.Tip, double[]> tipoviPoPozicijama = new Dictionary <Planet.Tip, double[]>();
                        foreach (Planet.Tip tipPlaneta in enumTipova)
                        {
                            tipoviPoPozicijama[tipPlaneta] = new double[BR_PLANETA];
                            Zvijezda.TipInfo.PojavnostPlaneta parametri = Zvijezda.Tipovi[tipZvj].pojavnostPlaneta[tipPlaneta];

                            double suma = 0;
                            for (int i = 0; i < BR_PLANETA; i++)
                            {
                                tipoviPoPozicijama[tipPlaneta][i] = (1 - parametri.odstupanje) + rnd.NextDouble() * parametri.odstupanje;
                                if (i <= parametri.gomiliste)
                                {
                                    tipoviPoPozicijama[tipPlaneta][i] *= parametri.unutarnjaUcestalost + (1 - parametri.unutarnjaUcestalost) * i / (BR_PLANETA * parametri.gomiliste);
                                }
                                else
                                {
                                    tipoviPoPozicijama[tipPlaneta][i] *= 1 + (parametri.vanjskaUcestalost - 1) * (i - BR_PLANETA * parametri.gomiliste) / (BR_PLANETA * (1 - parametri.gomiliste));
                                }
                                suma += tipoviPoPozicijama[tipPlaneta][i];
                            }

                            if (suma > 0)
                            {
                                for (int i = 0; i < BR_PLANETA; i++)
                                {
                                    tipoviPoPozicijama[tipPlaneta][i] *= parametri.tezinaPojave / suma;
                                }
                            }
                        }

                        tipoviPlaneta[tipZvj] = new Vadjenje <Planet.Tip> [BR_PLANETA];
                        for (int i = 0; i < BR_PLANETA; i++)
                        {
                            tipoviPlaneta[tipZvj][i] = new Vadjenje <Planet.Tip>();
                            double suma = 0;
                            foreach (Planet.Tip tipPlaneta in enumTipova)
                            {
                                suma += tipoviPoPozicijama[tipPlaneta][i];
                            }

                            foreach (Planet.Tip tipPlaneta in enumTipova)
                            {
                                double n = tipoviPoPozicijama[tipPlaneta][i] * zvijezdePoTipu[tipZvj].Count / suma;
                                brPlanetaPoTipu[tipPlaneta] += (int)n;
                                for (int j = 1; j <= n; j++)
                                {
                                    tipoviPlaneta[tipZvj][i].dodaj(tipPlaneta);
                                }
                            }

                            while (tipoviPlaneta[tipZvj][i].kolicina() < zvijezdePoTipu[tipZvj].Count)
                            {
                                tipoviPlaneta[tipZvj][i].dodaj(Planet.Tip.NIKAKAV);
                            }
                        }
                    }
                    Dictionary <Planet.Tip, Vadjenje <double> > randVelicina = new Dictionary <Planet.Tip, Vadjenje <double> >();
                    Dictionary <Planet.Tip, Vadjenje <double> > randAtmKval  = new Dictionary <Planet.Tip, Vadjenje <double> >();
                    Dictionary <Planet.Tip, Vadjenje <double> > randAtmGust  = new Dictionary <Planet.Tip, Vadjenje <double> >();
                    Dictionary <Planet.Tip, Vadjenje <double> > randMinerPov = new Dictionary <Planet.Tip, Vadjenje <double> >();
                    Dictionary <Planet.Tip, Vadjenje <double> > randMinerDub = new Dictionary <Planet.Tip, Vadjenje <double> >();
                    foreach (Planet.Tip tipPl in enumTipova)
                    {
                        randAtmGust.Add(tipPl, new Vadjenje <double>());
                        randAtmKval.Add(tipPl, new Vadjenje <double>());
                        randMinerDub.Add(tipPl, new Vadjenje <double>());
                        randMinerPov.Add(tipPl, new Vadjenje <double>());
                        randVelicina.Add(tipPl, new Vadjenje <double>());
                        for (double i = 0; i < brPlanetaPoTipu[tipPl]; i++)
                        {
                            randAtmGust[tipPl].dodaj(i / brPlanetaPoTipu[tipPl]);
                            randAtmKval[tipPl].dodaj(i / brPlanetaPoTipu[tipPl]);
                            randMinerDub[tipPl].dodaj(i / brPlanetaPoTipu[tipPl]);
                            randMinerPov[tipPl].dodaj(i / brPlanetaPoTipu[tipPl]);
                            randVelicina[tipPl].dodaj(i / brPlanetaPoTipu[tipPl]);
                        }
                    }
                    #endregion

                    #region Dodavanje planeta
                    foreach (Zvijezda zvj in mapa.zvijezde)
                    {
                        //if (zvj.tip == Zvijezda.Tip_Nikakva || mapa.pozicijeIgraca.Contains(zvj))
                        if (zvj.tip == Zvijezda.Tip_Nikakva || zvj.tip == Zvijezda.Tip_PocetnaPozicija)
                        {
                            continue;
                        }

                        for (int i = 0; i < BR_PLANETA; i++)
                        {
                            Planet.Tip tip      = tipoviPlaneta[zvj.tip][i].izvadi();
                            double     velicina = randVelicina[tip].izvadi();
                            double     AtmGust  = randAtmGust[tip].izvadi();
                            double     AtmKval  = randAtmKval[tip].izvadi();
                            double     MinerPov = randMinerPov[tip].izvadi();
                            double     MinerDub = randMinerDub[tip].izvadi();
                            zvj.planeti.Add(
                                new Planet(tip, i, zvj, velicina,
                                           AtmKval, AtmGust,
                                           MinerPov, MinerDub));
                        }
                    }
                    #endregion

                    #region Dodavanje crvotočina
                    List <Zvijezda> popisZvijezda = new List <Zvijezda>();
                    foreach (Zvijezda zvj in mapa.zvijezde)
                    {
                        if (zvj.tip != Zvijezda.Tip_Nikakva && zvj.tip != Zvijezda.Tip_Nedodijeljen)
                        {
                            popisZvijezda.Add(zvj);
                        }
                    }

                    Vadjenje <Zvijezda> zvijezdeIshodista = new Vadjenje <Zvijezda>(popisZvijezda);
                    while (zvijezdeIshodista.kolicina() > 0)
                    {
                        Zvijezda ishodiste = zvijezdeIshodista.izvadi();

                        List <Usporediv <Zvijezda, double> > odredista = new List <Usporediv <Zvijezda, double> >();
                        foreach (Zvijezda zvj in popisZvijezda)
                        {
                            if (zvj.crvotocine.Count < MaxCrvotocinaPoZvj)
                            {
                                if (ishodiste.udaljenost(zvj) <= MaxDometCrvotocine)
                                {
                                    if (!zvj.crvotocine.Contains(ishodiste) && !ishodiste.crvotocine.Contains(zvj))
                                    {
                                        if (zvj != ishodiste)
                                        {
                                            odredista.Add(new Usporediv <Zvijezda, double>(zvj, ishodiste.udaljenost(zvj)));
                                        }
                                    }
                                }
                            }
                        }
                        odredista.Sort();

                        int brNovihCrvotocina = Math.Min(MinCrvotocinaPoZvj - ishodiste.crvotocine.Count, odredista.Count);
                        for (int i = 0; i < brNovihCrvotocina; i++)
                        {
                            ishodiste.crvotocine.Add(odredista[i].objekt);
                            odredista[i].objekt.crvotocine.Add(ishodiste);
                        }
                    }
                    #endregion
                }
                #endregion

                int br = 0;
                foreach (Zvijezda zvj in pozicijeIgraca)
                {
                    br++;
                    zvj.ime = "Doma " + br;
                    PocetnaPozicija konf = PocetnaPozicija.konfiguracije[rnd.Next(PocetnaPozicija.konfiguracije.Count)];
                    zvj.tip = konf.tipZvjezde;
                    zvj.promjeniVelicinu(konf.velicinaZvijezde);
                    for (int i = 0; i < BR_PLANETA; i++)
                    {
                        Planet planet = new Planet(konf.planeti[i], zvj, null);
                        zvj.planeti.Add(planet);
                    }
                    pocetnePozicije.Add(zvj);
                }
            }
示例#21
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;
        }
示例#22
0
 public double udaljenost(Zvijezda zvj)
 {
     return(Math.Sqrt((this.x - zvj.x) * (this.x - zvj.x) + (this.y - zvj.y) * (this.y - zvj.y)));
 }
示例#23
0
        public static Igrac Ucitaj(PodaciCitac ulaz, Mapa mapa)
        {
            Tip tip = Tip.COVJEK;

            if (ulaz.podatak(PohTip) != PohTipCovjek)
            {
                tip = Tip.RACUNALO;
            }

            int          id           = ulaz.podatakInt(PohId);
            string       ime          = ulaz.podatak(PohIme);
            Organizacija organizacija = Organizacija.lista[ulaz.podatakInt(PohOrganizacija)];
            Color        boja         = OdrediBoju(ulaz.podatak(PohBoja));

            foreach (Color color in BojeIgraca)
            {
                if (boja.R == color.R && boja.G == color.G && boja.B == color.B)
                {
                    boja = color;
                }
            }

            Zvijezda odabranaZvj   = OdrediOdabranuZvj(mapa, ulaz.podatak(PohPogledZvj));
            Planet   odabranPlanet = odabranaZvj.planeti[ulaz.podatakInt(PohPogledPlanet)];

            Dictionary <int, Zvijezda> zvijezdeID = new Dictionary <int, Zvijezda>();

            foreach (Zvijezda zvj in mapa.zvijezde)
            {
                zvijezdeID.Add(zvj.id, zvj);
            }

            int brDizajnova = ulaz.podatakInt(PohDizajn);
            List <DizajnZgrada> dizajnovi = new List <DizajnZgrada>();

            for (int i = 0; i < brDizajnova; i++)
            {
                Dizajn dizajn = Dizajn.Ucitaj(ulaz[PohDizajn + i]);
                dizajnovi.Add(new DizajnZgrada(dizajn));
            }

            int brTeh = ulaz.podatakInt(PohTehnologija);
            Dictionary <string, Tehnologija> tehnologije = new Dictionary <string, Tehnologija>();

            for (int i = 0; i < brTeh; i++)
            {
                Tehnologija teh = Tehnologija.Ucitaj(ulaz[PohTehnologija + i]);
                tehnologije.Add(teh.tip.kod, teh);
            }
            double koncPoenaRazvoja = ulaz.podatakDouble(PohTehRazKonc);

            int[] tmpIntovi = ulaz.podatakIntPolje(PohTehURazvoju);
            LinkedList <Tehnologija> tehURazvoju = new LinkedList <Tehnologija>();

            foreach (int tehId in tmpIntovi)
            {
                tehURazvoju.AddLast(tehnologije[Tehnologija.TechInfo.tehnologijeRazvoj[tehId].kod]);
            }

            tmpIntovi = ulaz.podatakIntPolje(PohTehUIstraz);
            LinkedList <Tehnologija> tehUIstraz = new LinkedList <Tehnologija>();

            foreach (int tehId in tmpIntovi)
            {
                tehUIstraz.AddLast(tehnologije[Tehnologija.TechInfo.tehnologijeIstrazivanje[tehId].kod]);
            }

            tmpIntovi = ulaz.podatakIntPolje(PohPosjeceneZvj);
            HashSet <Zvijezda> posjeceneZvijezde = new HashSet <Zvijezda>();

            foreach (int zvjId in tmpIntovi)
            {
                posjeceneZvijezde.Add(zvijezdeID[zvjId]);
            }

            Dictionary <int, Dizajn> dizajnID = new Dictionary <int, Dizajn>();

            foreach (DizajnZgrada dizajnZgrada in dizajnovi)
            {
                dizajnID.Add(dizajnZgrada.dizajn.id, dizajnZgrada.dizajn);
            }
            tmpIntovi = ulaz.podatakIntPolje(PohFloteStac);
            MyDictionary <Zvijezda, Flota> floteStacionarne = new MyDictionary <Zvijezda, Flota>();

            for (int i = 0; i < tmpIntovi.Length; i++)
            {
                floteStacionarne.Add(
                    zvijezdeID[tmpIntovi[i]],
                    Flota.Ucitaj(ulaz[PohFloteStac + i], dizajnID));
            }

            int brPokFlota = ulaz.podatakInt(PohFlotePokret);
            MySet <PokretnaFlota> flotePokretne = new MySet <PokretnaFlota>();

            for (int i = 0; i < brPokFlota; i++)
            {
                flotePokretne.Add(PokretnaFlota.Ucitaj(ulaz[PohFlotePokret + i], dizajnID, zvijezdeID));
            }

            int brPoruka = ulaz.podatakInt(PohPoruka);
            LinkedList <Poruka> poruke = new LinkedList <Poruka>();

            for (int i = 0; i < brPoruka; i++)
            {
                poruke.AddLast(Poruka.Ucitaj(ulaz[PohPoruka + i], zvijezdeID, dizajnID));
            }

            return(new Igrac(id, tip, ime, boja, organizacija, odabranaZvj, odabranPlanet,
                             poruke, dizajnovi, tehnologije, tehURazvoju, koncPoenaRazvoja, tehUIstraz,
                             posjeceneZvijezde, floteStacionarne, flotePokretne));
        }
示例#24
0
 public Flota(Zvijezda zvijezda, int id)
     : this(zvijezda.x, zvijezda.y, id)
 {
 }