Não na Cobra
Lição 9 de 14 do curso Jogo de Cobra 3D 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.
Desafio
Médio- Em
Snake, escrevapublic bool Occupies(Vector3 cell): retorna verdadeiro quandocellé a célula da cabeça ou a célula de um segmento da cauda. - Em
GameManager, adicioneusing System.Collections.Generic;e reescrevaMoveFood(): percorra x e z em todas as células do tabuleiro, adicione cada célula que a cobra não ocupa a umaList<Vector3> freee coloque a comida em uma célula aleatória dessa lista.
Pressione Play e, em seguida, pressione Check. As verificações preenchem a maior parte do tabuleiro com a cobra e garantem que a comida ainda encontre as células livres.
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);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.