一个极其简陋的贪吃蛇,就不从新建项目一一赘述了,将完全:
背景框,四边围墙,碰撞死亡,
初始状态,一个蛇头一个蛇身,WSAD控制上下左右,
随机出现食物,蛇头吃掉食物后,增长,食物的随机生成要避开蛇头蛇身
协程控制,蛇身用列表存储,每次蛇头向前移动一格,第一节蛇身移动到蛇头位置,后面一次移动到上一节蛇身位置(此处要倒序移动,就是最后一节(蛇尾)先动)。
private IEnumerator Move()
{
for (int i = bodys.Count; i > 1; i--)
{
bodys[i].position = bodys[i - 1].position;
}
bodys[0].transform.position = head.position;
head.Translate(direction * sizeGride);
isRotating = false;
yield return new WaitForSeconds(1f/ speed);
StartCoroutine(Move());
}
改变下一次蛇头移动的方向,只能转90度,此处要注意,不可直接进行两次转向,所以以一个bool值限定了一下。
private void Rotate()
{
if (isRotating)
return;
if (Input.GetKeyDown(KeyCode.W) && direction.x != 0)
{
SetDirection(Vector3.up);
}
else if (Input.GetKeyDown(KeyCode.S) && direction.x != 0)
{
SetDirection(-Vector3.up);
}
else if (Input.GetKeyDown(KeyCode.A) && direction.y != 0)
{
SetDirection(-Vector3.right);
}
else if (Input.GetKeyDown(KeyCode.D) && direction.y != 0)
{
SetDirection(Vector3.right);
}
}
private void SetDirection(Vector3 dir)
{
isRotating = true;
direction = dir;
}
采用坐标地图,生成食物时,避免生成在蛇身上
/// <summary>
/// 生成食物
/// </summary>
public void NewFood()
{
food = Instantiate(Resources.Load<Transform>("Food"), transform.parent);
food.name = "Food";
pointsSnake.Clear();
pointsSnake.Add(head.position);
for (int i = 0; i < bodys.Count; i++)
{
pointsSnake.Add(bodys[i].position);
}
List<Vector2> pointsCanNewFood = points.Except(pointsSnake).ToList();
System.Random rd = new System.Random();
int index = rd.Next(pointsCanNewFood.Count);
food.position = pointsCanNewFood[index];
}
/// <summary>
/// 蛇生长
/// </summary>
public void AddBody()
{
Transform newBody = Instantiate(bodys[1], transform);
newBody.name = "Body";
newBody.position = oldPosition;
bodys.Add(newBody);
}
目前死亡判断还有问题。
因篇幅问题不能全部显示,请点此查看更多更全内容