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();
        }
Ejemplo n.º 2
0
        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();
        }