基本的C#文本冒险被打破了

时间:2015-10-19 05:48:29

标签: c#

当我按下某个键时,它会向我提供与该键相关的所有文本,而不仅仅是第一个WriteLine

例如,即使在第一个屏幕上按Q,也会显示

"the door opens and you are blinded by the sun"
"you walk to the town and are taken back to your cell" 

而不只是让我进入下一个决策点。

class Program
{
    static void Main(string[] args)
    {
        //Int

        //String

        Console.WriteLine("you find yourself in a dark room");
        Thread.Sleep(1000);
        Console.WriteLine("In front of you is a door");
        Thread.Sleep(1000);
        Console.WriteLine("Press 'W' to go through");
        ConsoleKeyInfo key = Console.ReadKey(true);
        if (key.Key == ConsoleKey.W)
        {
            Console.WriteLine("You enter a room with two doors on either side");
            Thread.Sleep(1000);
        }
        Console.WriteLine("Press 'Q' to go left or 'E' to go right");
        {
            if (key.Key == ConsoleKey.E)
            {
                Console.WriteLine("You enter the room to the right and are eaten by a grue");
            }
            else if (key.Key == ConsoleKey.Q)
            {
                Console.WriteLine("The door opens and you are blinded by the sun");
                Thread.Sleep(1000);
                Console.WriteLine("You walk down the road and come to a fork in it");
            }
            Thread.Sleep(1000);
            Console.WriteLine("Press 'Q' to go left, 'E' to go right, or 'W' to pick up the fork!");
            if (key.Key == ConsoleKey.Q)
            {
                Console.WriteLine("You walk to a town and are taken back to your cell by the guards");

            }
        }
        if (key.Key == ConsoleKey.E)
        {
            Console.WriteLine("You escape into the mountains! you win! ");

        }
        else if (key.Key == ConsoleKey.W)
        {
            Console.WriteLine("you pick up the fork unravelling space and time. You monster.");
        }
        Console.ReadLine();
    }
}

我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

每个决策点之前,您需要一个key = Console.ReadKey(true);。 e.g。

Console.WriteLine("Press 'Q' to go left or 'E' to go right");
key = Console.ReadKey(true);

答案 1 :(得分:0)

Kelvin Lai的答案当然是正确的,您收到的单键按键用于整个代码中key.Key的每次测试。您永远不会让用户输入任何其他内容。

通过在IDE中使用内置调试器逐步执行代码,您可以非常简单地找到它。

无论如何,回到问题......

在某些情况下,您已经放置了无用的表达式块,实际上只是隐藏了正在发生的事情。当你在一个表达式中询问用户的问题时,答案(你实际上从未得到过 - 参考主要问题)是在外部块中处理的,这让人感到困惑。

您的格式遍布各处。当您似乎已经不知道如何使代码复杂化时,您希望如何理解您的代码呢?

除了样式外,您的程序是非递归决策树,分支之间不存在连接。如果你想要循环回到前一个房间怎么办...繁荣,你必须从那一点复制整个树。

您可以采取以下措施来解决此问题。

首先,键盘交互。编写一个方法,您可以使用有效键列表调用,并循环等待其中一个键出现。当您有一个决策点呈现给用户时,请使用有效键列表调用该方法。不要忘记包括一些突破和退出程序的方法,虽然好的旧Ctrl-C出口将起作用,除非你禁用它。

接下来,考虑将每个房间作为一个对象铺设。每个人都需要一些基本信息:

  • 身份 - 通常是一个数字,如果您愿意,可以是
  • 房间/情况的描述
  • 可接受的密钥列表,它们的描述以及它们带您的位置

通过这种方式,您可以编写一个外部循环来获取当前房间,显示描述,显示选项并等待用户输入内容,然后选择适当的下一个房间。一旦你拥有它,只需要设置你希望它工作的任何房间列表。

然后它当然允许你有房间循环,分支等,因为你现在有一个地图而不是直树。

当然,如果您使用数据结构而不是代码,那么更改常规流程将变得更简单 。添加房间只是将一些额外信息添加到房间列表并通过选项列表连接到另一个房间。