뱀 위에는 안 돼
Coddy의 Unity 게임: 3D 스네이크 코스 레슨. 14개 중 9번째.
MoveFood()는 뱀이 차지하고 있는 칸을 포함해 아무 칸이나 선택합니다. 뱀 아래에 있는 먹이는 뱀이 그 칸에서 벗어나야 먹을 수 있으며, 뱀이 길수록 이런 일이 더 자주 발생합니다.
한 가지 해결 방법은 빈 칸이 나올 때까지 다시 선택하는 것입니다. 비어 있는 보드에서는 잘 작동하지만, 보드가 채워질수록 시도 횟수가 점점 늘어나고 빈 칸이 하나도 남지 않으면 끝나지 않습니다. 확실한 해결 방법은 먼저 빈 칸 목록을 만든 다음 그중 하나를 선택하는 것입니다. 빈 칸은 모두 선택될 확률이 같고, 한 번만 선택하면 항상 충분합니다. 영화관에서 늦게 온 손님에게 좌석을 배정하는 것도 같은 방식입니다.
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)는 0부터 마지막 인덱스까지 중 하나를 반환합니다. 최댓값은 포함되지 않기 때문입니다. 목록을 만들기 위해 보드는 뱀에게 해당 칸을 차지하고 있는지 묻습니다. 즉, Snake에 있는 메서드가 머리와 모든 몸통을 확인합니다.
챌린지
중급Snake에서public bool Occupies(Vector3 cell)을 작성하세요.cell이 머리의 칸이거나 꼬리 세그먼트의 칸이면 true를 반환합니다.GameManager에서using System.Collections.Generic;을 추가하고MoveFood()를 다시 작성하세요. x와 z를 보드의 모든 칸에 대해 반복하고, 뱀이 차지하지 않는 각 칸을List<Vector3> free에 추가한 다음, 그 목록의 임의의 칸에 먹이를 배치합니다.
Play를 누른 다음 Check를 누르세요. 검사에서는 보드 대부분을 뱀으로 채우고 먹이가 여전히 빈 칸을 찾는지 확인합니다.
직접 해보기
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);
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.