Exemple #1
0
 /// <summary>
 /// Rellena un char[,] con la serpiente de parámetro
 /// </summary>
 /// <param name="array"></param>
 /// <param name="serpiente"></param>
 private void rellenarArrayConSerpiente(char[,] array, Sierpe serpiente)
 {
     for (int i = 0; i < serpiente.Serpiente.Count; i++)
     {
         array[serpiente.Serpiente[i].Y, serpiente.Serpiente[i].X] = serpiente.SerpienteDibujo[i];
     }
 }
Exemple #2
0
        /// <summary>
        /// Comienza la partida y controla su flujo
        /// </summary>
        private void comenzarPartida()
        {
            // Se crean las instancias necesarias para la partida
            tablero          = new char[altoTablero, anchoTablero];
            puntos           = 0;
            hayManzana       = false;
            generaManzanas   = new Random();
            direccionElegida = Direccion.Izquierda;

            sierpe        = new Sierpe(anchoTablero, altoTablero, direccionElegida, (beanOpciones.SacaLengua ? beanOpciones.FrecuenciaSacaLengua : 0), beanOpciones.EsGorda);
            partidaGanada = false;


            while (true)
            {
                // Se limpia el array anterior
                Array.Clear(tablero, 0, tablero.Length);

                // Se pone una nueva manzana si no hay
                if (!hayManzana)
                {
                    // Antes de generarla se comprueba si hay espacio
                    // (si no lo hay, es que la partida ha finalizado)
                    if (sierpe.Serpiente.Count >= anchoTablero * altoTablero)
                    {
                        partidaGanada = true;
                        partidaFinalizada();
                        return;
                    }
                    while (true)
                    {
                        // Genera un punto aleatorio en el tablero de juego
                        int xManzana = generaManzanas.Next(anchoTablero);
                        int yManzana = generaManzanas.Next(altoTablero);

                        // Compara el punto generado con el cuerpo de la serpiente
                        // (así no se generará una manzana sobre la serpiente)
                        nuevaManzana = new Punto(xManzana, yManzana);
                        if (!sierpe.Serpiente.Contains(nuevaManzana))
                        {
                            hayManzana = true;
                            break;
                        }
                    }
                }

                // Lee la última tecla pulsada
                if (Console.KeyAvailable)
                {
                    switch (Console.ReadKey(true).Key)
                    {
                    case ConsoleKey.UpArrow:
                        direccionElegida = Direccion.Arriba;
                        break;

                    case ConsoleKey.RightArrow:
                        direccionElegida = Direccion.Derecha;
                        break;

                    case ConsoleKey.DownArrow:
                        direccionElegida = Direccion.Abajo;
                        break;

                    case ConsoleKey.LeftArrow:
                        direccionElegida = Direccion.Izquierda;
                        break;

                    case ConsoleKey.P:
                        ag.dibujarPausa(puntos, tablero);
                        while (true)
                        {
                            if (Console.ReadKey(true).Key == ConsoleKey.P)
                            {
                                break;
                            }
                        }
                        break;
                    }
                }

                // Confirma la posición de la cabeza en el siguiente movimiento
                // (en la serpiente se ignorará si se le pasa una dirección
                // opuesta a la que tiene actualmente)
                Punto nuevaCabeza = sierpe.confirmarDireccion(direccionElegida);

                // Si la nueva posición de la cabeza  es una manzana
                if (nuevaCabeza.Equals(nuevaManzana))
                {
                    sierpe.crecer();
                    hayManzana = false;
                    puntos    += 50;
                    // Si la manzana es la nota musical, sonará un tono
                    if (beanOpciones.IndiceManzana == 5)
                    {
                        new Thread(() => Console.Beep(554, 300)).Start();
                    }
                }
                // Si la serpiente ha chocado
                else if (serpienteChoca(nuevaCabeza))
                {
                    // Se activa penalización si está en modo fácil,
                    // si no, game over
                    if (muertePorAutofagiaEnModoFacil)
                    {
                        sierpe.autofagia();
                    }
                    else
                    {
                        partidaFinalizada();
                        return;
                    }
                }
                // Si no hay ningún evento, se mueve normalmente
                else
                {
                    sierpe.mover();
                }

                // Se asignan la manzana y la serpiente al array
                // y se deja lo demás vacío
                tablero[nuevaManzana.Y, nuevaManzana.X] = arrayManzana[beanOpciones.IndiceManzana];
                rellenarArrayConSerpiente(tablero, sierpe);

                ag.dibujarFrame(puntos, tablero);

                if (tiempoDinamico > 0)
                {
                    tiempoDinamico--;
                }
                Thread.Sleep(tiempoBase + tiempoDinamico);
            }
        }
Exemple #3
0
        /// <summary>
        /// Controla la pantalla de opciones
        /// </summary>
        private void opciones()
        {
            // Marcador de opción y minitablero para serpiente de muestra
            int marcador = 0;

            char[,] tableroOpciones = new char[5, 5];

            // Se cargan las opciones en el bean para modificar sobre la marcha
            BeanOpciones opcionesTemp = new BeanOpciones();

            opcionesTemp.EsGorda              = beanOpciones.EsGorda;
            opcionesTemp.SacaLengua           = beanOpciones.SacaLengua;
            opcionesTemp.FrecuenciaSacaLengua = beanOpciones.FrecuenciaSacaLengua;
            opcionesTemp.Manzana              = arrayManzana[beanOpciones.IndiceManzana];
            opcionesTemp.IndiceManzana        = beanOpciones.IndiceManzana;

            // Se instancia la serpiente de muestra
            Sierpe serpienteDeLasOpciones = new Sierpe(5, 5, Direccion.Izquierda, (opcionesTemp.SacaLengua ? opcionesTemp.FrecuenciaSacaLengua : 0), opcionesTemp.EsGorda);

            serpienteDeLasOpciones.prepararParaOpciones();

            while (true)
            {
                // Para que la interfaz responda mejor, se actualiza la lectura de
                // tecla cada 30ms pero se mueve la serpiente cada 300
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep(30);
                    if (Console.KeyAvailable)
                    {
                        ConsoleKey k = Console.ReadKey(true).Key;

                        switch (k)
                        {
                        case ConsoleKey.UpArrow:
                            if (marcador > 0)
                            {
                                marcador--;
                            }
                            break;

                        case ConsoleKey.DownArrow:
                            if (marcador < 5)
                            {
                                marcador++;
                            }
                            break;

                        case ConsoleKey.RightArrow:
                            if (marcador == 0 && !opcionesTemp.EsGorda)
                            {
                                opcionesTemp.EsGorda = true;
                            }
                            else if (marcador == 1 && opcionesTemp.SacaLengua)
                            {
                                opcionesTemp.SacaLengua = false;
                            }
                            else if (marcador == 2 && opcionesTemp.FrecuenciaSacaLengua < 100)
                            {
                                opcionesTemp.FrecuenciaSacaLengua += 5;
                            }
                            else if (marcador == 3 && opcionesTemp.IndiceManzana < arrayManzana.Length - 1)
                            {
                                opcionesTemp.IndiceManzana++;
                                opcionesTemp.Manzana = arrayManzana[opcionesTemp.IndiceManzana];
                            }
                            break;

                        case ConsoleKey.LeftArrow:
                            if (marcador == 0 && opcionesTemp.EsGorda)
                            {
                                opcionesTemp.EsGorda = false;
                            }
                            else if (marcador == 1 && !opcionesTemp.SacaLengua)
                            {
                                opcionesTemp.SacaLengua = true;
                            }
                            else if (marcador == 2 && opcionesTemp.FrecuenciaSacaLengua > 0)
                            {
                                opcionesTemp.FrecuenciaSacaLengua -= 5;
                            }
                            else if (marcador == 3 && opcionesTemp.IndiceManzana > 0)
                            {
                                opcionesTemp.IndiceManzana--;
                                opcionesTemp.Manzana = arrayManzana[opcionesTemp.IndiceManzana];
                            }
                            break;

                        case ConsoleKey.Enter:
                            if (marcador == 4)
                            {
                                // Se guardan las opciones en el modelo
                                modelo.guardaOpciones(opcionesTemp);
                                beanOpciones = modelo.getOpciones();
                                return;
                            }
                            else if (marcador == 5)
                            {
                                return;
                            }
                            break;

                        case ConsoleKey.Escape:
                            return;
                        }

                        // Se actualizan los parámetros de la serpiente
                        serpienteDeLasOpciones.cambiarParametrosParaOpciones(opcionesTemp.SacaLengua ? opcionesTemp.FrecuenciaSacaLengua : 0, opcionesTemp.EsGorda);


                        // Se limpia el array y se rellena
                        Array.Clear(tableroOpciones, 0, tableroOpciones.Length);
                        rellenarArrayConSerpiente(tableroOpciones, serpienteDeLasOpciones);

                        // Se dibuja en pantalla y se espera
                        ag.pantallaOpciones(marcador, tableroOpciones, opcionesTemp);
                    }
                }

                // Código copiado vilmente para evitar modularización innecesaria
                // (la única diferencia es el segundo comando)

                // Se actualizan los parámetros de la serpiente y se mueve
                serpienteDeLasOpciones.cambiarParametrosParaOpciones(opcionesTemp.SacaLengua ? opcionesTemp.FrecuenciaSacaLengua : 0, opcionesTemp.EsGorda);
                serpienteDeLasOpciones.moverParaOpciones();

                // Se limpia el array y se rellena
                Array.Clear(tableroOpciones, 0, tableroOpciones.Length);
                rellenarArrayConSerpiente(tableroOpciones, serpienteDeLasOpciones);

                // Se dibuja en pantalla y se espera
                ag.pantallaOpciones(marcador, tableroOpciones, opcionesTemp);
            }
        }