按下按钮时,C#控制台程序运行得更快

时间:2019-01-04 10:18:29

标签: c# performance console

出于兴趣,我正在C#控制台中创建一个过程生成的平台程序。但是,我发现该程序的运行速度比我预期的要慢,除非按住任意按钮,然后程序会返回到作为timeLapse输入的预期数量。

当前唯一具有功能的按钮是空格键,可让您跳转。我也没有在//此代码行上进行代码测试,并且消除了问题。有人对此有解释或文章吗?我自己找不到很多东西。

可以添加PlatformGenerator代码,尽管我认为这不是必需的。

程序代码:

namespace TestProject.Procedural_Generation
{
    public class PlatformManager
    {
        #region Variables
        // Game settings
        private static char[,] screen;
        private static int screenWidth = 96;
        private static int screenHeight = 20;

        // Platform generation settings
        private static int minGeneration = 4;
        private static int maxGeneration = 18;

        private static PlatformGenerator pg;
        private static List<Platform> platforms = new List<Platform>();

        // Physics variables
        private static int oldX = 0;
        private static int currentX = 0;
        private static int currentY = 8;
        private static string toSkip = "";

        private static Player player;

        // Timer variables
        private static float timeLapse = 100;
        private static float jumpTime = 200;
        private static Timer graphicUpdater;
        private static Timer physicUpdater;
        private static Timer jumpTimer;
        private static bool isJumping = false;

        private static long score = 0;
        #endregion

        public PlatformManager()
        {
            screen = new char[screenHeight, screenWidth];
            pg = new PlatformGenerator(minGeneration, maxGeneration);
            player = new Player();

            // Physics
            physicUpdater = new Timer(timeLapse);
            physicUpdater.Elapsed += ExecutePhysics;
            physicUpdater.AutoReset = true;
            physicUpdater.Enabled = true;

            jumpTimer = new Timer(jumpTime);
            jumpTimer.Elapsed += Land;
            jumpTimer.Enabled = true;

            // Graphics
            graphicUpdater = new Timer(timeLapse);
            graphicUpdater.Elapsed += ExecuteGraphics;
            graphicUpdater.AutoReset = true;
            graphicUpdater.Enabled = true;
            while (true)
            {
                score++;
            }
        }

        private void Land(object source, EventArgs e)
        {
            isJumping = false;
        }

        #region Graphics
        private void ExecuteGraphics(object source, ElapsedEventArgs e)
        {
            Console.Clear();
            Console.Write(Display());
        }

        // Makes sure everything is printed correctly
        public string Display()
        {
            string result = "";

            for (int y = 0; y < screenHeight; y++)
            {
                for (int x = 0; x < screenWidth; x++)
                {
                    if (y == player.y && x == player.x)
                    {
                        result += "O";
                    }
                    else if (screen[y, x] == '=')
                    {
                        result += "=";
                    }
                    else
                    {
                        result += " ";
                    }
                }
                result += "\n";
            }
            return result;
        }
        #endregion

        #region Physics
        // Controls platform generation and movement
        private void ExecutePhysics(object source, ElapsedEventArgs e)
        {
            Platformer();
            if (player.y == screenHeight - 1)
            {
                graphicUpdater.Stop();
                physicUpdater.Stop();
                Console.WriteLine();
                Console.WriteLine("Game over! Score: " + Math.Floor(Math.Sqrt(score)));
            }
            else if (isJumping)
            {
                player.y -= 1;
            }
            else if (Console.ReadKey(true).Key == ConsoleKey.Spacebar && screen[player.y + 1, player.x] == '=')   // THIS CODE
            {
                isJumping = true;
                jumpTimer.Start();
                player.y -= 1;
            }
            else if (screen[player.y + 1, player.x] != '=' && !isJumping)
            {
                player.y += 1;
            }
        }

        // Generate a new platform
        public void Platformer()
        {
            Platform newPlatform = pg.Generate(currentX, currentY);
            currentY = newPlatform.y;

            if (currentX + newPlatform.size + newPlatform.xDif > screenWidth)
            {
                MoveScreen(newPlatform.size + newPlatform.xDif);
                currentX -= newPlatform.size + newPlatform.xDif;
                oldX -= newPlatform.size + newPlatform.xDif;
            }

            while (currentX < oldX + newPlatform.size + newPlatform.xDif)
            {
                screen[currentY, currentX] = '=';
                currentX += 1;
            }
            oldX = currentX;
        }

        // Update all rows so the newly added ones fit.
        public void MoveScreen(int amount)
        {
            for (int y = 0; y < screenHeight; y++)
            {
                for (int x = amount; x < screenWidth; x++)
                {
                    screen[y, x - amount] = screen[y, x];
                }
            }
            for (int y = 0; y < screenHeight; y++)
            {
                for (int x = screenWidth - amount; x < screenWidth; x++)
                {
                    screen[y, x] = '\0';
                }
            }
        }
        #endregion
    }
}

1 个答案:

答案 0 :(得分:2)

不确定我是否理解正确,但是

Console.ReadKey(true).Key == ConsoleKey.Spacebar

等待按键发生,因此只有在实际按下按键后,代码才会被处理,如果您删除该程序,因为它不会等待按键发生,因此显然会“更快”地移动