ليس على الثعبان
الدرس 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 تتحقق من الرأس وكل جزء من جسمه.
التحدي
متوسط- في
Snake، اكتبpublic bool Occupies(Vector3 cell): تُرجع true عندما تكونcellخلية الرأس أو خلية أحد أجزاء الذيل. - في
GameManager، أضفusing System.Collections.Generic;وأعِد كتابةMoveFood(): كرّر عبر x وz في كل خلايا اللوحة، وأضف كل خلية لا يشغلها الثعبان إلىList<Vector3> free، ثم ضع الطعام في خلية عشوائية من تلك القائمة.
اضغط على Play، ثم اضغط على Check. تملأ الاختبارات معظم اللوحة بالثعبان وتتأكد من أن الطعام لا يزال يعثر على الخلايا الشاغرة.
جرّب بنفسك
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);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.