Menu
CoddyTech

Yılanın Üzerinde Değil

Coddy'nin Unity'de 3D Yılan Oyunu 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
  1. Snake içinde, public bool Occupies(Vector3 cell) metodunu yaz: cell yılanın başının bulunduğu hücre veya bir kuyruk segmentinin bulunduğu hücre olduğunda true döndürsün.
  2. GameManager içinde using System.Collections.Generic; ekle ve MoveFood() metodunu yeniden yaz: x ve z değerlerini tahtadaki her hücre boyunca döngüye sok, yılanın kaplamadığı her hücreyi bir List<Vector3> free listesine ekle ve yiyeceği bu listeden rastgele bir hücreye yerleştir.

Play'e bas, ardından Check'e bas. Kontroller tahtanın çoğunu yılanla doldurur ve yiyeceğin hâlâ boş hücreleri bulduğundan emin olur.

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'de 3D Yılan Oyunu bölümündeki tüm dersler