示例#1
0
        public static void novaKonfiguracija(Dictionary <string, string> podatci)
        {
            string[] splitano = podatci["TIP_ZVJEDE"].Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < splitano.Length; i++)
            {
                splitano[i] = splitano[i].Trim();
            }

            string[]      tipPlaneta = podatci["PLANETI_TIPOVI"].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            string[]      velPlaneta = podatci["PLANETI_VELICINE"].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            string[]      gustocaAtm = podatci["PLANETI_GUST_ATM"].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            string[]      kvalAtm    = podatci["PLANETI_KVAL_ATM"].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            string[]      minerlPov  = podatci["MINERALI_POVRSINA"].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            string[]      minerlDub  = podatci["MINERALI_DUBINSKI"].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            List <Planet> planeti    = new List <Planet>();

            for (int i = 0; i < tipPlaneta.Length; i++)
            {
                Planet.Tip tip = Planet.Tip.NIKAKAV;
                tipPlaneta[i] = tipPlaneta[i].Trim();
                if (tipPlaneta[i] == "K")
                {
                    tip = Planet.Tip.KAMENI;
                }
                else if (tipPlaneta[i] == "A")
                {
                    tip = Planet.Tip.ASTEROIDI;
                }
                else if (tipPlaneta[i] == "P")
                {
                    tip = Planet.Tip.PLINOVITI;
                }
                else if (tipPlaneta[i] == "N")
                {
                    tip = Planet.Tip.NIKAKAV;
                }

                double velicina           = double.Parse(velPlaneta[i], PodaciAlat.DecimalnaTocka);;
                double gustocaAtmosfere   = double.Parse(gustocaAtm[i], PodaciAlat.DecimalnaTocka);
                double kvalitetaAtmosfere = double.Parse(kvalAtm[i], PodaciAlat.DecimalnaTocka);
                double mineraliPovrsinski = double.Parse(minerlPov[i], PodaciAlat.DecimalnaTocka);
                double mineraliDubinski   = double.Parse(minerlDub[i], PodaciAlat.DecimalnaTocka);
                planeti.Add(new Planet(tip, i, null, velicina, kvalitetaAtmosfere, gustocaAtmosfere, mineraliPovrsinski, mineraliDubinski));
            }

            konfiguracije.Add(
                new PocetnaPozicija(
                    Zvijezda.imeTipa[splitano[0]],
                    double.Parse(splitano[1], PodaciAlat.DecimalnaTocka),
                    planeti,
                    int.Parse(podatci["MATICNI_PLANET"])
                    ));
        }
示例#2
0
        public static Image OdrediSlikuPlaneta(Planet.Tip tip, double atmGust, double atmKval, double temp)
        {
            Planet.TipInfo tipInfo = Planet.tipovi[tip];

            Image  ret = null;
            double min = double.PositiveInfinity;

            foreach (SlikaPlaneta slikaPl in PlanetTab[tip])
            {
                double dist = Math.Pow((slikaPl.atmGust - atmGust) * tipInfo.slikaAtmGustKoef, 2)
                              + Math.Pow((slikaPl.atmKval - atmKval) * tipInfo.slikaAtmKvalKoef, 2)
                              + Math.Pow((slikaPl.temp - temp) * tipInfo.slikaAtmTempKoef, 2);
                if (dist < min)
                {
                    ret = slikaPl.image;
                    min = dist;
                }
            }

            return(ret);
        }
示例#3
0
        public static void DodajSliku(Dictionary <string, string> podatci)
        {
            string putanja = podatci["DATOTEKA"];
            string skupina = podatci["SKUPINA"].Trim().ToLower();
            int    indeks  = int.Parse(podatci["INDEKS"]);

            Image slikaIzDatoteke = Image.FromFile(putanja);
            Image slika           = new Bitmap(slikaIzDatoteke);

            slikaIzDatoteke.Dispose();

            switch (skupina)
            {
            case "flota_tab":
                if (indeks == 0)
                {
                    FlotaTab = slika;
                }
                else if (indeks == 1)
                {
                    foreach (Color boja in Igrac.BojeIgraca)
                    {
                        FlotaTabBoja.Add(boja, ModulirajBoju(slika, boja));
                    }
                }
                break;

            case "planet_tab":
                Planet.Tip tip     = (Planet.Tip)indeks;
                double     atmGust = double.Parse(podatci["ATM_GUST"]);
                double     atmKval = double.Parse(podatci["ATM_KVAL"]);
                double     temp    = double.Parse(podatci["TEMPERATURA"]);

                if (!PlanetTab.ContainsKey(tip))
                {
                    PlanetTab.Add(tip, new List <SlikaPlaneta>());
                }

                PlanetTab[tip].Add(new SlikaPlaneta(slika, atmGust, atmKval, temp));
                PlanetImageIndex.Add(slika, PlanetImageIndex.Count);
                break;

            case "planet_info":
                if (indeks == 0)
                {
                    prazanRazvoj = slika;
                }
                else
                {
                    punRazvoj = slika;

                    string[] yInterval = podatci["Y_INTERVAL"].Split(',');
                    razvojYVrh = int.Parse(yInterval[0].Trim());
                    razvojYDno = int.Parse(yInterval[1].Trim());
                }
                break;

            case "odabir_zvijezde":
                SlikaOdabiraZvijezde[indeks] = slika;
                break;

            case "flota":
                foreach (Color boja in Igrac.BojeIgraca)
                {
                    Flota.Add(boja, ModulirajBoju(slika, boja));
                }
                break;

            case "brod_misija":
                MisijaBroda.Add((Misija.Tip)indeks, slika);
                break;

            case "pozicija_borca":
                if (indeks == 0)
                {
                    BoracStacionarni = slika;
                }
                if (indeks == 1)
                {
                    BoracJedanPomak = slika;
                }
                if (indeks == 2)
                {
                    BoracMimoilazak = slika;
                }
                if (indeks == 3)
                {
                    foreach (Color boja in Igrac.BojeIgraca)
                    {
                        BoracZastavica.Add(boja, ModulirajBoju(slika, boja));
                    }
                }
                if (indeks == 4)
                {
                    BoraciSvi = slika;
                }
                break;

            case "object_list":
                if (indeks == 0)
                {
                    populacijaIkona = slika;
                }
                if (indeks == 1)
                {
                    industrijaIkona = slika;
                }
                break;

            default:
                throw new ArgumentException("Invalid picture group \"" + skupina + "\" in ./slike/slike.txt");
            }
        }
示例#4
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);
                }
            }