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; } } }
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(); }