C # creando un semplice gioco di serpenti


12

Stavo pensando di creare un gioco di serpenti con C #, quindi mi sono imbattuto in idee e sono emersi alcuni problemi.

Come posso tracciare ed emettere nella posizione corretta i blocchi che corrono dietro la testa del serpente?

Se il serpente è composto da cinque blocchi e l'utente inizia a girare in cerchio, come posso stampare il corpo del serpente nella posizione giusta?

Inoltre, come posso creare un'azione che verrà eseguita in background, che sposterà il serpente in avanti, indipendentemente da ciò che l'utente fa?

Quale struttura dovrebbe avere il mio codice? (struttura di progettazione del codice)

Questa dovrebbe essere un'applicazione console, poiché è l'unico framework con cui ho familiarità.

Non sto cercando il codice finito, poiché voglio davvero capire come dovrebbe funzionare.

Risposte:


23

Rappresentare il serpente

La creazione di un gioco Snake è piuttosto semplice. La prima cosa di cui hai bisogno è un modo per rappresentare il corpo del tuo serpente. Se consideri il tuo serpente costituito da blocchi o tessere, il tuo corpo può semplicemente essere un elenco di queste coordinate di blocchi.

Nel tuo caso, se intendi fare un'applicazione console, ognuna di queste sarà un carattere sulla console e la posizione corrisponderebbe a una riga o riga dell'output della console. Quindi inizi con questo:

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

A questo punto, la tua lista è vuota, quindi il tuo serpente non ha un corpo. Diciamo che vuoi un serpente di lunghezza 5 e la testa dovrebbe iniziare in posizione (5,2) e crescere verso il fondo. Basta aggiungere quelle posizioni all'elenco all'avvio del gioco, ad esempio:

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

Rendering del serpente

Per il rendering basta disegnare un personaggio in ogni posizione nell'elenco del corpo. L'esempio sopra per esempio potrebbe essere disegnato come:

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

Puoi diventare più complicato scegliendo personaggi diversi per la testa del personaggio (primo elemento nella lista) e la coda (ultimo elemento nella lista) e persino orientarli a seconda della posizione dei blocchi adiacenti. Ma per cominciare, rendi tutto come #o qualcosa del genere.

Ad esempio, potresti iniziare con un array di caratteri 2D contenente lo sfondo in questo modo:

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

E quindi scorrere il corpo del serpente attirandolo sull'array:

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

E infine scorrere nuovamente l'array e scrivere ogni personaggio sulla console, con una interruzione di riga alla fine di ogni riga.

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

Spostare il serpente

Finalmente movimento. La prima cosa di cui hai bisogno è tenere traccia del movimento Directiondel serpente. Questo può essere un semplice enum:

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

E l'atto di muovere il serpente può essere fatto semplicemente rimuovendo l'ultimo blocco dalla lista e aggiungendolo in avanti, nella direzione corretta . In altre parole qualcosa del tipo:

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

5
Buona chiamata a spostare l'ultimo blocco in avanti per il movimento!
SpartanDonut

Bella risposta. Adoro come stai muovendo il serpente - è abbastanza elegante.
Cypher

-3
  1. Ogni volta che un timer ticchetta aggiorna la posizione del serpente e disegna le forme nelle nuove posizioni

  2. Usa un System.Windows.Forms.Timer per l'azione in background per attivare il gioco e muovere il serpente.

  3. Utilizzare le classi e l'ereditarietà per la struttura


Questa è una risposta molto vaga. Il passaggio numero tre è particolarmente vero.
MichaelHouse
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.