c#中控制台上的移动

时间:2012-10-28 04:06:22

标签: c# console

我现在正在制作一个蛇游戏,并且很难确保尾巴跟着我的头。我现在正试图让它发挥作用,我已经尝试了十几个不同的想法,所有这些想法都使它完全失速(例如蛇似乎在一个地方冻结),或者垂直运动发生在所有尾巴的点,而不是一个接一个的运动。我也遇到了一些似乎不可避免的Console.Clear()方法的问题。要么我做了太多次,除了我的蛇的第一点,它删除了所有东西,或者我没有删除,旧的位置不会被删除。这是代码(它是一个测试代码,从我需要确保代码工作的实际游戏中分离出来):

class Program
{
    const int size = 10;
    struct Sprite
    {
        public char[] ch;
        public int[,] posXY;
        public int directionX;
        public int directionY;
    }
    static void Main(string[] args)
    {
        int startX = 10;
        int startY;
        Sprite player = new Sprite();
        player.ch = new char[7];
        player.posXY = new int[7,2];
        for (int i = 0; i < player.ch.Length; i++)
        {
            player.ch[i] = '*';
        }
        for (int i = 0; i < 7; i++)
        {
            startY = 10;
            player.posXY[i, 0] = startX;
            player.posXY[i, 1] = startY;
            startX--;
        }
        ConsoleKeyInfo cki = new ConsoleKeyInfo();
        while (true)
        {
            update(cki, ref player);
            draw(player);
            Thread.Sleep(200);
        }//end while
    }//end main
    static void update(ConsoleKeyInfo cki, ref Sprite player)
    {
        if (Console.KeyAvailable)
        {
            cki = Console.ReadKey(true);
            if (cki.Key == ConsoleKey.LeftArrow || cki.Key == ConsoleKey.A)
            {
                player.directionX = -1;
                player.directionY = 0;
            }
            if (cki.Key == ConsoleKey.RightArrow || cki.Key == ConsoleKey.D)
            {
                player.directionX = 1;
                player.directionY = 0;
            }
            if (cki.Key == ConsoleKey.UpArrow || cki.Key == ConsoleKey.W)
            {
                player.directionX = 0;
                player.directionY = -1;
            }
            if (cki.Key == ConsoleKey.DownArrow || cki.Key == ConsoleKey.S)
            {
                player.directionX = 0;
                player.directionY = 1;
            }
        }//endif
        for (int i = 0; i < 7; i++)
        {
            player.posXY[i, 0] = player.posXY[i, 0] + player.directionX;
            player.posXY[i, 1] = player.posXY[i, 1] + player.directionY;
        }
    }//end update
    static void draw(Sprite player)
    {
        Console.Clear();
        for (int i = 0; i < 7; i++)
        {
            Console.SetCursorPosition(player.posXY[i, 0], player.posXY[i, 1]);
            Console.Write(player.ch[i]);
        }
    }//end draw

}

P.S。我需要为我的蛇使用一个结构,使用Class不是一个选项。

1 个答案:

答案 0 :(得分:1)

恕我直言,描述“蛇”游戏的最佳数据结构是一个队列。这样你就可以从尾部出列(“undraw”)1“item”并将新坐标作为头部排队(“绘制”)一个新项目。 如果碰巧在“苹果”上,你只需跳过一次出列操作或两次入队。

如果你不熟悉队列数据结构,请看看这个拳头:http://en.wikipedia.org/wiki/Queue_(abstract_data_type)

在此处查看.net框架的默认队列:http://msdn.microsoft.com/en-us/library/7977ey2c.aspx