Esempio n. 1
0
        public bool primakniCilju(double brzina)
        {
            double udaljenost = odredisnaZvj.udaljenost(x, y);

            if (udaljenost < brzina)
            {
                x = odredisnaZvj.x;
                y = odredisnaZvj.y;
                return(true);
            }

            double dx = odredisnaZvj.x - x;
            double dy = odredisnaZvj.y - y;

            x += brzina * dx / udaljenost;
            y += brzina * dy / udaljenost;

            return(false);
        }
Esempio n. 2
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);
                }
            }