C# c语言中控制台上的移动#

C# c语言中控制台上的移动#,c#,console,C#,Console,我现在正在做一个蛇的游戏,我很难确保尾巴跟在我的头上。我目前正在尝试让它工作,我尝试了十几种不同的想法,所有这些想法要么使它完全失速(例如,蛇似乎被冻结在一个地方),要么垂直运动同时发生在尾巴的所有点上,而不是一个接一个的运动。我在Console.Clear()方法上也遇到了一些问题,这似乎是不可避免的。要么我做了太多次,它会删除我的蛇的第一个点以外的所有东西,要么我不做,旧的位置不会被删除。下面是代码(这是一个测试代码,从实际游戏中分离出来,因为我需要确保代码正常工作): 类程序 { 常数in

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

类程序
{
常数int size=10;
结构精灵
{
公共字符[]ch;
公共int[,]posXY;
公共int方向X;
公共国际指导;
}
静态void Main(字符串[]参数)
{
int startX=10;
int startY;
精灵玩家=新精灵();
player.ch=新字符[7];
player.posXY=新整数[7,2];
for(int i=0;i
}


另外,我需要为我的snake使用一个结构,使用类不是一个选项。

我认为描述“snake”游戏的最佳数据结构是队列。这样,您就可以从尾部排队(“未绘制”)1个“项目”,并排队(“绘制”)一个以新坐标为头部的新项目。 如果它恰好在“苹果”上,你只需跳过一个出列操作或两次排队

如果您不熟悉队列数据结构,请首先查看以下内容:


在这里查看.net framework的默认队列:

您说您遇到了问题。让我们先关注一个问题,比如说,让尾巴跟随头部。您目前使用的方法是什么?目前我正在尝试将整个蛇表示为一个数组,即player.ch。要移动蛇,我有一个二维数组player.posXY。蛇在控制台位置x=4-10,y=10产卵。update方法使用player.directionX和player.directionY变量来更新snakes组件零件(player.ch[0-6])的位置,然后draw方法用于在它们移动时重新绘制它们。右/左移动按预期工作。问题是上/下移动会一次将蛇向上移动,而不是一次只移动一个部分来改变位置。不清楚你在问什么,或者它与C有什么关系?我的蛇应该像视频中的蛇一样移动(跳到30秒):相反,当上下移动时,整个蛇会一次向上或向下移动,而不是一次向上/向下移动一个点(而后面的其他部分继续向前移动,直到到达头部最初向上/向下移动的位置)。还有其他问题,但我可以稍后再集中讨论。
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