Menu
CoddyTech

Não na cobra

Lição 9 de 14 do curso Jogo 3D da Cobrinha na Unity da Coddy.

MoveFood() escolhe qualquer célula, inclusive as células ocupadas pela cobra. A comida sob a cobra não pode ser comida até que ela saia de cima dela, e quanto mais comprida a cobra, mais vezes isso acontece.

Uma solução é escolher de novo até que a célula esteja livre. Funciona em um tabuleiro vazio, mas exige cada vez mais tentativas à medida que o tabuleiro se enche e, quando não resta nenhuma célula livre, nunca termina. A solução consistente primeiro cria uma lista das células livres e escolhe uma delas: todas as células livres têm a mesma probabilidade, e basta uma escolha. Um cinema acomoda da mesma forma um convidado que chega atrasado:

List<int> free = new List<int>();
for (int seat = 1; seat <= 40; seat++)
{
    if (!taken.Contains(seat)) free.Add(seat);
}
int pick = free[Random.Range(0, free.Count)];

Random.Range(0, free.Count) retorna um índice de 0 até o último, pois o valor máximo é excluído. Para criar a lista, o tabuleiro pergunta à cobra se ela ocupa uma célula: um método em Snake que verifica a cabeça e cada segmento.

challenge icon

Desafio

Médio

A comida nunca aparece em cima da cobra.

  1. Em Snake, escreva public bool Occupies(Vector3 cell): verdadeiro para a célula da cabeça ou para a de qualquer segmento da cauda.
  2. No MoveFood() de GameManager, percorra x e z de -snake.edge a snake.edge, adicione cada célula em que !snake.Occupies(cell) a uma List<Vector3> free e coloque a comida em free[Random.Range(0, free.Count)].

Pressione “Jogar” e cresça bastante: a comida sempre aparece em uma célula vazia. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        MoveFood();
    }

    void MoveFood()
    {
        int x = Random.Range(-snake.edge, snake.edge + 1);
        int z = Random.Range(-snake.edge, snake.edge + 1);
        food.position = new Vector3(x, 0f, z);
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo 3D da Cobrinha na Unity

Pratique por conta própria: Playground de Unity