C # criando um jogo simples de cobra


12

Eu estava pensando em criar um jogo de cobra com C #, então eu corri ideias na minha cabeça e surgiram alguns problemas.

Como posso rastrear e produzir no local correto os blocos que correm atrás da cabeça da cobra?

Se a cobra é constituída por cinco blocos e o usuário começa a circular, como posso imprimir o corpo da cobra no local certo?

Além disso, como posso criar uma ação que será executada em segundo plano, o que levará a cobra adiante, não importa o que o usuário faça?

Qual estrutura meu código deve ter? (estrutura de design de código)

Esse deve ser um aplicativo de console, já que é o único framework que eu estou familiarizado.

Não estou procurando por código finalizado, pois quero realmente entender como ele deve funcionar.

Respostas:


23

Representando a cobra

Criar um jogo de cobra é bem simples. A primeira coisa que você precisa é uma maneira de representar o corpo da sua cobra. Se você considera sua cobra composta de blocos ou ladrilhos, seu corpo pode ser simplesmente uma lista dessas coordenadas de blocos.

No seu caso, se você pretende fazer um aplicativo de console, cada um deles será um caractere no console e a posição corresponderá a uma linha ou linha da saída do console. Então você começa com isso:

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

Neste ponto, sua lista está vazia, então sua cobra não tem corpo. Digamos que você queira uma cobra de comprimento 5 e a cabeça comece na posição (5,2) e cresça em direção ao fundo. Basta adicionar essas posições à lista quando o jogo começar, por exemplo:

// 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 a cobra

Para renderizar, basta desenhar um caractere em cada posição na lista de corpos. O exemplo acima, por exemplo, pode ser desenhado como:

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

Você pode ficar mais complicado escolhendo caracteres diferentes para a cabeça do personagem (primeiro elemento da lista) e cauda (último elemento da lista) e até orientá-los, dependendo das posições dos blocos adjacentes. Mas, para começar, basta renderizar tudo como #algo ou algo.

Você poderia, por exemplo, começar com uma matriz de caracteres 2D contendo o plano de fundo da seguinte maneira:

// 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 então itere sobre o corpo da cobra, desenhando-o na matriz:

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

E, finalmente, repita a matriz novamente e escreva cada caractere no console, com uma quebra de linha no final de cada linha.

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

Movendo a cobra

Finalmente, movimento. A primeira coisa que você precisa é acompanhar Directiona cobra que está se movendo. Pode ser uma enumeração simples:

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

E o ato de mover a cobra pode ser feito apenas removendo o último bloco da lista e adicionando-o à frente, na direção correta . Em outras palavras, 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);

5
Boa chamada no movimento do último bloco para a frente para o movimento!
SpartanDonut 01/03/12

Ótima resposta. Eu amo como você está movendo a cobra - é bastante elegante.
Cypher

-3
  1. Cada vez que um timer toca, você atualiza a localização da cobra e desenha as formas nos novos locais.

  2. Use um System.Windows.Forms.Timer para a ação em segundo plano para acionar o jogo para mover a cobra.

  3. Use classes e herança para a estrutura


Esta é uma resposta muito vaga. O passo número três é especialmente verdade.
MichaelHouse
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.