Menu
CoddyTech

Yılanın Üzerinde Değil

Coddy'nin Unity Oyunu: 3D Yılan kursunda ders 9 / 14.

MoveFood() yılanın kapladığı hücreler de dahil olmak üzere herhangi bir hücreyi seçer. Yılanın altındaki yiyecek, yılan oradan hareket edene kadar yenemez ve yılan ne kadar uzunsa bu durum o kadar sık yaşanır.

Çözümlerden biri, hücre boş olana kadar yeniden seçim yapmaktır. Bu yöntem boş bir tahtada işe yarar, ancak tahta doldukça giderek daha fazla deneme gerektirir ve hiç boş hücre kalmadığında işlem hiç bitmez. Sağlam çözüm, önce boş hücrelerin bir listesini oluşturup içlerinden birini seçmektir: her boş hücrenin seçilme olasılığı eşittir ve tek bir seçim her zaman yeterlidir. Bir sinema, geç kalan bir konuğu aynı şekilde oturtur:

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), üst sınır dahil edilmediği için 0'dan sonuncu indekse kadar bir indeks döndürür. Listeyi oluşturmak için tahta, yılanın bir hücreyi kaplayıp kaplamadığını sorar: Snake üzerindeki, başı ve tüm parçaları kontrol eden bir yöntem.

challenge icon

Görev

Orta

Yem asla yılanın üzerine düşmez.

  1. Snake içinde public bool Occupies(Vector3 cell) metodunu yaz: başın hücresi veya kuyruğun herhangi bir parçasının hücresi için true döndürsün.
  2. GameManager'ın MoveFood() metodunda, -snake.edge değerinden snake.edge değerine kadar x ve z üzerinde döngü kur; !snake.Occupies(cell) koşulunu sağlayan her hücreyi List<Vector3> free listesine ekle ve yemi free[Random.Range(0, free.Count)] konumuna yerleştir.

“Oyna” düğmesine bas ve yılanı uzat: yem her zaman boş bir hücreye düşer. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity Oyunu: 3D Yılan bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground