C # creando un juego de serpiente simple


12

Estaba pensando en crear un juego de serpientes con C #, así que tuve ideas en mi cabeza y surgieron algunos problemas.

¿Cómo puedo rastrear y generar en la ubicación correcta los bloques que se ejecutan después de la cabeza de la serpiente?

Si la serpiente está construida con cinco bloques y el usuario comienza a ir en círculo, ¿cómo puedo imprimir el cuerpo de la serpiente en la ubicación correcta?

Además, ¿cómo puedo crear una acción que se ejecutará en segundo plano, que moverá la serpiente hacia adelante, sin importar lo que haga el usuario?

¿Qué estructura debe tener mi código? (estructura de diseño del código)

Esta debería ser una aplicación de consola, ya que es el único marco con el que estoy familiarizado.

No estoy buscando el código terminado, ya que realmente quiero entender cómo debería funcionar.

Respuestas:


23

Representando a la serpiente

Crear un juego de Snake es bastante simple. Lo primero que necesita es una forma de representar el cuerpo de su serpiente. Si considera que su serpiente está compuesta de bloques o fichas, su cuerpo puede ser simplemente una lista de las coordenadas de estos bloques.

En su caso, si intenta hacer una aplicación de consola, cada uno de estos será un carácter en la consola y la posición correspondería a una línea o fila de la salida de la consola. Entonces comienzas con esto:

// List of 2D coordinates that make up the body of the snake
List<Point>() body = new List<Point>();

En este punto, su lista está vacía, por lo que su serpiente no tiene cuerpo. Digamos que quieres una serpiente de longitud 5 y la cabeza debe comenzar en posición (5,2) y crecer hacia la parte inferior. Simplemente agregue esas posiciones a la lista cuando comience el juego, por ejemplo:

// Initialize the snake with 5 blocks starting downwards from (5,2)
for(int i=0; i<5; ++i)
{
    body.Add(new Point(5, 2 + i));
}

Renderizando la serpiente

Para renderizar solo dibuje un carácter en cada posición en la lista del cuerpo. El ejemplo anterior, por ejemplo, podría dibujarse como:

...................
...................
.....O............. -- y = 2
.....#.............
.....#.............
.....#.............
.....V.............
...................
     |
     x = 5

Puede ser más complicado eligiendo diferentes personajes para la cabeza del personaje (primer elemento de la lista) y la cola (último elemento de la lista) e incluso orientarlos según las posiciones de los bloques adyacentes. Pero para empezar, solo renderiza todo como #ao algo.

Por ejemplo, podría comenzar con una matriz de caracteres 2D que contiene el fondo de esta manera:

// Array with map characters
char[,] render = new char[width, height];

// Fill with background
for(x=0; x<width; ++x)
    for(y=0; y<height; ++y)
        render[x,y] = '.';

Y luego iterar sobre el cuerpo de la serpiente dibujándolo a la matriz:

// Render snake
foreach(Point point in body)
    render[point.X, point.Y] = '#';

Y finalmente repita la matriz nuevamente y escriba cada carácter en la consola, con un salto de línea al final de cada fila.

// Render to console
for(y=0; y<height; ++y)
{
    for(x=0; x<width; ++x)
    {
        Console.Write(render[x,y]);
    }
    Console.WriteLine();
}

Moviendo la serpiente

Finalmente, movimiento. Lo primero que necesita es hacer un seguimiento de Directionla serpiente en movimiento. Esto puede ser una enumeración simple:

// Enum to store the direction the snake is moving
enum Direction { Left, Right, Up, Down }

Y el acto de mover la serpiente se puede hacer simplemente eliminando el último bloque de la lista y agregándolo al frente, en la dirección correcta . En otras palabras, algo como:

// Remove tail from body
body.RemoveAt(body.Count - 1);

// Get head position
Point next = body[0];

// Calculate where the head should be next based on the snake's direction
if(direction == Direction.Left) 
    next = new Point(next.X-1, next.Y);
if(direction == Direction.Right) 
    next = new Point(next.X+1, next.Y);
if(direction == Direction.Up) 
    next = new Point(next.X, next.Y-1);
if(direction == Direction.Down) 
    next = new Point(next.X, next.Y+1);

// Insert new head into the snake's body
body.Insert(0, next);

55
¡Buena decisión al mover el último bloque al frente para moverse!
SpartanDonut

Gran respuesta. Me encanta cómo mueves la serpiente, es bastante elegante.
Cypher

-3
  1. Cada vez que un temporizador marca, actualiza la ubicación de la serpiente y dibuja las formas en las nuevas ubicaciones.

  2. Use un System.Windows.Forms.Timer para la acción de fondo para activar el juego para mover la serpiente.

  3. Usar clases y herencia para la estructura.


Esta es una respuesta muy vaga. El paso número tres es especialmente así.
MichaelHouse
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.