using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 贪吃蛇 { enum E_MoveDirection { Up, Down, Left, Right } class Snake : IDraw { E_MoveDirection moveDirection;//记录蛇当前的移动方向 SnakeBody[] bodies; //存放蛇身体的数组 int nowNum;//用一个变量记录蛇的长度 public Snake(int x, int y) { moveDirection = E_MoveDirection.Right; bodies = new SnakeBody[200]; bodies[0] = new SnakeBody(x, y, E_BodyType.Head); nowNum = 1; } public void Draw() { //只画出当前的蛇身 for (int i = 0; i < nowNum; i++) { bodies[i].Draw(); } } #region Lesson7 //蛇的移动 public void Move() { //移动前擦除前一个位置 SnakeBody lastBody = bodies[nowNum - 1]; Console.SetCursorPosition(lastBody.pos.x, lastBody.pos.y); Console.Write(" "); for(int i = nowNum - 1; i > 0; i--) { bodies[i].pos = bodies[i - 1].pos; } switch (moveDirection) { case E_MoveDirection.Up: bodies[0].pos.y--; break; case E_MoveDirection.Down: bodies[0].pos.y++; break; case E_MoveDirection.Left: bodies[0].pos.x -= 2; break; case E_MoveDirection.Right: bodies[0].pos.x += 2; break; } } #endregion #region Lesson8 public void ChangeDirection(E_MoveDirection newDirection) { //不能直接掉头 if ( newDirection == moveDirection || nowNum > 1 && (moveDirection == E_MoveDirection.Right && newDirection == E_MoveDirection.Left ) || nowNum > 1 && (moveDirection == E_MoveDirection.Left && newDirection == E_MoveDirection.Right) || nowNum > 1 && (moveDirection == E_MoveDirection.Up && newDirection == E_MoveDirection.Down) || nowNum > 1 && (moveDirection == E_MoveDirection.Down && newDirection == E_MoveDirection.Up) ) { return; } moveDirection = newDirection; } #endregion #region Lesson9 //碰撞检测 public bool CheckEnd(Map map) { //是否和墙体位置重合 for(int i = 0; i < map.walls.Length; i++) { if (bodies[0].pos == map.walls[i].pos) { return true; } } //是否和自己身体位置重合 for(int i = 1; i < nowNum; i++) { if (bodies[0].pos == bodies[i].pos) { return true; } } return false; } #endregion #region Lesson10 public bool CheckSamePos(Position p) { for(int i = 0; i < nowNum; i++) { if (bodies[i].pos == p) { return true; } } return false; } public void CheckEat(Food food) { if (bodies[0].pos == food.pos) { //吃到了就再次随机生成食物,并且让蛇变长 food.RandomPos(this); GrowUp(); } } #endregion #region Lesson11 private void GrowUp() { SnakeBody lastBody = bodies[nowNum - 1]; bodies[nowNum] = new SnakeBody(lastBody.pos.x, lastBody.pos.y, E_BodyType.Body); nowNum++; } #endregion } }