C # Erstellen eines einfachen Snake-Spiels

12

Ich habe darüber nachgedacht, ein Snake-Spiel mit C # zu erstellen, also habe ich mir Gedanken gemacht, und es sind einige Probleme aufgetaucht.

Wie kann ich die Blöcke, die nach dem Kopf der Schlange verlaufen, verfolgen und an der richtigen Stelle ausgeben?

Wenn die Schlange aus fünf Blöcken besteht und der Benutzer beginnt, sich in einem Kreis zu bewegen, wie kann ich den Schlangenkörper an der richtigen Stelle ausdrucken?

Wie kann ich eine Aktion erstellen, die im Hintergrund ausgeführt wird und die die Schlange vorwärts bewegt, unabhängig davon, was der Benutzer tut?

Welche Struktur sollte mein Code haben? (Code-Design-Struktur)

Dies sollte eine Konsolenanwendung sein, da dies das einzige Framework ist, mit dem ich vertraut bin.

Ich suche keinen fertigen Code, da ich wirklich verstehen möchte, wie es funktionieren soll.

Novak
quelle

Antworten:

23

Darstellung der Schlange

Das Erstellen eines Snake-Spiels ist ziemlich einfach. Das erste, was Sie brauchen, ist eine Möglichkeit, den Körper Ihrer Schlange darzustellen . Wenn Sie glauben, dass Ihre Schlange aus Blöcken oder Kacheln besteht, kann Ihr Körper einfach eine Liste dieser Blockkoordinaten sein.

Wenn Sie beabsichtigen, eine Konsolenanwendung auszuführen, ist in Ihrem Fall jedes dieser Zeichen ein Zeichen auf der Konsole, und die Position entspricht einer Zeile oder Zeile der Konsolenausgabe. Also fängst du damit an:

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

Zu diesem Zeitpunkt ist Ihre Liste leer, sodass Ihre Schlange keinen Körper hat. Angenommen, Sie möchten eine Schlange der Länge 5 und der Kopf sollte in Position (5,2) beginnen und nach unten wachsen. Fügen Sie diese Positionen einfach zu Beginn des Spiels zur Liste hinzu, zum Beispiel:

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

Die Schlange rendern

Zeichnen Sie zum Rendern einfach an jeder Stelle der Textliste ein Zeichen. Das obige Beispiel könnte zum Beispiel wie folgt gezeichnet werden:

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

Sie können komplizierter werden, indem Sie unterschiedliche Zeichen für den Kopf (erstes Element in der Liste) und den Schwanz (letztes Element in der Liste) des Zeichens auswählen und sie sogar in Abhängigkeit von den Positionen der benachbarten Blöcke ausrichten. Aber für den Anfang rendern Sie einfach alles als ein #oder etwas.

Sie könnten beispielsweise mit einem 2D-Zeichen-Array beginnen, das den folgenden Hintergrund enthält:

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

Und dann iteriere über den Körper der Schlange und ziehe ihn in das Array:

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

Zum Schluss iterieren Sie noch einmal über das Array und schreiben jedes Zeichen mit einem Zeilenumbruch am Ende jeder Zeile in die Konsole.

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

Die Schlange bewegen

Endlich Bewegung. Das erste, was Sie brauchen, ist, die DirectionBewegung der Schlange im Auge zu behalten . Dies kann eine einfache Aufzählung sein:

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

Um die Schlange zu bewegen, entfernen Sie einfach den letzten Block aus der Liste und fügen ihn in die richtige Richtung auf der Vorderseite ein . Mit anderen Worten so etwas wie:

// 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
quelle
5
Guter Ruf beim Verschieben des letzten Blocks nach vorne zur Bewegung!
SpartanDonut
Gute Antwort. Ich liebe es, wie du die Schlange bewegst - sie ist ziemlich elegant.
Cypher
-3
  1. Jedes Mal, wenn ein Timer anklickt, aktualisieren Sie die Position der Schlange und zeichnen die Formen an den neuen Positionen

  2. Verwenden Sie einen System.Windows.Forms.Timer für die Hintergrundaktion, um das Spiel zum Bewegen der Schlange auszulösen.

  3. Verwenden Sie Klassen und Vererbung für die Struktur

Adam Bruss
quelle
Dies ist eine sehr vage Antwort. Schritt Nummer drei ist dies besonders.
MichaelHouse