142 lines
4.0 KiB
C#
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
|
|
}
|
|
}
|