贪吃蛇小时候大家都玩过,具体步骤如下:
1.给游戏制造一个有限得空间。
2.生成墙壁,小蛇碰撞到墙壁或者咬到自己的尾巴,游戏结束。
3.生成随机的食物。
4.吃掉食物,增加自身的体长,并生成新的食物。
具体代码如下:
定义一个小蛇类,该类包含吃东西,移动,检测碰撞等方法。
class Snake
{
private List<Point> _body;
private Direction _direction;
private int _step = 1;
private Point _tail;
public Snake(Point tail, int length, Direction direction)
{
_direction = direction;
_body = new List<Point>();
for (int i = 0; i < length; i++)
{
Point p = new Point(tail.X, tail.Y, tail.Symbol);
p.Move(i, _direction);
_body.Add(p);
}
_tail = _body.First();
}
public void Move()
{
Point head = GetNextPoint();
_body.Add(head);
_tail.Clear();
_tail = _body.First();
_body.RemoveAt(0);
head.Draw();
}
public bool Eat(Point food)
{
Point head = GetNextPoint();
if (head.IsHit(food))
{
food.Symbol = head.Symbol;
_body.Add(food);
return true;
}
return false;
}
public void HandleKey(ConsoleKey key)
{
if (key == ConsoleKey.LeftArrow && _direction != Direction.Right)
{
_direction = Direction.Left;
}
else if (key == ConsoleKey.RightArrow && _direction != Direction.Left)
{
_direction = Direction.Right;
}
else if (key == ConsoleKey.UpArrow && _direction != Direction.Down)
{
_direction = Direction.Up;
}
else if (key == ConsoleKey.DownArrow && _direction != Direction.Up)
{
_direction = Direction.Down;
}
}
public Point GetNextPoint()
{
Point head = _body.Last();
Point nextPoint = new Point(head.X, head.Y, head.Symbol);
nextPoint.Move(_step, _direction);
return nextPoint;
}
public void Draw()
{
foreach (Point p in _body)
{
p.Draw();
}
}
public bool IsHitTail()
{
Point head = _body.Last();
for (int i = 0; i < _body.Count - 2; i++)
{
if (head.IsHit(_body[i]))
{
return true;
}
}
return false;
}
}
定义一个墙体类:
class Walls
{
private List<Point> _wallList;
public Walls(int mapWidth, int mapHeight)
{
_wallList = new List<Point>();
DrawHorizontalLine(0);
DrawHorizontalLine(mapHeight - 1);
DrawVerticalLine(0);
DrawVerticalLine(mapWidth - 1);
}
private void DrawHorizontalLine(int y)
{
for (int x = 0; x < Console.WindowWidth; x++)
{
Point p = new Point(x, y, '#');
p.Draw();
_wallList.Add(p);
}
}
private void DrawVerticalLine(int x)
{
for (int y = 0; y < Console.WindowHeight; y++)
{
Point p = new Point(x, y, '#');
p.Draw();
_wallList.Add(p);
}
}
public bool IsHit(Snake snake)
{
Point head = snake.GetNextPoint();
return IsHit(head);
}
private bool IsHit(Point p)
{
return _wallList.Any(w => w.IsHit(p));
}
public void Draw()
{
foreach (Point p in _wallList)
{
p.Draw();
}
}
}
定义一个创建食物类:
class FoodCreator
{
private readonly int _mapWidth;
private readonly int _mapHeight;
private readonly char _symbol;
public FoodCreator(int mapWidth, int mapHeight, char symbol)
{
_mapWidth = mapWidth;
_mapHeight = mapHeight;
_symbol = symbol;
}
public Point CreateFood()
{
int x = new Random().Next(2, _mapWidth - 2);
int y = new Random().Next(2, _mapHeight - 2);
return new Point(x, y, _symbol);
}
}
定义一个枚举,表示方向:
enum Direction
{
Left,
Right,
Up,
Down
}
定义一个坐标类应用重绘:
class Point
{
public int X { get; set; }
public int Y { get; set; }
public char Symbol { get; set; }
public Point(int x, int y, char symbol)
{
X = x;
Y = y;
Symbol = symbol;
}
public void Draw()
{
Console.SetCursorPosition(X, Y);
Console.Write(Symbol);
}
public void Clear()
{
Symbol = ' ';
Draw();
}
public void Move(int offset, Direction direction)
{
if (direction == Direction.Right)
{
X += offset;
}
else if (direction == Direction.Left)
{
X -= offset;
}
else if (direction == Direction.Up)
{
Y -= offset;
}
else if (direction == Direction.Down)
{
Y += offset;
}
}
public bool IsHit(Point p)
{
return p.X == X && p.Y == Y;
}
}
函数入口:
class Program
{
static void Main()
{
Console.Title = "贪吃蛇游戏";
Console.CursorVisible = false;
Console.SetWindowSize(40, 20);
Console.SetBufferSize(40, 20);
Walls walls = new Walls(40, 20);
walls.Draw();
Snake snake = new Snake(new Point(6, 5, '*'),1,Direction.Down);
snake.Draw();
FoodCreator foodCreator = new FoodCreator(40, 20, '$');
Point food = foodCreator.CreateFood();
food.Draw();
while (true)
{
if (walls.IsHit(snake) || snake.IsHitTail())
{
break;
}
if (snake.Eat(food))
{
food = foodCreator.CreateFood();
food.Draw();
}
else
{
snake.Move();
}
System.Threading.Thread.Sleep(100);
if (Console.KeyAvailable)
{
ConsoleKeyInfo key = Console.ReadKey();
snake.HandleKey(key.Key);
}
}
WriteGameOver();
Console.ReadLine();
}
static void WriteGameOver()
{
int xOffset = 10;
int yOffset = 8;
Console.ForegroundColor = ConsoleColor.Red;
Console.SetCursorPosition(xOffset, yOffset++);
WriteText("========", xOffset, yOffset++);
WriteText("GAME OVER", xOffset + 1, yOffset++);
yOffset++;
WriteText("========", xOffset, yOffset++);
}
static void WriteText(String text, int xOffset, int yOffset)
{
Console.SetCursorPosition(xOffset, yOffset);
Console.WriteLine(text);
}
}
运行效果图: