public BotonDificultad(Dificultad diff) { this.diff = diff; InitializeComponent(); boton.Size = Size = new Size(110, 110); boton.Text = diff.ToString(); switch (diff) { case Dificultad.Facil: boton.BackColor = Color.LightSeaGreen; break; case Dificultad.Medio: boton.BackColor = Color.LightGoldenrodYellow; break; case Dificultad.Dificil: boton.BackColor = Color.OrangeRed; break; } boton.Click += (_, e) => InvokeOnClick(this, e); Click += (_, __) => abrirCrucigrama(); }
public Crossword(Dificultad diff) { Text = string.Format("Crucigrama ({0})", diff.ToString()); MessageBox.Show("Utilice las teclas 2, 4, 6 y 8 para moverse por el crucigrama. La casilla seleccionada se tornará azul."); InitializeComponent(); foreach (string s in File.ReadAllLines(@"Palabras.txt")) { if (s.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Length != 2) { continue; } string word = s.Split('|')[0]; string def = s.Split('|')[1]; if (!palabras.ContainsKey(word)) { palabras.Add(word.ToUpper(), def); } } if (palabras.Count == 0) { MessageBox.Show("No se han cargado palabras para mostrar en el crucigrama."); Close(); } Random rng = new Random(); int numPalabras = 1; int limitePalabras = 0; switch (diff) { case Dificultad.Facil: limitePalabras = 5; break; case Dificultad.Medio: limitePalabras = 7; break; case Dificultad.Dificil: limitePalabras = rng.Next(10, 21); break; } while (numPalabras <= limitePalabras) { string palabra = palabras.Keys.Skip(rng.Next(palabras.Count - 1)).First(); if (casillas.Width == 0) // Primera palabra { añadirPalabra(palabra, new Coordenada(0, 0), 0, rng.Next(2) == 0 ? Orientacion.Horizontal : Orientacion.Vertical, numPalabras++); } else { var entradas = new SortedList <int, Dictionary <LetraCrucigrama, Orientacion> >(); for (int i = 0; i < palabra.Length; i++) { var entradasPorIndice = casillas.Entradas.Where(ent => ent.Value.Letra.Letra == palabra[i]); if (!entradasPorIndice.Any()) { continue; } var entradasValidas = new Dictionary <LetraCrucigrama, Orientacion>(); foreach (var ent in entradasPorIndice) { Orientacion orien; if ((orien = esLibreParaNuevaPalabra(ent.Key, palabra, i)) != 0) { entradasValidas.Add(ent.Value, orien); } } if (entradasValidas.Any()) { entradas.Add(i, entradasValidas); } } if (entradas.Count == 0) { continue; } int indiceInterseccion = entradas.Keys.ToArray()[rng.Next(entradas.Count)]; Coordenada puntoIntersec = entradas[indiceInterseccion].Keys.ToArray()[rng.Next(entradas[indiceInterseccion].Count)].Coordenada; añadirPalabra(palabra, puntoIntersec, indiceInterseccion, esLibreParaNuevaPalabra(puntoIntersec, palabra, indiceInterseccion), numPalabras++); } } foreach (var entrada in casillas.Entradas) { entrada.Value.KeyDown += moverCursor; entrada.Value.LetraActualizada += verificarPalabra; entrada.Value.ActualizarSeleccion += (nuevaSeleccion) => seleccionado = nuevaSeleccion; Controls.Add(entrada.Value); } seleccionado = casillas.Entradas.First(ent => ent.Value.Letra.LetraInicial.Any(num => num.Key == 1)).Key; casillas[seleccionado].Select(); if (horizontales.Any()) { label1.Text += "Horizontales:\n"; foreach (var palabra in horizontales) { label1.Text += string.Format("{0}: {1}\n", palabra.Key, palabra.Value); } } if (horizontales.Any() && verticales.Any()) { label1.Text += '\n'; } if (verticales.Any()) { label1.Text += "Verticales:\n"; foreach (var palabra in verticales) { label1.Text += string.Format("{0}: {1}\n", palabra.Key, palabra.Value); } } label1.Location = new System.Drawing.Point(casillas.ColumnaFin * 20 + 60, 15); Size = new System.Drawing.Size(label1.Width + label1.Location.X + 15, Math.Max(label1.Height + 80, casillas.Height * 20 + 70)); Focus(); }