Pas sur le serpent
Leçon 9 sur 14 du cours Jeu Unity : Snake 3D de Coddy.
MoveFood() choisit n’importe quelle case, y compris celles occupées par le serpent. La nourriture sous le serpent ne peut pas être mangée tant que le serpent ne s’en est pas éloigné, et plus le serpent est long, plus cela se produit souvent.
Une solution consiste à choisir à nouveau jusqu’à ce que la case soit libre. Cela fonctionne sur un plateau vide, mais il faut de plus en plus d’essais à mesure que le plateau se remplit, et s’il ne reste aucune case libre, la boucle ne se termine jamais. La solution fiable consiste d’abord à créer une liste des cases libres, puis à en choisir une : chaque case libre a la même probabilité d’être choisie, et un seul tirage suffit toujours. Un cinéma place un spectateur arrivé en retard de la même façon :
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) renvoie un indice de 0 jusqu’au dernier, car la valeur maximale est exclue. Pour créer la liste, le plateau demande au serpent s’il occupe une case : une méthode de Snake vérifie la tête et chaque segment.
Défi
MoyenLa nourriture ne tombe jamais sur le serpent.
- Dans
Snake, écrispublic bool Occupies(Vector3 cell): vrai pour la case de la tête ou pour celle de n’importe quel segment de la queue. - Dans
MoveFood()deGameManager, fais une boucle sur x et z de-snake.edgeàsnake.edge, ajoute chaque case pour laquelle!snake.Occupies(cell)à uneList<Vector3> free, puis place la nourriture surfree[Random.Range(0, free.Count)].
Appuie sur « Jouer » et fais grandir le serpent : la nourriture tombe toujours sur une case vide. Puis appuie sur « Vérifier ».
Essayez vous-même
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);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Jeu Unity : Snake 3D
Entraînez-vous par vous-même : Playground Unity