diff --git a/MathGame.Roknikk/MathGame.csproj b/MathGame.Roknikk/MathGame.csproj new file mode 100644 index 00000000..ed9781c2 --- /dev/null +++ b/MathGame.Roknikk/MathGame.csproj @@ -0,0 +1,10 @@ + + + + Exe + net10.0 + enable + enable + + + diff --git a/MathGame.Roknikk/Program.cs b/MathGame.Roknikk/Program.cs new file mode 100644 index 00000000..9d1a71af --- /dev/null +++ b/MathGame.Roknikk/Program.cs @@ -0,0 +1,280 @@ +using System.Diagnostics; + +Random random = new Random(); +Stopwatch timer = new(); + +// Banner Logo. +void BannerLogo() +{ + Console.WriteLine(""" + ________ _ __ __ ______ __ __ ______ ______ +| \ | \ | \ / \ | \ | \ | \ / \ / \ + \$$$$$$$$______ __ __ _______ _| $$_ | $$\ / $$ ______ \$$$$$$_| $$_| $$ _______ | $$$$$$\| $$$$$$\ + | $$ / \ | \ | \ / \| $$ \ | $$$\ / $$$ / \ | $$ | $$ \\$ / \ \$$__| $$ \$$__| $$ + | $$ | $$$$$$\| $$ | $$| $$$$$$$ \$$$$$$ | $$$$\ $$$$| $$$$$$\ | $$ \$$$$$$ | $$$$$$$ | $$ / $$ + | $$ | $$ \$$| $$ | $$ \$$ \ | $$ __ | $$\$$ $$ $$| $$ $$ | $$ | $$ __ \$$ \ __\$$$$$\| $$$$$$ + | $$ | $$ | $$__/ $$ _\$$$$$$\ | $$| \ | $$ \$$$| $$| $$$$$$$$ __ _| $$_ | $$| \ _\$$$$$$\ | \__| $$| $$_____ + | $$ | $$ \$$ $$| $$ \$$ $$ | $$ \$ | $$ \$$ \| \ | $$ \ \$$ $$| $$ \$$ $$| $$ \ + \$$ \$$ \$$$$$$ \$$$$$$$ \$$$$ \$$ \$$ \$$$$$$$| $$ \$$$$$$ \$$$$ \$$$$$$$ \$$$$$$ \$$$$$$$$ + \$ +"""); +} + +// Introductory message. +void WelcomeMessage() +{ + Console.WriteLine(""" + + Welcome to Trust Me, It is 32! + You will have to choose one arithmetic operation, and the game will ask you 5 questions related to it. + For each correct answer, you will gain 1 point ! \(^-^)/. But if your answer is wrong, you will lose 1 point (;_;). + + """); +} + +// Show the menu of all the posible options in the game . +void ShowOperationMenu() +{ + string[] options = {"Addition", "Subtraction", "Multiplication", "Division", "Random Question", "Show previous games"}; + + int optionNumber = 0; + + Console.WriteLine("This is the list of the available options in the game."); + Console.WriteLine(""); + + foreach(string option in options) + { + Console.WriteLine($"{++optionNumber}. {option}");; + } + + Console.WriteLine(""); +} + +// Get the user's choice. +char AskOptionUser() +{ + Console.Write("Enter the number corresponding to the option shown in the menu: "); + + while (true) + { + string? userChosenOption = Console.ReadLine(); + + if(userChosenOption?.Length == 1 && + userChosenOption[0] > '0' && + userChosenOption[0] <= '6') + { + return userChosenOption[0]; + } + else + { + Console.Write("Invalid input. Please try again: "); + Console.WriteLine(""); + } + } +} + + +// Generate the math question. +(int correctAnswer, string question) GenerateMathQuestion(char option) +{ + + short value1 = (short)random.Next(0, 101); + short value2 = (short)random.Next(0, 101); + + switch (option) + { + case '1': + return (value1+value2, $"{value1} + {value2} = "); + + case '2': + return (value1-value2, $"{value1} - {value2} = "); + + case '3': + return (value1*value2, $"{value1} * {value2} = "); + + case '4': + value2 = (short)random.Next(1, 101); + while(value1%value2 != 0) + { + value1 = (short)random.Next(0, 101); + value2 = (short)random.Next(1, 101); + } + return (value1/value2, $"{value1} / {value2} = "); + + default: + return (0, "empty"); + } +} + +// Show the previous games. +void ShowPreviousGames(List> previousGames) +{ + if (previousGames.Count == 0) + { + Console.WriteLine("Sorry, there are no previous games to show."); + } + else + { + Console.WriteLine("These are the available options in the game."); + for (int gameNumber = 1; gameNumber <= previousGames.Count; gameNumber++) + { + Console.WriteLine($"Game {gameNumber}"); + } + + while (true) + { + Console.Write("Which previous game do you want to see? (Enter the number of the game): "); + string? userInput = Console.ReadLine(); + Console.WriteLine(""); + + if(userInput?.Length == 1) + { + if(int.TryParse(userInput, out int showGameNumber) && showGameNumber <= previousGames.Count) + { + foreach (string game in previousGames[showGameNumber-1]) + { + Console.WriteLine(game); + } + Console.WriteLine(""); + break; + } + Console.WriteLine("That game doesn't exist."); + } + } + } +} + + +// Get the user answer. +int GetUserAnswer() +{ + while (true) + { + bool userInput = int.TryParse(Console.ReadLine(), out int userAnswer); + + if (userInput) + { + return userAnswer; + } + else + { + Console.Write("Invalid input. Try again: "); + } + } +} + +// Add or remove a point from the user's score. +int UpdateUserScore (bool answerRight, int userScore) +{ + if (answerRight) + { + ++userScore; + Console.WriteLine($"Excellent! You now have {userScore} points"); + Console.WriteLine(""); + return userScore; + } + else + { + userScore = userScore <= 0? 0 : --userScore; + Console.WriteLine($"Oops! You now have {userScore} points"); + Console.WriteLine(""); + return userScore; + } +} + +// Main application logic. +void RunConsoleApp(List> previousGames) +{ + Console.Clear(); + BannerLogo(); + WelcomeMessage(); + + while (true){ + + int userScore = 0; + int correctAnswer; + string question; + List currentGameHistory = new(); + + ShowOperationMenu(); + + char userChoice = AskOptionUser(); + + // The user wants to see the previous games. + if (userChoice == '6') + { + Console.Clear(); + ShowPreviousGames(previousGames); + + Console.Write("Press any key to go back to the menu"); + Console.ReadKey(); + + Console.Clear(); + + BannerLogo(); + + WelcomeMessage(); + continue; + } + + // Generate the questions based on the selected option. + timer.Start(); //Start the time tracker. + + for (short i = 1; i < 6; i++) + { + // Generate random math questions. + if (userChoice == '5') + { + (correctAnswer, question) = GenerateMathQuestion(random.Next(1, 5).ToString()[0]); + } + else // Questions of just one math operation. + { + (correctAnswer, question) = GenerateMathQuestion(userChoice); + } + + + Console.Write($"{question}"); + + int userAnswer = GetUserAnswer(); + + currentGameHistory.Add($"{question}{userAnswer}"); // Save each question in the game list. + + if (correctAnswer == userAnswer) + { + userScore = UpdateUserScore(true, userScore); + currentGameHistory[i-1] += " -> Correct!"; + } + else + { + userScore = UpdateUserScore(false, userScore); + currentGameHistory[i-1] += " -> Incorrect!"; + } + } + timer.Stop(); + + Console.WriteLine($"Game time: {timer.Elapsed:mm\\:ss}"); + + currentGameHistory.AddRange([$"Score: {userScore}", $"Game time: {timer.Elapsed:mm\\:ss}"]); // Add the score and game time to the game record. + + previousGames.Add(currentGameHistory); // Save all games in a list. + + Console.Write("Do you want to choose another option? Y for yes, any other key for no: "); + string? closeTheGame = Console.ReadLine(); + if (closeTheGame != null && closeTheGame[0] != 'y') // Exit the game. + { + break; + } + + Console.Clear(); + Console.Write("\u001bc\x1b[3J"); // I don't understand how this help to clean the console. But I found the solution in StackOverflow. + BannerLogo(); + } + +} + +// Launch the MathGame. +List> previousGames = new List>(); + +Console.Clear(); + +RunConsoleApp(previousGames); \ No newline at end of file