Menu
CoddyTech

ليس على الثعبان

الدرس 9 من 14 في دورة لعبة Unity: الثعبان ثلاثي الأبعاد على Coddy.

تختار 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 تتحقق من الرأس وكل جزء من جسمه.

challenge icon

التحدي

متوسط

لا يظهر الطعام أبدًا على الأفعى.

  1. في Snake، اكتب public bool Occupies(Vector3 cell): تكون النتيجة true لخلية الرأس أو أي جزء من الذيل.
  2. في MoveFood() التابعة لـ GameManager، كرّر x وz من -snake.edge إلى snake.edge، وأضف كل خلية يتحقق فيها !snake.Occupies(cell) إلى List<Vector3> free، ثم ضع الطعام على free[Random.Range(0, free.Count)].

اضغط «العب» واجعل الأفعى تنمو طويلًا: سيظهر الطعام دائمًا على خلية فارغة. ثم اضغط «تحقق».

جرّب بنفسك

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 iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Unity: الثعبان ثلاثي الأبعاد

تدرّب بنفسك: Playground لـ Unity