C # tworząc prostą grę w węża

12

Myślałem o stworzeniu gry w węża z C #, więc wpadłem na pomysł w głowie i pojawiły się pewne problemy.

Jak mogę śledzić i wyprowadzać w prawidłowej lokalizacji bloki biegnące za głową węża?

Jeśli wąż jest zbudowany z pięciu bloków, a użytkownik zaczyna chodzić w kółko, jak mogę wydrukować ciało węża we właściwej lokalizacji?

Ponadto, jak mogę utworzyć akcję, która będzie działać w tle, która przesunie węża do przodu, bez względu na to, co zrobi użytkownik?

Jaką strukturę powinien mieć mój kod? (struktura projektu kodu)

To powinna być aplikacja konsolowa, ponieważ jest to jedyny znany mi framework.

Nie szukam gotowego kodu, ponieważ chcę naprawdę zrozumieć, jak powinien on działać.

Novak
źródło

Odpowiedzi:

23

Reprezentujący węża

Tworzenie gry Snake jest dość proste. Pierwszą rzeczą, której potrzebujesz, jest sposób na przedstawienie ciała twojego węża. Jeśli uważasz, że twój wąż składa się z bloków lub płytek, twoje ciało może być po prostu listą współrzędnych tych bloków.

W twoim przypadku, jeśli zamierzasz wykonać aplikację konsolową, każda z nich będzie znakiem na konsoli, a pozycja odpowiadałaby jednej linii lub wierszowi wyniku konsoli. Więc zacznij od tego:

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

W tym momencie twoja lista jest pusta, więc twój wąż nie ma ciała. Powiedzmy, że chcesz węża o długości 5, a głowa powinna zacząć w pozycji (5,2) i rosnąć w dół. Po prostu dodaj te pozycje do listy na początku gry, na przykład:

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

Renderowanie węża

Do renderowania wystarczy narysować znak w każdej pozycji na liście treści. Powyższy przykład można na przykład narysować jako:

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

Możesz się bardziej skomplikować, wybierając różne znaki dla głowy postaci (pierwszy element na liście) i ogona (ostatni element na liście), a nawet zorientuj je w zależności od położenia sąsiednich bloków. Ale na początek renderuj wszystko jako #coś lub coś.

Możesz na przykład zacząć od tablicy znaków 2D zawierającej tło w następujący sposób:

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

A następnie iteruj po ciele węża, przyciągając go do tablicy:

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

I w końcu powtórz iterację po tablicy i zapisz każdy znak w konsoli, z podziałem wiersza na końcu każdego wiersza.

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

Moving the Snake

Wreszcie ruch. Pierwszą rzeczą, której potrzebujesz, jest śledzenie Directionporuszającego się węża. Może to być proste wyliczenie:

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

Przesunięcie węża można wykonać po prostu usuwając ostatni blok z listy i dodając go z przodu we właściwym kierunku . Innymi słowy, coś takiego:

// 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
źródło
5
Dobre wezwanie do przeniesienia ostatniego bloku do przodu w celu ruchu!
SpartanDonut
Świetna odpowiedź. Uwielbiam sposób, w jaki poruszasz wężem - jest dość elegancki.
Cypher
-3
  1. Za każdym razem, gdy odmierza czas, aktualizujesz lokalizację węża i rysujesz kształty w nowych lokalizacjach

  2. Użyj System.Windows.Forms.Timer do akcji w tle, aby uruchomić grę w celu przesunięcia węża.

  3. Użyj klas i dziedziczenia dla struktury

Adam Bruss
źródło
To bardzo niejasna odpowiedź. Krok trzeci jest szczególnie ważny.
MichaelHouse