我在控制台中制作简单的PRG。
在我的MenuSystem
Console.Clear()
中,我们不会清除其他方法中的文字。
有什么想法吗?
class MenuSystem
{
public static void Controll(int count, List<String> texts)
{
Console.Clear();
int index = 0;
bool isEnter = false;
Write(0, texts);
while (!isEnter)
{
ConsoleKey key = Console.ReadKey().Key;
switch (key)
{
case ConsoleKey.UpArrow:
index -= 1;
break;
case ConsoleKey.DownArrow:
index += 1;
break;
}
if (index > (count - 1))
index = 0;
else if (index < 0)
index = count - 1;
Write(index, texts);
}
}
private static void Write(int index, List<String> texts)
{
Console.Clear();
texts[index] = "[ " + texts[index] + " ]";
foreach (String text in texts)
{
Console.WriteLine(text);
}
}
Write()
中的Console.Clear()无法清除控制台。
答案 0 :(得分:0)
这实际上是对您的问题的回答,但仅仅证明您发布的代码确实有效。
private static void Main()
{
Console.Write("Some Text");
Console.Read(); //Console shows Show Text
MenuSystem.Controll(1, new List<string>() { "string" });
Console.Read(); //Console shows string
}
...
class MenuSystem
{
public static void Controll(int count, List<String> texts)
{
Write(count, texts);
}
private static void Write(int index, List<String> texts) //I don't know why you are passing index as it is never used here.
{
Console.Clear(); //Console is now cleared
foreach (String text in texts)
{
Console.WriteLine(text);
}
}
}
由于您提供的代码正在运行,我只能假设您的完整代码中存在导致问题的其他逻辑。
请使用展示您问题的代码更新您的问题。
答案 1 :(得分:0)
这个例子远非完美,但你会感觉到使用Console.Clear()
:
class Program
{
static void DrawPlayer(int x, int y)
{
for (int i = 0; i < y; i++)
Console.WriteLine();
for (int j = 0; j < x; j++)
Console.Write(' ');
Console.Write("\u25A0");
}
static void Main()
{
int playerX = 0, playerY = 0;
while (true)
{
DrawPlayer(playerX, playerY);
var keyInfo = Console.ReadKey(true);
switch (keyInfo.Key)
{
case ConsoleKey.W:
playerY--;
break;
case ConsoleKey.A:
playerX--;
break;
case ConsoleKey.S:
playerY++;
break;
case ConsoleKey.D:
playerX++;
break;
}
Console.Clear();
}
}
}
答案 2 :(得分:0)
我认为您遇到的问题不在于Console.Clear
(其仅目的是清除屏幕,而不是&#34;来自其他人的明文方法&#34; 如你所知。
问题是你要修改数组中的元素,然后在不修改前一个元素的情况下修改数组中的新元素。如果您想使用当前方法解决此问题,则需要跟踪先前在类级变量中修改的项目,以便在用户更改选择时取消修改它。
但是,我建议采用不同的方法。您应该只更改显示信息的方式,而不是信息本身,而不是修改列表中的字符串。
因此,在应用您的逻辑来检测要选择的索引之后,您只需遍历菜单项并将它们写入屏幕,当您到达所选项目的索引时,您可以编写&#34; [&#34;和&#34;]&#34;周围的人物。对于其他菜单项,您应该用空格字符围绕它们,这样当选择发生变化时,它们就不会在整个地方移动。
请注意,我还做了一个小改动,让菜单水平显示:
class MenuSystem
{
public static void Control(List<string> menuItems)
{
var selectedIndex = 0;
var exitMenu = false;
while (!exitMenu)
{
DisplayMenu(selectedIndex, menuItems);
switch (Console.ReadKey().Key)
{
case ConsoleKey.LeftArrow:
selectedIndex -= 1;
if (selectedIndex < 0) selectedIndex = menuItems.Count - 1;
break;
case ConsoleKey.RightArrow:
selectedIndex += 1;
if (selectedIndex > menuItems.Count - 1) selectedIndex = 0;
break;
case ConsoleKey.Enter:
exitMenu = true;
break;
}
}
}
private static void DisplayMenu(int selectedIndex, List<string> menuItems)
{
Console.Clear();
for (int i = 0; i < menuItems.Count; i++)
{
if (i == selectedIndex)
{
Console.Write("[" + menuItems[i] + "]");
}
else
{
Console.Write(" " + menuItems[i] + " ");
}
Console.Write(" ");
}
}
}