예제 #1
0
        private void Odio(Casilla c, Bitmon bitmon1, Bitmon bitmon2)
        {
            int vida1   = bitmon1.getvida();
            int vida2   = bitmon2.getvida();
            int ataque1 = bitmon1.getataque();
            int ataque2 = bitmon2.getataque();

            if (bitmon1.Tipo == "Gofue" && bitmon2.Tipo == "Taplan")
            {
                ataque1 = (int)((double)ataque1 * 1.5); //los gofue tienen ventaja sobre los taplans
            }

            if (bitmon1.Tipo == "Taplan" && bitmon2.Tipo == "Gofue")
            {
                ataque2 = (int)((double)ataque1 * 1.5); //los gofue tienen ventaja sobre los taplans
            }

            if (bitmon1.Tipo == "Dorvalo" && bitmon2.Tipo == "Gofue")
            {
                ataque2 = (int)((double)ataque2 * 0.8);//los dorvalos son resistentes a los gofue
            }

            if (bitmon1.Tipo == "Gofue" && bitmon2.Tipo == "Dorvalo")
            {
                ataque1 = (int)((double)ataque1 * 0.8);//los dorvalos son resistentes a los gofue
            }


            while (vida1 >= 1 && vida2 >= 1)
            {
                vida1 -= ataque2;
                vida2 -= ataque1;
            }

            if (vida1 < 1)
            {
                bitmons_alive.Remove(bitmon1);
                bithalla.Add(bitmon1);
                c.BorrarOcupante(bitmon1);
                bitmons_muertos_mes++;
            }
            if (vida2 < 1)
            {
                bitmons_alive.Remove(bitmon2);
                bithalla.Add(bitmon2);
                c.BorrarOcupante(bitmon2);
                bitmons_muertos_mes++;
            }
        }
예제 #2
0
 private void Interactuar(Casilla c, Bitmon bitmon1, Bitmon bitmon2)
 {
     if ((bitmon1.Tipo == "Gofue" && bitmon2.Tipo == "Taplan") || (bitmon1.Tipo == "Taplan" && bitmon2.Tipo == "Gofue"))
     {
         this.Odio(c, bitmon1, bitmon2);
     }
     else if ((bitmon1.Tipo == "Wetar" && bitmon2.Tipo == "Dorvalo") || (bitmon1.Tipo == "Wetar" && bitmon2.Tipo == "Dorvalo"))
     {
         this.Odio(c, bitmon1, bitmon2);
     }
     else if ((bitmon1.Tipo == "Dorvalo" && bitmon2.Tipo == "Taplan") || (bitmon1.Tipo == "Taplan" && bitmon2.Tipo == "Dorvalo"))
     {
         this.Odio(c, bitmon1, bitmon2);
     }
     else if ((bitmon1.Tipo == "Dorvalo" && bitmon2.Tipo == "Gofue") || (bitmon1.Tipo == "Dorvalo" && bitmon2.Tipo == "Dorvalo"))
     {
         this.Odio(c, bitmon1, bitmon2);
     }
     else
     {
         this.Amor(c, bitmon1, bitmon2);
     }
 }
예제 #3
0
        private void Amor(Casilla c, Bitmon bitmon1, Bitmon bitmon2)
        {
            // crear nuevo bitmon siguiendo las reglas
            string tipo;
            double prob1;
            Bitmon bitmon;

            //con que probabilidad tendra la raza del progenitor 1 o 2
            if (bitmon1.Tipo != "Ent" && bitmon2.Tipo != "Ent")
            {
                if (bitmon1.getCantHijos() > bitmon2.getCantHijos())
                {
                    prob1 = 0.7;
                }
                else if (bitmon1.getCantHijos() < bitmon2.getCantHijos())
                {
                    prob1 = 0.3;
                }
                else
                {
                    prob1 = 0.5;
                }
                bitmon1.tenerHijo();
                bitmon2.tenerHijo();
                // de quien hereda la raza
                if (random.NextDouble() < prob1)
                {
                    tipo = bitmon1.Tipo;
                }
                else
                {
                    tipo = bitmon2.Tipo;
                }

                if (tipo == "Gofue")
                {
                    bitmon = new Gofue();
                }
                else if (tipo == "Dorvalo")
                {
                    bitmon = new Dorvalo();
                }
                else if (tipo == "Taplan")
                {
                    bitmon = new Taplan();
                }
                else if (tipo == "Ent")
                {
                    bitmon = new Ent();
                }
                else if (tipo == "Wetar")
                {
                    bitmon = new Wetar();
                }
                else
                {
                    bitmon = new Doti();
                }

                if (bitmon1.Tipo == bitmon2.Tipo)//los purasangre son mas fuertes
                {
                    bitmon.boostataque(5); bitmon.boostvida(18);
                }
                // agregar bitmon al mapelse if (tipo == "Gofue")a si es posible
                // todo lo que al nacer aparece en un terreno ocupado (2 bitmons) muere al instante (el fuerte se aprovecha del debil!)
                bool pocisionado      = false;
                bool TerrenoValido    = true;
                int  potencialCasilla = random.Next((cols * rows));
                int  cont             = 0;
                foreach (Casilla casilla in MapLayout.Controls)
                {
                    if (cont == potencialCasilla)
                    {
                        if ((bitmon.Tipo == "Wetar" && casilla.Tipo != "agua"))
                        {
                            TerrenoValido = false;
                        }

                        else
                        {
                            pocisionado = casilla.AddOcupante(bitmon);
                        }

                        if (pocisionado && TerrenoValido)
                        {
                            bitmon.SizeMode = PictureBoxSizeMode.Zoom;
                            bitmon.Size     = new Size((int)(600 / cols / 3), (int)(600 / cols / 3));

                            bitmons_alive.Add(bitmon);
                            bitmon.setpocision(cont);
                            if (bitmon.Tipo == "Gofue")
                            {
                                gofue_nacidos_mes++;
                            }
                            if (bitmon.Tipo == "Taplan")
                            {
                                taplan_nacidos_mes++;
                            }
                            if (bitmon.Tipo == "Dorvalo")
                            {
                                dorvalo_nacidos_mes++;
                            }
                            if (bitmon.Tipo == "Wetar")
                            {
                                wetar_nacidos_mes++;
                            }
                            if (bitmon.Tipo == "Dorvalo")
                            {
                                dorvalo_nacidos_mes++;
                            }
                        }
                        else
                        {
                            bithalla.Add(bitmon);
                        }
                        break;
                    }

                    ++cont;
                }
            }
        }
예제 #4
0
        public MainForm()

        /* Este form equivale a la clase que se hace cargo de
         * armar el tablero, ubicar y mover a los bitmons.
         */
        {
            InitializeComponent();

            #region Setup
            Settings settings = new Settings();
            if (settings.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show("Iniciando simulacion");
            }


            // Tableros de más de 400 casillas empiezan a tener problemas al renderizarse.
            // El máximo recomendado es 20 para ambos parametros.
            rows = settings.filas;
            cols = settings.columnas;

            // Se define la probabilidad de cada tipo de terreno.
            // El 100% sería la suma de estos valores, puede ser 80 o 130 por ejemplo.
            int pasto_prob  = (int)(settings.pasto * 100);
            int volcan_prob = (int)(settings.volcan * 100);
            int agua_prob   = (int)(settings.agua * 100);
            int arena_prob  = (int)(settings.arena * 100);
            int nieve_prob  = (int)(settings.nieve * 100);
            // Tipos de terrenos
            string[] posibles_tipos = { "nieve", "agua", "pasto", "volcan", "arena" };

            // Se define la cantidad de bitmons iniciales
            int bitmons_initial_count = settings.bitmons;
            label_bitmons_vivos.Text   = $"Bitmons vivos: {bitmons_initial_count}";
            label_bitmons_muertos.Text = $"Bitmons muertos: {bithalla.Count}";

            // Tipos de bitmons
            string[] bitmonTypes = { "Gofue", "Wetar", "Taplan", "Dorvalo", "Ent", "Doti" };

            if (settings.velocidad == 0)
            {
                settings.velocidad = 1000;
            }
            timer_mes.Interval         = (int)(settings.velocidad); // duracion en milisegundos de cada mes
            meses_restantes            = settings.meses;            // cantidad de meses a simular
            label_meses_restantes.Text = $"Meses restantes: {meses_restantes}";
            label_mes_actual.Text      = "Mes actual: -";


            MapLayout.Controls.Clear();
            MapLayout.ColumnCount = cols;
            MapLayout.RowCount    = rows;
            MapLayout.Dock        = DockStyle.None;
            MapLayout.Padding     = new Padding(1, 1, 1, 1);


            // A continuación se arma el tablero
            // Primero se colocan los tipos de terreno
            for (int r = 0; r < rows; r++)
            {
                for (int c = 0; c < cols; c++)
                {
                    Casilla cas  = new Casilla();
                    int     dice = random.Next(volcan_prob + nieve_prob + agua_prob + pasto_prob + arena_prob);
                    if (dice < volcan_prob)
                    {
                        cas.BackgroundImage = BitmonLand.Properties.Resources.Volcan1;
                        cas.Tipo            = "volcan";
                    }
                    else if (dice < volcan_prob + agua_prob)
                    {
                        cas.BackgroundImage = BitmonLand.Properties.Resources.Agua1;
                        cas.Tipo            = "agua";
                    }
                    else if (dice < volcan_prob + agua_prob + arena_prob)
                    {
                        cas.BackgroundImage = BitmonLand.Properties.Resources.Arena1;
                        cas.Tipo            = "arena";
                    }
                    else if (dice < volcan_prob + arena_prob + agua_prob + nieve_prob)
                    {
                        cas.BackgroundImage = BitmonLand.Properties.Resources.Nieve1;
                        cas.Tipo            = "nieve";
                    }
                    else
                    {
                        cas.BackgroundImage = BitmonLand.Properties.Resources.Pasto1;
                        cas.Tipo            = "pasto";
                    }
                    cas.Margin = new Padding(0, 0, 0, 0);
                    cas.Dock   = DockStyle.Fill;

                    MapLayout.Controls.Add(cas, c, r);
                }
            }

            //definir posiciones de los bitmons iniciales, sin repetir posicion inicial
            List <int> posiciones_iniciales = new List <int>();
            for (int j = 0; j < bitmons_initial_count; j++)
            {
                int r_p = random.Next(cols * rows);
                while (posiciones_iniciales.Contains(r_p))
                {
                    r_p = random.Next(cols * rows);
                }
                posiciones_iniciales.Add(r_p);
            }

            // Luego se colocan los bitmons iniciales
            int contador = 0;
            foreach (Casilla c in MapLayout.Controls)
            {
                if (posiciones_iniciales.Contains(contador))
                {
                    string t = bitmonTypes.ElementAt(random.Next(bitmonTypes.Count()));
                    Bitmon b;
                    if (t == "Gofue")
                    {
                        b = new Gofue();
                    }
                    else if (t == "Wetar")
                    {
                        if (c.Tipo == "agua")
                        {
                            b = new Wetar();
                        }
                        else
                        {
                            b = new Gofue();
                            t = "Gofue";
                        }
                    }
                    else if (t == "Taplan")
                    {
                        b = new Taplan();
                    }
                    else if (t == "Dorvalo")
                    {
                        b = new Dorvalo();
                    }
                    else if (t == "Ent")
                    {
                        if (c.Tipo != "nieve" && c.Tipo != "volcan")
                        {
                            b = new Ent();
                        }
                        else
                        {
                            b = new Dorvalo();
                            t = "Dorvalo";
                        }
                    }
                    else
                    {
                        b = new Doti();
                    }
                    b.Tipo     = t;
                    b.Posicion = contador;
                    b.SizeMode = PictureBoxSizeMode.Zoom;
                    b.Size     = new Size((int)(600 / cols / 3), (int)(600 / cols / 3));
                    c.AddOcupante(b);
                    bitmons_alive.Add(b);
                }
                contador++;
            }
            #endregion

            timer_mes.Start();
        }
예제 #5
0
        private void timer_mes_Tick(object sender, EventArgs e)
        {
            if (mes_actual <= meses_restantes)
            {
                label_mes_actual.Text      = $"Mes actual: {mes_actual}";
                label_bitmons_vivos.Text   = $"Bitmons vivos: {bitmons_alive.Count}";
                label_bitmons_muertos.Text = $"Bitmons muertos: {bithalla.Count}";

                // recorrer bitmons_alive para mover a los wns.
                // Si los bitmons no se mueven, puede ser porque se quedan en una casilla nueva, en vez de la de maplayout.
                foreach (Bitmon bitmon in bitmons_alive)
                {
                    int     antigua_posicion = bitmon.Posicion;
                    Casilla antigua_casilla  = (Casilla)MapLayout.Controls[antigua_posicion];
                    int     nueva_posicion   = bitmon.Moverse(cols, rows);
                    Casilla nueva_casilla    = (Casilla)MapLayout.Controls[nueva_posicion];
                    if (nueva_casilla.ContarOcupantes < 2)
                    {
                        if (bitmon.Tipo == "Wetar")
                        {
                            if (nueva_casilla.Tipo == "agua")
                            {
                                nueva_casilla.AddOcupante(bitmon);
                                antigua_casilla.Ocupantes.Remove(bitmon);
                                bitmon.Posicion = nueva_posicion;
                            }
                            else
                            {
                                bitmon.Posicion = antigua_posicion;
                            }
                        }
                        else
                        {
                            nueva_casilla.AddOcupante(bitmon);
                            antigua_casilla.Ocupantes.Remove(bitmon);
                            bitmon.Posicion = nueva_posicion;
                        }
                    }
                    else
                    {
                        bitmon.Posicion = antigua_posicion;
                    }
                }

                // recorrer casillas del mapa para que interactuen los wns
                foreach (Casilla casilla in MapLayout.Controls)
                {
                    if (casilla.ContarOcupantes == 2)
                    {
                        Interactuar(casilla, casilla.Ocupantes[0], casilla.Ocupantes[1]);
                    }
                    foreach (Bitmon bitmon in casilla.Ocupantes)
                    {
                        casilla.Tipo = bitmon.InteractuarTerreno(casilla.Tipo);
                    }
                }

                if ((mes_actual % 3) == 0)
                {
                    PlantarUnArbol();
                }

                // Hay que revisar el tipo de interaccion
                // revisada
                // hola, voy a agregar todo lo necesario para que los bitmons no tengan juventud eterna
                foreach (Casilla casilla in MapLayout.Controls)
                {
                    for (int i = casilla.Ocupantes.Count - 1; i >= 0; --i)
                    {
                        try
                        {
                            Bitmon bitmon = casilla.Ocupantes[i];
                            bitmon.envejecer();
                            if (bitmon.gettrestante() >= bitmon.getTvida())
                            {
                                casilla.BorrarOcupante(bitmon);
                                bitmons_alive.Remove(bitmon);
                                bithalla.Add(bitmon);
                                bitmons_muertos_mes++;
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }
                }

                suma_nacido_mes_dorvalo += dorvalo_nacidos_mes;
                suma_nacido_mes_doti    += doti_nacidos_mes;
                suma_nacido_mes_ent     += ent_nacidos_mes;
                suma_nacido_mes_gofue   += gofue_nacidos_mes;
                suma_nacido_mes_taplan  += taplan_nacidos_mes;
                suma_nacido_mes_wetar   += wetar_nacidos_mes;
                suma_muertos_mes        += bitmons_muertos_mes;

                mes_actual++;

                gofue_nacidos_mes   = 0;
                taplan_nacidos_mes  = 0;
                wetar_nacidos_mes   = 0;
                ent_nacidos_mes     = 0;
                dorvalo_nacidos_mes = 0;
                doti_nacidos_mes    = 0;
                bitmons_muertos_mes = 0;
            }
            else
            {
                timer_mes.Stop();

                // calcular edad promedio de todos <<< Esto puede ser un OnCalcularPromedio, evento, lo que sea... que lo haga el modelo, todo este else
                int     doti_count          = 0;
                decimal edad_promedio_doti  = 0;
                decimal hijos_promedio_doti = 0;

                int     ent_count          = 0;
                decimal edad_promedio_ent  = 0;
                decimal hijos_promedio_ent = 0;

                int     dorvalo_count          = 0;
                decimal edad_promedio_dorvalo  = 0;
                decimal hijos_promedio_dorvalo = 0;

                int     taplan_count          = 0;
                decimal edad_promedio_taplan  = 0;
                decimal hijos_promedio_taplan = 0;

                int     gofue_count          = 0;
                decimal edad_promedio_gofue  = 0;
                decimal hijos_promedio_gofue = 0;

                int     wetar_count          = 0;
                decimal edad_promedio_wetar  = 0;
                decimal hijos_promedio_wetar = 0;

                foreach (Bitmon bitmon in bithalla)
                {
                    if (bitmon.Tipo == "Doti")
                    {
                        doti_count++;
                        edad_promedio_doti  += bitmon.getedad();
                        hijos_promedio_doti += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Ent")
                    {
                        ent_count++;
                        edad_promedio_ent  += bitmon.getedad();
                        hijos_promedio_ent += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Dorvalo")
                    {
                        dorvalo_count++;
                        edad_promedio_dorvalo  += bitmon.getedad();
                        hijos_promedio_dorvalo += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Taplan")
                    {
                        taplan_count++;
                        edad_promedio_taplan  += bitmon.getedad();
                        hijos_promedio_taplan += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Gofue")
                    {
                        gofue_count++;
                        edad_promedio_gofue  += bitmon.getedad();
                        hijos_promedio_gofue += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Wetar")
                    {
                        wetar_count++;
                        edad_promedio_wetar  += bitmon.getedad();
                        hijos_promedio_wetar += bitmon.getCantHijos();
                    }
                }

                // 7
                estadisticas.BithalaCantidadBitmonsEspecie = new Dictionary <string, int>()
                {
                    { "Gofue", gofue_count },
                    { "Taplan", taplan_count },
                    { "Doti", doti_count },
                    { "Ent", ent_count },
                    { "Dorvalo", dorvalo_count },
                    { "Wetar", wetar_count }
                };

                foreach (Bitmon bitmon in bitmons_alive)
                {
                    if (bitmon.Tipo == "Doti")
                    {
                        doti_count++;
                        edad_promedio_doti  += bitmon.getedad();
                        hijos_promedio_doti += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Ent")
                    {
                        ent_count++;
                        edad_promedio_ent  += bitmon.getedad();
                        hijos_promedio_ent += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Dorvalo")
                    {
                        dorvalo_count++;
                        edad_promedio_dorvalo  += bitmon.getedad();
                        hijos_promedio_dorvalo += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Taplan")
                    {
                        taplan_count++;
                        edad_promedio_taplan  += bitmon.getedad();
                        hijos_promedio_taplan += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Gofue")
                    {
                        gofue_count++;
                        edad_promedio_gofue  += bitmon.getedad();
                        hijos_promedio_gofue += bitmon.getCantHijos();
                    }
                    else if (bitmon.Tipo == "Wetar")
                    {
                        wetar_count++;
                        edad_promedio_wetar  += bitmon.getedad();
                        hijos_promedio_wetar += bitmon.getCantHijos();
                    }
                }

                if (doti_count > 0)
                {
                    edad_promedio_doti  = edad_promedio_doti / doti_count;
                    hijos_promedio_doti = hijos_promedio_doti / doti_count;
                }
                if (ent_count > 0)
                {
                    edad_promedio_ent  = edad_promedio_ent / ent_count;
                    hijos_promedio_ent = hijos_promedio_ent / ent_count;
                }
                if (gofue_count > 0)
                {
                    edad_promedio_gofue  = edad_promedio_gofue / gofue_count;
                    hijos_promedio_gofue = hijos_promedio_gofue / gofue_count;
                }
                if (taplan_count > 0)
                {
                    edad_promedio_taplan  = edad_promedio_taplan / taplan_count;
                    hijos_promedio_taplan = hijos_promedio_taplan / taplan_count;
                }
                if (wetar_count > 0)
                {
                    edad_promedio_wetar  = edad_promedio_wetar / wetar_count;
                    hijos_promedio_wetar = hijos_promedio_wetar / wetar_count;
                }
                if (dorvalo_count > 0)
                {
                    edad_promedio_dorvalo  = edad_promedio_dorvalo / dorvalo_count;
                    hijos_promedio_dorvalo = hijos_promedio_dorvalo / dorvalo_count;
                }

                // 1
                estadisticas.TiempoVidaPromedio = Math.Round(
                    (edad_promedio_dorvalo * dorvalo_count +
                     edad_promedio_doti * doti_count +
                     edad_promedio_ent * ent_count +
                     edad_promedio_gofue * gofue_count +
                     edad_promedio_taplan * taplan_count +
                     edad_promedio_wetar * wetar_count) /
                    (dorvalo_count + doti_count + ent_count + gofue_count + taplan_count + wetar_count), 2);

                int decimales_estadistica = 4;
                // 2
                estadisticas.TiempoVidaPromedioEspecie = new Dictionary <string, decimal>()
                {
                    { "Gofue", Math.Round(edad_promedio_gofue, decimales_estadistica) },
                    { "Taplan", Math.Round(edad_promedio_taplan, decimales_estadistica) },
                    { "Doti", Math.Round(edad_promedio_doti, decimales_estadistica) },
                    { "Ent", Math.Round(edad_promedio_ent, decimales_estadistica) },
                    { "Dorvalo", Math.Round(edad_promedio_dorvalo, decimales_estadistica) },
                    { "Wetar", Math.Round(edad_promedio_wetar, decimales_estadistica) }
                };

                // 3
                estadisticas.TasaBrutaNatalidadEspecie = new Dictionary <string, decimal>()
                {
                    { "Gofue", Math.Round(suma_nacido_mes_gofue / meses_restantes, decimales_estadistica) },
                    { "Taplan", Math.Round(suma_nacido_mes_taplan / meses_restantes, decimales_estadistica) },
                    { "Doti", Math.Round(suma_nacido_mes_doti / meses_restantes, decimales_estadistica) },
                    { "Ent", Math.Round(suma_nacido_mes_ent / meses_restantes, decimales_estadistica) },
                    { "Dorvalo", Math.Round(suma_nacido_mes_dorvalo / meses_restantes, decimales_estadistica) },
                    { "Wetar", Math.Round(suma_nacido_mes_wetar / meses_restantes, decimales_estadistica) }
                };

                // 4
                estadisticas.TasaBrutaMortalidad = Math.Round(suma_muertos_mes / meses_restantes, 2);

                // 5
                estadisticas.CantidadHijosPromedioEspecie = new Dictionary <string, decimal>()
                {
                    { "Gofue", Math.Round(hijos_promedio_gofue, decimales_estadistica) },
                    { "Taplan", Math.Round(hijos_promedio_taplan, decimales_estadistica) },
                    { "Doti", Math.Round(hijos_promedio_doti, decimales_estadistica) },
                    { "Ent", Math.Round(hijos_promedio_ent, decimales_estadistica) },
                    { "Dorvalo", Math.Round(hijos_promedio_dorvalo, decimales_estadistica) },
                    { "Wetar", Math.Round(hijos_promedio_wetar, decimales_estadistica) }
                };

                // 6
                List <string> especies_extintas = new List <string>()
                {
                    "Gofue", "Taplan", "Doti", "Ent", "Dorvalo", "Wetar"
                };
                foreach (Bitmon b in bitmons_alive)
                {
                    if (especies_extintas.Contains(b.Tipo))
                    {
                        especies_extintas.Remove(b.Tipo);
                    }
                }
                estadisticas.EspeciesExtintas = especies_extintas;


                button_ver_estadisticas.Visible = true;
            }
        }