Bukan di Tubuh Ular
Pelajaran 9 dari 14 dalam kursus Game Unity: Snake 3D di Coddy.
MoveFood() memilih sel mana pun, termasuk sel yang ditempati ular. Makanan di bawah ular tidak bisa dimakan sampai ular berpindah, dan semakin panjang ularnya, semakin sering hal itu terjadi.
Salah satu cara mengatasinya adalah memilih lagi sampai selnya kosong. Cara ini berhasil di papan kosong, tetapi semakin banyak percobaan yang diperlukan saat papan terisi, dan jika tidak ada sel kosong yang tersisa, prosesnya tidak akan pernah berakhir. Cara yang lebih andal adalah membuat daftar sel kosong terlebih dahulu, lalu memilih salah satunya: setiap sel kosong memiliki peluang yang sama, dan satu kali pemilihan selalu cukup. Bioskop mengatur tempat duduk untuk tamu yang datang terlambat dengan cara yang sama:
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) mengembalikan indeks dari 0 hingga indeks terakhir, karena nilai maksimum tidak disertakan. Untuk membuat daftar tersebut, papan menanyakan kepada ular apakah ular menempati sebuah sel: gunakan method pada Snake yang memeriksa kepala dan setiap segmen.
Tantangan
Sedang- Di
Snake, tulispublic bool Occupies(Vector3 cell): bernilai true saatcelladalah sel kepala atau sel salah satu segmen ekor. - Di
GameManager, tambahkanusing System.Collections.Generic;dan tulis ulangMoveFood(): lakukan perulangan x dan z pada setiap sel papan, tambahkan setiap sel yang tidak ditempati ular keList<Vector3> free, lalu letakkan makanan di sel acak dari list tersebut.
Tekan Play, lalu tekan Check. Pemeriksaan mengisi sebagian besar papan dengan ular dan memastikan makanan tetap menemukan sel yang kosong.
Coba sendiri
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);
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.