C#之控制台版本得贪吃蛇

贪吃蛇小时候大家都玩过,具体步骤如下:
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);
    }
}

运行效果图:
请添加图片描述
请添加图片描述

猜你喜欢

转载自blog.csdn.net/csdn2990/article/details/132173477