C # créer un jeu de serpent simple

12

Je pensais à créer un jeu de serpent avec C #, alors j'ai eu des idées en tête et des problèmes sont survenus.

Comment puis-je suivre et sortir au bon endroit les blocs qui courent après la tête du serpent?

Si le serpent est composé de cinq blocs et que l'utilisateur commence à tourner en cercle, comment puis-je imprimer le corps du serpent au bon endroit?

De plus, comment puis-je créer une action qui s'exécutera en arrière-plan, qui fera avancer le serpent, quoi que fasse l'utilisateur?

Quelle structure doit avoir mon code? (structure de conception du code)

Cela devrait être une application console, car c'est le seul framework que je connaisse.

Je ne cherche pas de code fini, car je veux vraiment comprendre comment cela devrait fonctionner.

Novak
la source

Réponses:

23

Représenter le serpent

La création d'un jeu Snake est assez simple. La première chose dont vous avez besoin est un moyen de représenter le corps de votre serpent. Si vous considérez que votre serpent est composé de blocs ou de tuiles, votre corps peut simplement être une liste de ces coordonnées de blocs.

Dans votre cas, si vous avez l'intention de faire une application console, chacun d'entre eux sera un caractère sur la console, et la position correspondra à une ligne ou une ligne de la sortie de la console. Vous commencez donc par ceci:

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

À ce stade, votre liste est vide, donc votre serpent n'a pas de corps. Disons que vous voulez un serpent de longueur 5 et que la tête doit commencer en position (5,2) et pousser vers le bas. Ajoutez simplement ces positions à la liste au début du jeu, par exemple:

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

Rendre le serpent

Pour le rendu, dessinez simplement un caractère à chaque position de la liste des corps. Par exemple, l'exemple ci-dessus pourrait être dessiné comme suit:

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

Vous pouvez devenir plus compliqué en choisissant différents caractères pour la tête du personnage (premier élément de la liste) et la queue (dernier élément de la liste) et même les orienter en fonction de la position des blocs adjacents. Mais pour commencer, il suffit de tout rendre comme un #ou quelque chose.

Vous pouvez par exemple commencer avec un tableau de caractères 2D contenant l'arrière-plan comme ceci:

// 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] = '.';

Et puis parcourez le corps du serpent en le dessinant dans le tableau:

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

Enfin, parcourez à nouveau le tableau et écrivez chaque caractère dans la console, avec un saut de ligne à la fin de chaque ligne.

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

Déplacer le serpent

Enfin, le mouvement. La première chose dont vous avez besoin est de garder une trace du mouvement Directiondu serpent. Cela peut être une énumération simple:

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

Et l'acte de déplacer le serpent peut être fait simplement en supprimant le dernier bloc de la liste et en l'ajoutant sur le devant, dans la bonne direction . En d'autres termes, quelque chose comme:

// 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);
David Gouveia
la source
5
Bon appel au déplacement du dernier bloc vers l'avant pour le mouvement!
SpartanDonut
Très bonne réponse. J'adore la façon dont vous déplacez le serpent - c'est assez élégant.
Cypher
-3
  1. Chaque fois qu'un minuteur sonne, vous mettez à jour l'emplacement du serpent et dessinez les formes aux nouveaux emplacements

  2. Utilisez un System.Windows.Forms.Timer pour l'action d'arrière-plan pour déclencher le jeu pour déplacer le serpent.

  3. Utiliser des classes et l'héritage pour la structure

Adam Bruss
la source
Ceci est une réponse très vague. L'étape numéro trois l'est particulièrement.
MichaelHouse