Files
2025-09-21 20:11:21 +08:00

142 lines
4.0 KiB
C#

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
}
}