martes, 31 de mayo de 2016

Juego Snake en aplicación de consola (I). Definiendo la pantalla.

Códigos de muestra - Ejemplos MSDN. Juego Snake en aplicación de consola

Como no todo va a ser trabajar hoy voy a mostrar cómo podemos desarrollar el clásico juego de la serpiente (Snake) en una simple aplicación de consola.

Pantalla de Snake

Así que para empezar abriremos el Visual Studio y crearemos una nueva aplicación de consola llamada Snake y crearemos una enumeración Direction para establecer las cuatro direcciones posibles que puede tomar nuestra serpiente en el archivo de código que Visual Studio crea por defecto en la aplicación (Program.cs/Module1.vb):

    internal enum Direction
    {
        Down, Left, Right, Up
    }
    Friend Enum Direction
        Down
        Left
        Rigth
        Up
    End Enum

A continuación definiremos las variables que mantendrán el estado de la aplicación y su estado inicial al inicio del método Main:

    var score = 0;
    var speed = 100;
    var foodPosition = Point.Empty;
    var screenSize = new Size(60, 20);
    var snake = new Queue<Point>();
    var snakeLength = 3;
    var currentPosition = new Point(0, 9);
    snake.Enqueue(currentPosition);
    var direction = Direction.Right;
    Dim score = 0
    Dim speed = 100
    Dim foodPosition = Point.Empty
    Dim screenSize As New Size(60, 20)
    Dim snake As New Queue(Of Point)
    Dim snakeLength = 3
    Dim currentPosition As New Point(0, 9)
    snake.Enqueue(currentPosition)
    Dim direction As Direction = Direction.Rigth


La variable score mantiene la puntuación.
La variable speed establece la velocidad a la que se moverá la serpiente, en concreto el número de milisegundos entre un movimiento y otro.
La variable foodPosition establece la posición en la que aparece la comida para la serpiente. Se inicializa a Point.Empty así que al inicializar la pantalla no se mostrará.
La variable screenSize establece el tamaño de la pantalla con un ancho de 60 posiciones y una altura de 20.
La variable snake mantendrá las diferentes posiciones ocupadas por la cola de la serpiente. Se crea como un objeto Queue que implementa una cola First In First Out. He elegido este tipo de objeto porque es el que más se ajusta al comportamiento de la serpiente: se van añadiendo las nuevas posiciones que ocupa la cabeza de la serpiente a la cola y, para ajustar la serpiente a una longitud, se eliminan las últimas de la cola, es decir, las primeras en añadirse.
La variable snakeLength establece la longitud inicial de la serpiente.
La variable currentPosition establece la posición actual de la cabeza de la serpiente.
Por último la variable direction establece la dirección en la que se moverá la serpiente.



Dibujar la pantalla


A continuación realizaré una llamada al método DrawScreen pasándole como argumento el tamaño de la pantalla definido en la variable screenSize.

Este método define la ventana con un tamaño dos posiciones superior al definido en screenSize, tanto en el ancho como en la altura. De esta forma podré establecer un borde de una posición alrededor de la pantalla de juego.

Esto lo hago por dos motivos principales. Uno, el poder utilizar la línea superior de la pantalla para mostrar la puntuación del juego, y dos, para no tener que escribir caracteres en la última línea de la pantalla. Evito esta última línea porque al escribir en la última línea la aplicación crea una nueva línea automáticamente y hace scroll.

Para establecer un borde blanco sin escribir en esta última línea lo que hago en el método DrawScreen es establecer el color de fondo blanco y llamar al método Clear del objeto Console de forma que toda la pantalla queda blanca. A continuación establezco el fondo negro y dibujo la superficie del juego escribiendo espacios en cada línea:

private static void DrawScreen(Size size)
{
    Console.Title = "Snake";
    Console.WindowHeight = size.Height + 2;
    Console.WindowWidth = size.Width + 2;
    Console.BufferHeight = Console.WindowHeight;
    Console.BufferWidth = Console.WindowWidth;
    Console.CursorVisible = false;
    Console.BackgroundColor = ConsoleColor.White;
    Console.Clear();

    Console.BackgroundColor = ConsoleColor.Black;
    for (int row = 0; row < size.Height; row++)
    {
        for (int col = 0; col < size.Width; col++)
        {
            Console.SetCursorPosition(col +1 , row + 1);
            Console.Write(" ");
        }
    }
}
Private Sub DrawScreen(screenSize As Size)
    Console.Title = "Snake"
    Console.WindowHeight = screenSize.Height + 2
    Console.WindowWidth = screenSize.Width + 2
    Console.BufferHeight = Console.WindowHeight
    Console.BufferWidth = Console.WindowWidth
    Console.CursorVisible = False
    Console.BackgroundColor = ConsoleColor.White
    Console.Clear()

    Console.BackgroundColor = ConsoleColor.Black
    For row As Integer = 0 To screenSize.Height -1
        For col As Integer = 0 To screenSize.Width -1
            Console.SetCursorPosition(col + 1, row + 1)
            Console.Write(" ")
        Next
    Next
End Sub

Para acabar de dibujar la pantalla llamaré al método ShowScore que se encargará de mostrar la puntuación actual en la primera línea de la pantalla, que ya hemos establecido como borde y que no formará parte de la superficie del juego.

private static void ShowScore(int score)
{
    Console.BackgroundColor = ConsoleColor.White;
    Console.ForegroundColor = ConsoleColor.Black;
    Console.SetCursorPosition(1, 0);
    Console.Write($"Puntuación: {score.ToString("00000000")}");
}
Private Sub ShowScore(score As Integer)
    Console.BackgroundColor = ConsoleColor.White
    Console.ForegroundColor = ConsoleColor.Black
    Console.SetCursorPosition(1, 0)
    Console.Write($"Puntuación: {score.ToString("00000000")}")
End Sub

Si ejecutamos la aplicación a estas alturas podremos ver la pantalla preparada para iniciar el juego:

Pantalla inicio del juego

En el siguiente artículo veremos cómo dibujar la serpiente y dotarla de movimiento para completar el juego.


Artículos siguientes:

Juego Snake en aplicación de consola (y II). La serpiente.


El código completo tanto en C# como en Visual Basic .NET está disponible en:

Códigos de muestra - Ejemplos MSDN. Juego Snake en aplicación de consola

No hay comentarios:

Publicar un comentario