Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang
  1. Di Snake, tulis public bool Occupies(Vector3 cell): bernilai true saat cell adalah sel kepala atau sel salah satu segmen ekor.
  2. Di GameManager, tambahkan using System.Collections.Generic; dan tulis ulang MoveFood(): lakukan perulangan x dan z pada setiap sel papan, tambahkan setiap sel yang tidak ditempati ular ke List<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);
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Unity: Snake 3D