using Game.Data; using Game.UI; namespace Game { internal class Program { static int Main(string[] args) { CommandLineOptions opts = CommandLineOptions.Parse(args); TextDisplay display = new TextDisplay(); if (!display.InitWindow()) { return 1; } display.PrintSimpleWelcome(); Thread.Sleep(1200); display.ShowSplash(); Thread.Sleep(2500); GameConfig gameConfig; try { GameConfig? existingGameConfig = GameFiles.ReadGameConfig(); if (existingGameConfig == null) { gameConfig = GameFiles.CreateDefaultGameConfig(); } else { gameConfig = existingGameConfig; } } catch { display.ShowFatalError(I18n.GetMessage(I18n.Message.ERROR_READ_CONFIG_UNKNOWN)); Console.ReadKey(); return 2; } string databaseFileName = opts.databaseFilename ?? gameConfig.databasePath; Database questionDatabase; try { questionDatabase = Database.ReadFromFile(databaseFileName); } catch (DatabaseReadException e) { display.ShowFatalError(string.Format(I18n.GetMessage(I18n.Message.SYNTAX_ERROR), I18n.GetMessage(e.messageId), e.line.ToString(), e.column.ToString())); Console.ReadKey(); return 3; } display.ShowMainGameScreenBase(); display.DrawRules(); Console.ReadKey(); Random rng = new Random(); List questions = questionDatabase.questions.OrderBy(_ => rng.Next()).ToList(); int correntAnswers = 0; for (int i = 0; i < questions.Count; ++i) { Question question = questions[i]; display.ShowMainGameScreenBase(); display.DrawText(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, 6, display.windowWidth / 2 + 1, question.question, 0, 0x5e61ed); int x1 = display.windowWidth / 4; int x2 = display.windowWidth * 3 / 4; int y1 = display.windowHeight * 2 / 5; int y2 = Math.Min(y1 + 4, display.windowHeight - 2); int selectedAnswer = 0; bool redraw = true; while (true) { display.DrawTextBox(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, TextDisplay.BoxType.Simple, y1, x1, question.answers[0], selectedAnswer != 0 ? 0xffffff : 0x1a03a0, selectedAnswer != 0 ? 0xffffff : 0x1a03a0, selectedAnswer != 0 ? 0x1a03a0 : 0xffffff); if (question.answers.Count >= 2) display.DrawTextBox(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, TextDisplay.BoxType.Simple, y1, x2, question.answers[1], selectedAnswer != 1 ? 0xffffff : 0x1a03a0, selectedAnswer != 1 ? 0xffffff : 0x1a03a0, selectedAnswer != 1 ? 0x1a03a0 : 0xffffff); if (question.answers.Count >= 3) display.DrawTextBox(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, TextDisplay.BoxType.Simple, y2, x1, question.answers[2], selectedAnswer != 2 ? 0xffffff : 0x1a03a0, selectedAnswer != 2 ? 0xffffff : 0x1a03a0, selectedAnswer != 2 ? 0x1a03a0 : 0xffffff); if (question.answers.Count >= 4) display.DrawTextBox(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, TextDisplay.BoxType.Simple, y2, x2, question.answers[3], selectedAnswer != 3 ? 0xffffff : 0x1a03a0, selectedAnswer != 3 ? 0xffffff : 0x1a03a0, selectedAnswer != 3 ? 0x1a03a0 : 0xffffff); bool end = false; while (true) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.UpArrow) { if (selectedAnswer == 2 || selectedAnswer == 3) { redraw = true; selectedAnswer -= 2; break; } } else if (key.Key == ConsoleKey.DownArrow) { if (selectedAnswer == 0 || selectedAnswer == 1) { redraw = true; selectedAnswer += 2; break; } } else if (key.Key == ConsoleKey.RightArrow) { if (selectedAnswer == 0 || selectedAnswer == 2) { redraw = true; selectedAnswer += 1; break; } } else if (key.Key == ConsoleKey.LeftArrow) { if (selectedAnswer == 1 || selectedAnswer == 3) { redraw = true; selectedAnswer -= 1; break; } } else if (key.Key == ConsoleKey.Enter) { end = true; break; } } if (end) { if (selectedAnswer == question.correctAnswer) { correntAnswers++; } break; } } } display.ShowMainGameScreenBase(); display.DrawText(TextDisplay.HAlignment.Center, TextDisplay.VAlignment.Center, display.windowHeight / 4, display.windowWidth / 2 + 1, String.Format(I18n.GetMessage(I18n.Message.GAME_OVER), correntAnswers, questions.Count), 0xffffff, 0x5e61ed); display.SetCursor(display.windowHeight / 2 + 1, display.windowWidth / 4); display.WriteColored(I18n.GetMessage(I18n.Message.ENTER_NAME), 0, 0x5e61ed); Leaderboard.WriteScore(Console.ReadLine().Replace('\t', '_').Replace(' ', '_'), correntAnswers); display.ResetWindow(); return 0; } } }