清除键盘缓冲区或阻止输入(C#控制台)

斋戒

“为糟糕的编码提前道歉” XD

问题是,当我切换到新地图时,过渡动画开始(变暗并显示新地图)(在代码中,这是NextMap())在此动画期间,我将有时间进行一些其他动作(让我们在左边说),动画结束后,我的角色立即走了相同的步伐,所以我需要他站在地图之间的过渡附近。我想在动画结束时以某种方式清除键盘缓冲区。有可能以某种方式解决这个问题吗?


(为了更好地理解我的问题,请运行此代码并检查我的操作)

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace The_Legend_Of_Game
{
    class Program
    {
        public static ConsoleKey key;
        public static string[] map = new string[9];
        public static int[] playerPos = new int[2];
        public static int[] _playerPosTEMP = new int[2];
        public static string mapNow = "10000";

        static void Main(string[] args)
        {
            playerPos[0] /*y*/ = 4;
            playerPos[1] /*x*/ = 7;

            while (true)
            {
                Console.Clear();
                ShowMap(mapNow);

                key = Console.ReadKey(false).Key;
                ControlButtons(key);

            
            }
        }
    
        static void ShowMap(string mapIndex)
        {
            Console.Clear();

            if (mapIndex == "10000")
            {
                map[0] = "███████████████";
                map[1] = "██████████    █";
                map[2] = "██▒██         █";
                map[3] = "█             █";
                map[4] = "              █";
                map[5] = "█             █";
                map[6] = "█             █";
                map[7] = "█             █";
                map[8] = "███████████████";

                ShowMap_();
            }

            if (mapIndex == "11000")
            {
                map[0] = "███████████████";
                map[1] = "█             █";
                map[2] = "█             █";
                map[3] = "█             █";
                map[4] = "               ";
                map[5] = "█             █";
                map[6] = "█             █";
                map[7] = "█             █";
                map[8] = "███████████████";

                ShowMap_();
            }

            if (mapIndex == "12000")
            {
                map[0] = "███████████████";
                map[1] = "█             █";
                map[2] = "█      *      █";
                map[3] = "█             █";
                map[4] = "               ";
                map[5] = "█             █";
                map[6] = "█             █";
                map[7] = "█             █";
                map[8] = "███████████████";

                ShowMap_();
            }
        }

        static void ShowMap_()
        {
            for (int i = 0; i < 9; i++)
            {
                if (playerPos[0] == i)
                {
                    char[] chars = map[i].ToCharArray();
                    chars[playerPos[1]] = '☺';
                    map[i] = new string(chars);
                }
                Console.WriteLine(map[i]);
            }

            Console.Write("\n");
            Console.WriteLine(mapNow);
        }




    


















        static void ControlButtons(ConsoleKey key)
        {
            if (key == ConsoleKey.UpArrow)
            {
                if (!IsExit(key))
                {
                    if (map[playerPos[0] - 1][playerPos[1]] == '█')
                    {
                        // Nothing
                    }
                    else
                    {
                        playerPos[0]--;
                    }
                }
                else
                {
                    NextRoom1();



                    NextRoom2();
                }
            }
            if (key == ConsoleKey.DownArrow)
            {
                if (!IsExit(key))
                {
                    if (map[playerPos[0] + 1][playerPos[1]] == '█')
                    {
                        // Nothing
                    }
                    else
                    {
                        playerPos[0]++;
                    }
                }
                else
                {
                    NextRoom1();



                    NextRoom2();
                }
            }
            if (key == ConsoleKey.LeftArrow)
            {
                if (!IsExit(key))
                {
                    if (map[playerPos[0]][playerPos[1] - 1] == '█')
                    {
                        // Nothing
                    }
                    else
                    {
                        playerPos[1]--;
                    }
                }
                else
                {
                    NextRoom1();

                    char[] chars = mapNow.ToCharArray();
                    chars[1] = Convert.ToChar(Convert.ToInt32(chars[1]) + 1);
                    mapNow = new string(chars);

                    playerPos[1] = 14;
                    _playerPosTEMP[1] = 14;
                    playerPos[0] = 4;
                    _playerPosTEMP[0] = 4;

                    NextRoom2();
                }
            }
            if (key == ConsoleKey.RightArrow)
            {
                if (!IsExit(key))
                {
                    if (map[playerPos[0]][playerPos[1] + 1] == '█')
                    {
                        // Nothing
                    }
                    else
                    {
                        playerPos[1]++;
                    }
                }
                else
                {
                    NextRoom1();

                    char[] chars = mapNow.ToCharArray();
                    chars[1] = Convert.ToChar(Convert.ToInt32(chars[1]) - 1);
                    mapNow = new string(chars);

                    playerPos[1] = 0;
                    _playerPosTEMP[1] = 0;
                    playerPos[0] = 4;
                    _playerPosTEMP[0] = 4;

                    NextRoom2();
                }
            }
        }










        static bool IsExit(ConsoleKey key)
        {
            if (key == ConsoleKey.UpArrow && playerPos[0] - 1 < 0 ||
                key == ConsoleKey.DownArrow && playerPos[0] + 1 > 8 ||
                key == ConsoleKey.LeftArrow && playerPos[1] - 1 < 0 ||
                key == ConsoleKey.RightArrow && playerPos[1] + 1 > 14)
            {
            
                return true;
            }

            else
            {
                return false;
            }
        }







        static void NextRoom1()
        {
            Thread.Sleep(200);
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            ShowMap(mapNow);

            Thread.Sleep(200);
            Console.ForegroundColor = ConsoleColor.Black;
            ShowMap(mapNow);
        }

        static void NextRoom2()
        {
            Thread.Sleep(200);
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            ShowMap(mapNow);

            Thread.Sleep(200);
            Console.ForegroundColor = ConsoleColor.Green;
            ShowMap(mapNow);
        }
    }
}
闲置心智

NextRoomX()方法的底部,调用ClearBuffer()

static void ClearBuffer()
{
    while (Console.KeyAvailable) {
        Console.ReadKey(false);
    }            
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重定向输出时,为什么调整控制台缓冲区会引发无效的句柄异常?

来自分类Dev

读取控制台缓冲区/输出C ++

来自分类Dev

getch()和getchar()清除输入缓冲区的用法的区别?

来自分类Dev

在另一个输入请求之前清除cin缓冲区,c ++

来自分类Dev

清除键盘缓冲区

来自分类Dev

清除主机后如何获取控制台缓冲区历史记录?

来自分类Dev

防止用户在C#中输入空控制台

来自分类Dev

清除cout缓冲区(C ++)

来自分类Dev

c#控制台输入与输出混合

来自分类Dev

在C中的fgets()之后清除输入缓冲区

来自分类Dev

scanf读取后输入缓冲区是否被清除?

来自分类Dev

C#.NET控制台应用程序获取键盘输入

来自分类Dev

在C#中清除鼠标缓冲区

来自分类Dev

VNC:控制台不接受任何键盘/鼠标输入

来自分类Dev

清除rubymine 6的控制台键盘快捷键

来自分类Dev

如何在VBNET中读取控制台缓冲区?

来自分类Dev

读取控制台缓冲区/输出C ++

来自分类Dev

Python:清除标准输入缓冲区

来自分类Dev

在C#中从控制台验证DateTime输入

来自分类Dev

在将视频渲染到帧缓冲区时隐藏虚拟控制台的最佳实践

来自分类Dev

检查cin输入,清除输入缓冲区

来自分类Dev

如何将Windows 10控制台屏幕缓冲区更改为超过9999?

来自分类Dev

C#控制台输入

来自分类Dev

C#:使用输入控制台优化错误预防

来自分类Dev

在C#中同步缓冲区

来自分类Dev

C++ 控制台不接受键盘输入

来自分类Dev

读取c中的输入后如何清除缓冲区?

来自分类Dev

在 C++ 中清除空输入缓冲区的安全操作

来自分类Dev

c#控制台输入大写锁定