/// <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]; } }
/// <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); } }
/// <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); } }