清除键盘缓冲区或阻止输入(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);
}            
}

最新更新