Juego de la serpiente

Serie de puntos que se crean y borran para avanzar.

  • Clase Anillo
public class Anillo
{
    private const int X_LIM = 110;
    private const int Y_LIM = 25;
    private int x;
    private int y;
    public char id;
 
    public Anillo(int x, int y, char id)
    {
        this.x = x % (X_LIM + 1);
        this.y = y % (Y_LIM + 1);
        this.id = id;
    }
 
    public Anillo(int x, int y) : this(x, y, '*') { }
 
    // Constructor Copia
    public Anillo(Anillo orig) : this(orig.x, orig.y, orig.id) { }
 
    public int GetX()
    {
	    return x;
    }
    
    public int GetY()
    {
        return y;
    }
 
    public Anillo Norte()
    {
        if (y == 0)
            y = Y_LIM;
        else
            y--;
        return this;
    }
    
    public Anillo Sur()
    {
        if (y == Y_LIM)
            y = 0;
        else
            y++;
        return this;
    }
 
    public Anillo Oeste()
    {
        if (x == 0)
            x = X_LIM;
        else
            x--;
        return this;
    }
 
    public Anillo Este()
    {
        if (x == X_LIM)
            x = 0;
        else
            x++;
        return this;
    }
    
    public void Mostrar()
    {
        Imprimir(id);
    }
    
    public void Ocultar()
    {
        Imprimir(' ');
    }
    
    private void Imprimir(char ch)
    {
        Console.SetCursorPosition(x, y);
        Console.Write(ch);
        Console.SetCursorPosition(0, 0);
    }
}
  • Atributo Dirección
enum Direccion
{
    Norte, Sur, Este, Oeste
}
  • Clase Serpiente
internal class Serpiente
{
    private LinkedList<Anillo> anillos;
    public Direccion direccion = Direccion.Este;
    private bool yaMostrado = false;
 
    public Serpiente()
    {
        anillos = new LinkedList<Anillo>();
        anillos.AddLast(new Anillo(10, 12, 'o'));
        anillos.AddLast(new Anillo(9, 12));
        anillos.AddLast(new Anillo(8, 12));
        anillos.AddLast(new Anillo(7, 12));
        anillos.AddLast(new Anillo(6, 12));
        anillos.AddLast(new Anillo(5, 12));
        //anillos.AddFirst(new Anillo(5, 12));
        //anillos.AddFirst(new Anillo(6, 12));
        //anillos.AddFirst(new Anillo(7, 12));
        //anillos.AddFirst(new Anillo(8, 12));
        //anillos.AddFirst(new Anillo(9, 12));
        //anillos.AddFirst(new Anillo(10, 12, 'o'));
    }
 
    private Anillo Cabeza() { return anillos.First(); }
    private Anillo Cola() { return anillos.Last(); }
    public void Crecer()
    {
        if (yaMostrado)
        {
            Anillo nuevaCabeza = new Anillo(Cabeza());
            Cabeza().id = '*';
            Cabeza().Mostrar();
            anillos.AddFirst(nuevaCabeza);
 
            switch (direccion)
            {
                case Direccion.Norte:
                    nuevaCabeza.Norte();
                    break;
                case Direccion.Sur:
                    nuevaCabeza.Sur();
                    break;
                case Direccion.Este:
                    nuevaCabeza.Este();
                    break;
                case Direccion.Oeste:
                    nuevaCabeza.Oeste();
                    break;
            }
            nuevaCabeza.Mostrar();
        }
    }
 
    public void Avanzar()
    {
        Cola().Ocultar();
        anillos.RemoveLast();
        Crecer();
    }
    
    public void Mostrar()
    {
        if (!yaMostrado)
        {
            foreach (Anillo anillo in anillos)
                anillo.Mostrar();
            yaMostrado = true;
        }
    }
}
  • Clase Main
internal class Program
{
    static void Main(string[] args)
    {
        PruebaSerpiente();
    }
 
    private static void PruebaSerpiente()
    {
        ConsoleKeyInfo pulsado;
        // Inicializar objeto llamado Shai Hulud, gusanos gigantes de "Dune"
        Serpiente shai_hulud = new Serpiente();
        shai_hulud.Mostrar();
        
        while ((pulsado = Console.ReadKey()).Key != ConsoleKey.Escape)
        {
            switch (pulsado.Key)
            {
                case ConsoleKey.RightArrow:
                    shai_hulud.direccion = Direccion.Este;
                    break;
                case ConsoleKey.LeftArrow:
                    shai_hulud.direccion = Direccion.Oeste;
                    break;
                case ConsoleKey.UpArrow:
                    shai_hulud.direccion = Direccion.Norte;
                    break;
                case ConsoleKey.DownArrow:
                    shai_hulud.direccion = Direccion.Sur;
                    break;
            }
            if (pulsado.Key == ConsoleKey.Spacebar)
                shai_hulud.Crecer();
            else
                shai_hulud.Avanzar();
        }
        Console.WriteLine("FIN");
    }
}