Beispiel #1
0
        static void Main()
        {
            TextInfo textInfo = new CultureInfo("nl-BE", true).TextInfo;

            game = InitGame(ReadStringFromConsole("Before you embark on your grand adventure; what is your name? "));
            int headerHeight;
            int prevLeft, prevTop;

            Console.Clear();

            // game loop: zolang spel niet beëindigd is, huidige kamer weergeven en invoer vragen aan de speler
            while (!game.GameOver)
            {
                prevLeft = Console.CursorLeft;
                prevTop  = Console.CursorTop;

                // kamerinfo weergeven bovenaan scherm
                string lijntje = new string('=', game.World.CurrentRoom.Description.Length);
                headerHeight = 5 + game.World.CurrentRoom.ToString().Length / Console.WindowWidth;
                ClearLine(0, headerHeight);
                Console.SetCursorPosition(0, 0);
                Console.WriteLine(lijntje);
                Console.WriteLine(game.World.CurrentRoom);
                Console.WriteLine(lijntje);

                // als er items in de kamer liggen, een lijstje aan de gebruiker laten zien
                if (game.World.CurrentRoom.Items?.Count > 0)
                {
                    string items = $"You can see: {string.Join(", ", game.World.CurrentRoom.Items)}";
                    ClearLine(headerHeight, 1 + items.Length / Console.WindowWidth);
                    Console.ForegroundColor = neutralColor;
                    Console.WriteLine(items);
                    Console.ResetColor();
                }

                Console.WriteLine();

                if (prevTop != 0)
                {
                    Console.SetCursorPosition(prevLeft, prevTop + 1);
                }

                // invoer vragen aan de gebruiker en dit doorgeven aan de parser
                string command = ReadStringFromConsole($"Ok, {textInfo.ToTitleCase(game.Player.Name)}, what next? ");
                Console.ForegroundColor = higlightColor;
                CommandType commandType = ParseCommand(command, out List <string> keywords);
                switch (commandType)
                {
                case CommandType.Undefined:
                    // parser heeft het commando niet begrepen
                    if (keywords.Contains("help"))
                    {
                        // voor het geval dat de speler hulp vraagt, lijst van beschikbare commando's teruggeven
                        Console.WriteLine("Available commands: use, take, look, move, exit");
                    }
                    else
                    {
                        Console.WriteLine($"I don't know what you mean by that.");
                    }
                    break;

                case CommandType.Use:
                    Console.WriteLine(game.Use(keywords));
                    break;

                case CommandType.Take:
                    // als er geen keywords zijn, heeft de gebruiker gewoon "take" getypt. In dat geval verduidelijking vragen, anders Take methode aanroepen in Game.
                    Console.WriteLine((keywords.Count == 0) ? "Take what?" : game.Take(keywords[0]));
                    break;

                case CommandType.Look:
                    // als er geen keywords zijn, heeft de gebruiker gewoon "look" getypt. In dat geval verduidelijking vragen, anders Look methode aanroepen in Game.
                    Console.WriteLine((keywords.Count == 0) ? "Look at what?" : game.Look(keywords[0]));
                    break;

                case CommandType.Move:
                    if (keywords.Count == 0)
                    {
                        // gebruiker heeft enkel "move" getypt, even verduidelijking vragen.
                        Console.WriteLine("Move to where? (North, East, South or West)");
                    }
                    else
                    {
                        try
                        {
                            if (!game.Move(Game.StringToDirection(keywords[0])))
                            {
                                // huidige kamer heeft geen Exit in de gevraagde Direction
                                Console.WriteLine("There's nothing there...");
                            }
                            else
                            {
                                // game.Move() update automatisch de huidige kamer, dus scherm leegmaken en op naar de volgende iteratie van de while-lus
                                Console.Clear();
                            }
                        }
                        catch (ArgumentOutOfRangeException)
                        {
                            // als StringToDirection een exception gooit, is dat omdat de gebruiker een ongeldige richting heeft ingevoerd
                            Console.WriteLine("That's not a valid direction!");
                        }
                    }
                    break;

                case CommandType.Exit:
                    // gebruiker wilt het spel verlaten
                    game.GameOver = true;
                    break;

                default:
                    // zou niet mogen voorvallen, maar voor het geval dat er een CommandType wordt teruggegeven dat we niet kennen, wat debug info weergeven.
                    Console.WriteLine("ERROR: Unknown {0}: {1}. Keywords: {2}", commandType.GetType().Name, commandType, string.Join(", ", keywords));
                    break;
                }
                Console.ResetColor();
            }

            Console.ForegroundColor = (game.GameWon) ? goodColor : badColor;
            Console.WriteLine(game.GameOverMessage);
            Console.ResetColor();
        }