繁体   English   中英

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

[英]C# Console program runs faster when button is pressed

我出于兴趣,正在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
    }
}

不知道我是否理解正确,但是

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM