From 8324ae75c2ad648c17225b02a6154305dc7ec599 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Sun, 2 Aug 2026 22:41:49 +0200 Subject: [PATCH 01/26] Thanks for your great work! --- mathGame.MichaelHelgesen/Game.cs | 10 ++ mathGame.MichaelHelgesen/MathQuestion.cs | 8 ++ mathGame.MichaelHelgesen/PlayGame.cs | 119 ++++++++++++++++++++++ mathGame.MichaelHelgesen/PlayerMenu.cs | 57 +++++++++++ mathGame.MichaelHelgesen/Program.cs | 75 ++++++++++++++ mathGame.MichaelHelgesen/math_game.csproj | 10 ++ 6 files changed, 279 insertions(+) create mode 100644 mathGame.MichaelHelgesen/Game.cs create mode 100644 mathGame.MichaelHelgesen/MathQuestion.cs create mode 100644 mathGame.MichaelHelgesen/PlayGame.cs create mode 100644 mathGame.MichaelHelgesen/PlayerMenu.cs create mode 100644 mathGame.MichaelHelgesen/Program.cs create mode 100644 mathGame.MichaelHelgesen/math_game.csproj diff --git a/mathGame.MichaelHelgesen/Game.cs b/mathGame.MichaelHelgesen/Game.cs new file mode 100644 index 00000000..ecd963bf --- /dev/null +++ b/mathGame.MichaelHelgesen/Game.cs @@ -0,0 +1,10 @@ +// Hva betyr static og ikke static igjen? +public class Game +{ + public int GameNumber { get; set; } + public int GameScore { get; set; } + public string GameType { get; set; } + public string PlayerName { get; set;} + public List Questions { get; set; } = new List(); + +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/MathQuestion.cs b/mathGame.MichaelHelgesen/MathQuestion.cs new file mode 100644 index 00000000..124e65bf --- /dev/null +++ b/mathGame.MichaelHelgesen/MathQuestion.cs @@ -0,0 +1,8 @@ +public struct MathQuestion +{ + public string QuestionText { get; set; } + public int CorrectAnswer { get; set; } + public int PlayerAnswer { get; set; } + + public bool IsCorrect => PlayerAnswer == CorrectAnswer; +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/PlayGame.cs b/mathGame.MichaelHelgesen/PlayGame.cs new file mode 100644 index 00000000..961fd847 --- /dev/null +++ b/mathGame.MichaelHelgesen/PlayGame.cs @@ -0,0 +1,119 @@ +public static class PlayGame +{ + public static Game StartGame(int selectedGame, string playerName, int gameNumber) + { + int gameRounds = 1; + int gameScore = 0; + + var (operand, gameType) = selectedGame switch + { + 1 => ("+", "addition"), + 2 => ("*", "multiplication"), + 3 => ("/", "division"), + _ => ("-", "subtraction"), + }; + + Game game = new Game + { + GameNumber = gameNumber, + GameType = gameType + }; + + Console.Clear(); + Console.WriteLine($"You chose {gameType}!\n\nTry to solve five math problems in a row\n\nPress enter when ready {playerName}!"); + + while (Console.ReadKey(true).Key != ConsoleKey.Enter) + { + // Ignorerer alle andre taster lydløst + } + + // -- Egen metode gather valid answer -- + do + { + int a = Random.Shared.Next(1, 11); + int b = Random.Shared.Next(0, 11); + int c = a * b; + bool validAnswer = false; + int answer = 0; + int correctAnswer; + + Console.Clear(); + if (selectedGame == 3) + Console.WriteLine($"Question {gameRounds}/5: What is {c} {operand} {a}?"); + + else + Console.WriteLine($"Question {gameRounds}/5: What is {a} {operand} {b}?"); + + do + { + try + { + answer = int.Parse(Console.ReadLine()); + validAnswer = true; + + } + catch (FormatException ex) + { + Console.WriteLine($"Only use numbers. Please try again!"); + } + } + while (!validAnswer); + + // -- Egen metode create math problem // + if (selectedGame == 1) + correctAnswer = a + b; + + else if (selectedGame == 2) + correctAnswer = a * b; + + else if (selectedGame == 3) + correctAnswer = c / a; + + else correctAnswer = a - b; + + MathQuestion newTask = new MathQuestion + { + QuestionText = $"{a} {operand} {b}", + CorrectAnswer = correctAnswer, + PlayerAnswer = answer + }; + + if (newTask.IsCorrect) + { + gameScore++; + } + + game.Questions.Add(newTask); + gameRounds++; + } + while (gameRounds < 6); + + Console.Clear(); + Console.WriteLine($"Game over for game number {gameNumber}. You scored {gameScore} points.\nHere are the results:\n"); + game.GameScore = gameScore; + + // -- Egen metode display result -- + foreach (var q in game.Questions) + { + Console.WriteLine($"{q.QuestionText} = {q.CorrectAnswer}\tYour answer: {q.PlayerAnswer}"); + } + + // -- Egen metode play again-- + Console.WriteLine("\nDo you want to play again? (Y/N): "); + + ConsoleKeyInfo tastInput; + do + { + // tar imot tastetrykk uten at brukeren må trykke Enter + tastInput = Console.ReadKey(intercept: true); + } while (tastInput.Key != ConsoleKey.Y && tastInput.Key != ConsoleKey.N); + + if (tastInput.Key == ConsoleKey.N) + { + Console.WriteLine("Bye"); + Environment.Exit(0); + } + + return game; + } +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/PlayerMenu.cs b/mathGame.MichaelHelgesen/PlayerMenu.cs new file mode 100644 index 00000000..0d02cb78 --- /dev/null +++ b/mathGame.MichaelHelgesen/PlayerMenu.cs @@ -0,0 +1,57 @@ + +public static class PlayerMenu +{ + public static int GeneratePlayerMenu(int gameNumber, string playerName) + { + ConsoleKeyInfo tastInput; + int selectedGame; + bool validPlayerChoise = false; + + List allMenuChoices = new List { + "Press 1 for addition (+)", + "Press 2 for multiplication (*)", + "Press 3 for division (/)", + "Press 4 for subtraction (-)", + "Press 5 for game results", + "Press Esc to quit" + }; + + List activeMenuChoices = new List(); + + for (int i = 0; i < 4; i++) + { + activeMenuChoices.Add(allMenuChoices[i]); + } + + if (gameNumber > 1) + activeMenuChoices.Add(allMenuChoices[4]); + + activeMenuChoices.Add(allMenuChoices[5]); + + Console.Clear(); + Console.WriteLine($"Choose your prefered game, {playerName}:\n"); + + foreach (string menuElement in activeMenuChoices) + { + Console.WriteLine(menuElement); + } + + do + { + tastInput = Console.ReadKey(intercept: true); + if (((int)char.GetNumericValue(tastInput.KeyChar) > 0 && (int)char.GetNumericValue(tastInput.KeyChar) < activeMenuChoices.Count) || tastInput.Key == ConsoleKey.Escape) + { + validPlayerChoise = true; + } + } while (!validPlayerChoise); + + if (tastInput.Key == ConsoleKey.Escape) { + selectedGame = -1; + } else + { + selectedGame = (int)char.GetNumericValue(tastInput.KeyChar); + } + + return selectedGame; + } +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Program.cs b/mathGame.MichaelHelgesen/Program.cs new file mode 100644 index 00000000..83b17e58 --- /dev/null +++ b/mathGame.MichaelHelgesen/Program.cs @@ -0,0 +1,75 @@ +List FinishedGamesArchive = new List(); +string playerName = "unknown"; +int numberOfRounds = 0; +bool displayGameMenu = false; +bool playerIsPlaying = false; +int chosenGame = 0; + +Console.WriteLine("-- Welcome to the Math Game! --"); +Console.Write("Please enter your name: "); + +while (chosenGame != -1) +{ + // Register name + if (numberOfRounds == 0) + { + playerName = Console.ReadLine(); + ++numberOfRounds; + Console.WriteLine(numberOfRounds); + displayGameMenu = true; + } + + // Generate menu + if (displayGameMenu) + { + chosenGame = PlayerMenu.GeneratePlayerMenu(numberOfRounds, playerName); + displayGameMenu = false; + playerIsPlaying = true; + if (chosenGame == -1) + { + Console.WriteLine("Bye"); + Environment.Exit(0); + } + } + + // Start game + if (playerIsPlaying && chosenGame != 5) + { + Console.Clear(); + FinishedGamesArchive.Add(PlayGame.StartGame(chosenGame, playerName, numberOfRounds)); + numberOfRounds++; + playerIsPlaying = false; + displayGameMenu = true; + } + + // View results + if (chosenGame == 5) + { + Console.Clear(); + foreach (var g in FinishedGamesArchive) + { + Console.WriteLine($"Game number {g.GameNumber}"); + Console.WriteLine($"Question\tCorrect answer\tPlayer answer\tResult"); + //int score; + foreach (var question in g.Questions) + { + Console.WriteLine($"{question.QuestionText}\t\t{question.CorrectAnswer}\t\t{question.PlayerAnswer}\t\t{question.IsCorrect}"); + + } + Console.WriteLine($"\nScore: {g.GameScore} \n"); + } + + Console.WriteLine("\nPress enter to return to menu"); + while (Console.ReadKey(true).Key != ConsoleKey.Enter) + { + // Ignorerer alle andre taster lydløst + } + displayGameMenu = true; + chosenGame = 0; + } + +} + +Console.WriteLine("Bye"); + + diff --git a/mathGame.MichaelHelgesen/math_game.csproj b/mathGame.MichaelHelgesen/math_game.csproj new file mode 100644 index 00000000..2150e379 --- /dev/null +++ b/mathGame.MichaelHelgesen/math_game.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + From 3ae03176b8c86b8f0a8c5e7feabca96b40edafa6 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Tue, 18 Aug 2026 21:37:08 +0200 Subject: [PATCH 02/26] feat(menu): add MenuController and split menu logic into sub-components -Create Enums for menu options Add MenuController Split menu logic into sub-components --- .../Controllers/MenuController.cs | 53 +++++++++++++ mathGame.MichaelHelgesen/Enums/Enums.cs | 12 +++ mathGame.MichaelHelgesen/Program-old.cs | 77 +++++++++++++++++++ mathGame.MichaelHelgesen/Program.cs | 76 +----------------- mathGame.MichaelHelgesen/math_game.csproj | 4 + 5 files changed, 148 insertions(+), 74 deletions(-) create mode 100644 mathGame.MichaelHelgesen/Controllers/MenuController.cs create mode 100644 mathGame.MichaelHelgesen/Enums/Enums.cs create mode 100644 mathGame.MichaelHelgesen/Program-old.cs diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs new file mode 100644 index 00000000..4ed47087 --- /dev/null +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -0,0 +1,53 @@ +namespace mathGame.MichaelHelgesen.Controllers; +using mathGame.MichaelHelgesen.Enums; +using Spectre.Console; + +internal class MenuController +{ + internal static void Run() + { + ShowWelcomeMessage(); + var playerChoice = PromptMenu(); + ExecutePlayerChoice(playerChoice); + } + + private static void ShowWelcomeMessage() + { + AnsiConsole.MarkupLine("[bold blue]Welcome[/] to [green]the Math Game[/]!"); + } + + private static MenuItems PromptMenu() + { + var menuChoices = AnsiConsole.Prompt( + new SelectionPrompt() + .Title("Choose [green]game type[/] would you like?") + .AddChoices(Enum.GetValues())); + return menuChoices; + } + + private static void ExecutePlayerChoice(MenuItems playerChoice) + { + switch (playerChoice) + { + case MenuItems.Addition: + AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + break; + case MenuItems.Multiplication: + AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + break; + case MenuItems.Division: + AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + break; + case MenuItems.Subtraction: + AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + break; + case MenuItems.Results: + AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + break; + default: + AnsiConsole.MarkupLine($"By bye"); + break; + } + } + +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Enums/Enums.cs b/mathGame.MichaelHelgesen/Enums/Enums.cs new file mode 100644 index 00000000..732b47f4 --- /dev/null +++ b/mathGame.MichaelHelgesen/Enums/Enums.cs @@ -0,0 +1,12 @@ +namespace mathGame.MichaelHelgesen.Enums; + + +internal enum MenuItems +{ + Addition, + Multiplication, + Division, + Subtraction, + Results, + Quit +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Program-old.cs b/mathGame.MichaelHelgesen/Program-old.cs new file mode 100644 index 00000000..f0780b9c --- /dev/null +++ b/mathGame.MichaelHelgesen/Program-old.cs @@ -0,0 +1,77 @@ +/* +List FinishedGamesArchive = new List(); +string playerName = "unknown"; +int numberOfRounds = 0; +bool displayGameMenu = false; +bool playerIsPlaying = false; +int chosenGame = 0; + +Console.WriteLine("-- Welcome to the Math Game! --"); +Console.Write("Please enter your name: "); + +while (chosenGame != -1) +{ + // Register name + if (numberOfRounds == 0) + { + playerName = Console.ReadLine(); + ++numberOfRounds; + Console.WriteLine(numberOfRounds); + displayGameMenu = true; + } + + // Generate menu + if (displayGameMenu) + { + chosenGame = PlayerMenu.GeneratePlayerMenu(numberOfRounds, playerName); + displayGameMenu = false; + playerIsPlaying = true; + if (chosenGame == -1) + { + Console.WriteLine("Bye"); + Environment.Exit(0); + } + } + + // Start game + if (playerIsPlaying && chosenGame != 5) + { + Console.Clear(); + FinishedGamesArchive.Add(PlayGame.StartGame(chosenGame, playerName, numberOfRounds)); + numberOfRounds++; + playerIsPlaying = false; + displayGameMenu = true; + } + + // View results + if (chosenGame == 5) + { + Console.Clear(); + foreach (var g in FinishedGamesArchive) + { + Console.WriteLine($"Game number {g.GameNumber}"); + Console.WriteLine($"Question\tCorrect answer\tPlayer answer\tResult"); + //int score; + foreach (var question in g.Questions) + { + Console.WriteLine($"{question.QuestionText}\t\t{question.CorrectAnswer}\t\t{question.PlayerAnswer}\t\t{question.IsCorrect}"); + + } + Console.WriteLine($"\nScore: {g.GameScore} \n"); + } + + Console.WriteLine("\nPress enter to return to menu"); + while (Console.ReadKey(true).Key != ConsoleKey.Enter) + { + // Ignorerer alle andre taster lydløst + } + displayGameMenu = true; + chosenGame = 0; + } + +} + +Console.WriteLine("Bye"); + + +*/ \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Program.cs b/mathGame.MichaelHelgesen/Program.cs index 83b17e58..16a61ed8 100644 --- a/mathGame.MichaelHelgesen/Program.cs +++ b/mathGame.MichaelHelgesen/Program.cs @@ -1,75 +1,3 @@ -List FinishedGamesArchive = new List(); -string playerName = "unknown"; -int numberOfRounds = 0; -bool displayGameMenu = false; -bool playerIsPlaying = false; -int chosenGame = 0; - -Console.WriteLine("-- Welcome to the Math Game! --"); -Console.Write("Please enter your name: "); - -while (chosenGame != -1) -{ - // Register name - if (numberOfRounds == 0) - { - playerName = Console.ReadLine(); - ++numberOfRounds; - Console.WriteLine(numberOfRounds); - displayGameMenu = true; - } - - // Generate menu - if (displayGameMenu) - { - chosenGame = PlayerMenu.GeneratePlayerMenu(numberOfRounds, playerName); - displayGameMenu = false; - playerIsPlaying = true; - if (chosenGame == -1) - { - Console.WriteLine("Bye"); - Environment.Exit(0); - } - } - - // Start game - if (playerIsPlaying && chosenGame != 5) - { - Console.Clear(); - FinishedGamesArchive.Add(PlayGame.StartGame(chosenGame, playerName, numberOfRounds)); - numberOfRounds++; - playerIsPlaying = false; - displayGameMenu = true; - } - - // View results - if (chosenGame == 5) - { - Console.Clear(); - foreach (var g in FinishedGamesArchive) - { - Console.WriteLine($"Game number {g.GameNumber}"); - Console.WriteLine($"Question\tCorrect answer\tPlayer answer\tResult"); - //int score; - foreach (var question in g.Questions) - { - Console.WriteLine($"{question.QuestionText}\t\t{question.CorrectAnswer}\t\t{question.PlayerAnswer}\t\t{question.IsCorrect}"); - - } - Console.WriteLine($"\nScore: {g.GameScore} \n"); - } - - Console.WriteLine("\nPress enter to return to menu"); - while (Console.ReadKey(true).Key != ConsoleKey.Enter) - { - // Ignorerer alle andre taster lydløst - } - displayGameMenu = true; - chosenGame = 0; - } - -} - -Console.WriteLine("Bye"); - +using mathGame.MichaelHelgesen.Controllers; +MenuController.Run(); \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/math_game.csproj b/mathGame.MichaelHelgesen/math_game.csproj index 2150e379..2d744420 100644 --- a/mathGame.MichaelHelgesen/math_game.csproj +++ b/mathGame.MichaelHelgesen/math_game.csproj @@ -7,4 +7,8 @@ enable + + + + From 80aa03817e03e2a1f4c6812a885fd2878cbcd3c4 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Tue, 18 Aug 2026 21:59:18 +0200 Subject: [PATCH 03/26] feat(GameController): Added GameController file --- .../Controllers/GameController.cs | 8 +++++++ .../Controllers/MenuController.cs | 24 +++++++++---------- mathGame.MichaelHelgesen/Enums/Enums.cs | 1 - 3 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 mathGame.MichaelHelgesen/Controllers/GameController.cs diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs new file mode 100644 index 00000000..a298bb22 --- /dev/null +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -0,0 +1,8 @@ +namespace mathGame.MichaelHelgesen.Controllers; +public class GameController() +{ + public static void StartGame() + { + Console.WriteLine("Spiller"); + } +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 4ed47087..0327fa62 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -2,6 +2,15 @@ namespace mathGame.MichaelHelgesen.Controllers; using mathGame.MichaelHelgesen.Enums; using Spectre.Console; + +//You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. +//A game needs to have at least 5 questions. +//The divisions should result on INTEGERS ONLY and dividends should go from 0 to 100. Example: Your app shouldn't present the division 7/2 to the user, since it doesn't result in an integer. +//Users should be presented with a menu to choose an operation +//You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. +//You don't need to record results on a database. Once the program is closed the results will be deleted. + + internal class MenuController { internal static void Run() @@ -29,25 +38,16 @@ private static void ExecutePlayerChoice(MenuItems playerChoice) { switch (playerChoice) { - case MenuItems.Addition: - AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); - break; - case MenuItems.Multiplication: - AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); - break; - case MenuItems.Division: - AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); - break; - case MenuItems.Subtraction: + case MenuItems.Quit: AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); break; case MenuItems.Results: AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); break; default: - AnsiConsole.MarkupLine($"By bye"); + //AnsiConsole.MarkupLine($"Spill spill"); + GameController.StartGame(); break; } } - } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Enums/Enums.cs b/mathGame.MichaelHelgesen/Enums/Enums.cs index 732b47f4..745ad33e 100644 --- a/mathGame.MichaelHelgesen/Enums/Enums.cs +++ b/mathGame.MichaelHelgesen/Enums/Enums.cs @@ -1,6 +1,5 @@ namespace mathGame.MichaelHelgesen.Enums; - internal enum MenuItems { Addition, From a8bdf7102f84eb565bda8a3d762caad8e4ebc5ed Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Tue, 18 Aug 2026 22:40:55 +0200 Subject: [PATCH 04/26] feat(GameController): Added Start Message method --- .../Controllers/GameController.cs | 22 ++++++++++++++++--- .../Controllers/MenuController.cs | 18 ++++++++------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index a298bb22..8a4a4fc5 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -1,8 +1,24 @@ +using mathGame.MichaelHelgesen.Enums; +using Spectre.Console; + namespace mathGame.MichaelHelgesen.Controllers; public class GameController() { - public static void StartGame() + // DONE: Display message + // Play 5 rounds + // Archive game + + internal static void PlayGame(MenuItems gameType) { - Console.WriteLine("Spiller"); + DisplayStartMessage(gameType); + PlayGame(gameType); } -} \ No newline at end of file + + internal static void DisplayStartMessage(MenuItems gameType) + { + AnsiConsole.Prompt( + new TextPrompt($"You selected: [yellow]{gameType}[/]. [grey]Press [bold]Enter[/] to continue...[/]") + .AllowEmpty() +); + } +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 0327fa62..5098b393 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -2,14 +2,16 @@ namespace mathGame.MichaelHelgesen.Controllers; using mathGame.MichaelHelgesen.Enums; using Spectre.Console; +// DONE: Users should be presented with a menu to choose an operation -//You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. -//A game needs to have at least 5 questions. -//The divisions should result on INTEGERS ONLY and dividends should go from 0 to 100. Example: Your app shouldn't present the division 7/2 to the user, since it doesn't result in an integer. -//Users should be presented with a menu to choose an operation -//You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. -//You don't need to record results on a database. Once the program is closed the results will be deleted. - +// TODO: You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. +// TODO: A game needs to have at least 5 questions. +// TODO: The divisions should result on INTEGERS ONLY and dividends should go from 0 to 100. Example: Your app shouldn't present the division 7/2 to the user, since it doesn't result in an integer. +// TODO: You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. +// TODO: Try to implement levels of difficulty. +// TODO: Add a timer to track how long the user takes to finish the game. +// TODO: Create a 'Random Game' option where the players will be presented with questions from random operations +// TODO: To follow the DRY Principle, try using just one method for all games. Additionally, double check your project and try to find opportunities to achieve the same functionality with less code, avoiding repetition when possible. internal class MenuController { @@ -46,7 +48,7 @@ private static void ExecutePlayerChoice(MenuItems playerChoice) break; default: //AnsiConsole.MarkupLine($"Spill spill"); - GameController.StartGame(); + GameController.PlayGame(playerChoice); break; } } From e6dc5fe0cb686af7d18e235642293638e064bf26 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Tue, 18 Aug 2026 22:43:11 +0200 Subject: [PATCH 05/26] feat(GameModel): Added Game model --- mathGame.MichaelHelgesen/Models/PlayGame.cs | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mathGame.MichaelHelgesen/Models/PlayGame.cs diff --git a/mathGame.MichaelHelgesen/Models/PlayGame.cs b/mathGame.MichaelHelgesen/Models/PlayGame.cs new file mode 100644 index 00000000..c1da186c --- /dev/null +++ b/mathGame.MichaelHelgesen/Models/PlayGame.cs @@ -0,0 +1,2 @@ +namespace mathGame.MichaelHelgesen.Models; + From 91e3cf8e2be83eb848f4c37cd90955bad1863e9d Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Wed, 19 Aug 2026 10:37:32 +0200 Subject: [PATCH 06/26] feat(Game model): Added rounds and GameData class --- .../Controllers/GameController.cs | 11 +++--- .../Controllers/MenuController.cs | 2 +- mathGame.MichaelHelgesen/Models/Game.cs | 35 +++++++++++++++++++ .../Models/MathProblem.cs | 9 +++++ mathGame.MichaelHelgesen/Models/PlayGame.cs | 2 -- mathGame.MichaelHelgesen/math_game.csproj | 2 +- 6 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 mathGame.MichaelHelgesen/Models/Game.cs create mode 100644 mathGame.MichaelHelgesen/Models/MathProblem.cs delete mode 100644 mathGame.MichaelHelgesen/Models/PlayGame.cs diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index 8a4a4fc5..a42fd638 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -1,17 +1,20 @@ +namespace mathGame.MichaelHelgesen.Controllers; using mathGame.MichaelHelgesen.Enums; +using mathGame.MichaelHelgesen.Models; using Spectre.Console; -namespace mathGame.MichaelHelgesen.Controllers; + public class GameController() { // DONE: Display message - // Play 5 rounds + // Play Game // Archive game - internal static void PlayGame(MenuItems gameType) + internal static void StartGame(MenuItems gameType) { + // var game = List of rounds? DisplayStartMessage(gameType); - PlayGame(gameType); + Game.PlayGame(gameType); } internal static void DisplayStartMessage(MenuItems gameType) diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 5098b393..b9ca555b 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -48,7 +48,7 @@ private static void ExecutePlayerChoice(MenuItems playerChoice) break; default: //AnsiConsole.MarkupLine($"Spill spill"); - GameController.PlayGame(playerChoice); + GameController.StartGame(playerChoice); break; } } diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs new file mode 100644 index 00000000..f2d34fd6 --- /dev/null +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -0,0 +1,35 @@ +namespace mathGame.MichaelHelgesen.Models; + +using mathGame.MichaelHelgesen.Enums; +using Microsoft.VisualBasic; +using Spectre.Console; + +internal class Game +{ + private static int numberOfRounds = 5; + + internal List playedGame; + + public class GameData + { + public string GameType { get; set; } + //public List Rounds { get; set; } = new List(); + } + + internal static void PlayGame(MenuItems gameType) + { + GameData playedGame = new GameData(); + playedGame.GameType = gameType.ToString(); + + for (int i = 0; i < numberOfRounds; i++) + { + // Create math problem + // Save user input + // Add to Game-object + AnsiConsole.MarkupLine($"[bold blue]Spørsmål {i + 1} av 5[/]"); + int svar = AnsiConsole.Ask("Hva er [green]5 + 5[/]?"); + } + Console.WriteLine(playedGame.GameType); + // return playedGame; + } +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs new file mode 100644 index 00000000..e2b4c095 --- /dev/null +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -0,0 +1,9 @@ +namespace mathGame.MichaelHelgesen.Models; + +internal class MathProblem +{ + internal int CreateMathProblem() + { + return 1; + } +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/PlayGame.cs b/mathGame.MichaelHelgesen/Models/PlayGame.cs deleted file mode 100644 index c1da186c..00000000 --- a/mathGame.MichaelHelgesen/Models/PlayGame.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace mathGame.MichaelHelgesen.Models; - diff --git a/mathGame.MichaelHelgesen/math_game.csproj b/mathGame.MichaelHelgesen/math_game.csproj index 2d744420..04af1154 100644 --- a/mathGame.MichaelHelgesen/math_game.csproj +++ b/mathGame.MichaelHelgesen/math_game.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net9.0 enable enable From dfc7df0c3934b87e6cc877d5d6ffe34a1a65d516 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Wed, 19 Aug 2026 15:32:39 +0200 Subject: [PATCH 07/26] feat(game): Add Dice, MathProblem and PlayerAnswer models --- mathGame.MichaelHelgesen/Models/Dice.cs | 10 +++ mathGame.MichaelHelgesen/Models/Game.cs | 65 +++++++++++++++---- .../Models/MathProblem.cs | 23 ++++++- .../Models/PlayerAnswer.cs | 16 +++++ 4 files changed, 98 insertions(+), 16 deletions(-) create mode 100644 mathGame.MichaelHelgesen/Models/Dice.cs create mode 100644 mathGame.MichaelHelgesen/Models/PlayerAnswer.cs diff --git a/mathGame.MichaelHelgesen/Models/Dice.cs b/mathGame.MichaelHelgesen/Models/Dice.cs new file mode 100644 index 00000000..19d75b83 --- /dev/null +++ b/mathGame.MichaelHelgesen/Models/Dice.cs @@ -0,0 +1,10 @@ +namespace mathGame.MichaelHelgesen.Models; + +internal static class Dice +{ + internal static int RollDice(int difficulty) + { + Random random = new(); + return random.Next(0,difficulty); + } +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index f2d34fd6..225c4a14 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -6,30 +6,67 @@ namespace mathGame.MichaelHelgesen.Models; internal class Game { - private static int numberOfRounds = 5; + private static int numberOfTurns = 5; - internal List playedGame; + internal static List gameTurns = new(); - public class GameData + public class GameTurn { - public string GameType { get; set; } - //public List Rounds { get; set; } = new List(); + public MathProblem MathProblem { get; set; } + public PlayerAnswer PlayerAnswer { get; set; } + public int TurnNumber { get; set; } } - + /* + public class GameData + { + public string GameType { get; set; } + public List Rounds { get; set; } = new List(); + } + */ internal static void PlayGame(MenuItems gameType) { - GameData playedGame = new GameData(); - playedGame.GameType = gameType.ToString(); + //GameData playedGame = new GameData(); + //playedGame.GameType = gameType.ToString(); - for (int i = 0; i < numberOfRounds; i++) + for (int i = 0; i < numberOfTurns; i++) { - // Create math problem - // Save user input - // Add to Game-object + // Initialize turn + GameTurn gameTurn = new(); + + // Roll dice 1 + int dice1 = Dice.RollDice(10); + // Roll dice 2 + int dice2 = Dice.RollDice(10); + + // Create math problem(dice1, dice2, operator) + MathProblem mathProblem = new MathProblem(dice1, dice2, "+"); + + // Turn number AnsiConsole.MarkupLine($"[bold blue]Spørsmål {i + 1} av 5[/]"); - int svar = AnsiConsole.Ask("Hva er [green]5 + 5[/]?"); + + // Generate question + collect answer + int svar = AnsiConsole.Ask($"Hva er [green]{dice1} + {dice2}[/]?"); + + // Player answer + PlayerAnswer playerAnswer = new PlayerAnswer(mathProblem.MathProblemAsString, mathProblem.CorrectAnswer, svar); + + // Add math problem to list + gameTurn.MathProblem = mathProblem; + + // Add + + gameTurn.PlayerAnswer = playerAnswer; + gameTurn.TurnNumber = i + 1; + gameTurns.Add(gameTurn); + + } + foreach (var item in gameTurns) + { + Console.WriteLine(item.MathProblem.MathProblemAsString); + Console.WriteLine(item.PlayerAnswer.Answer); + Console.WriteLine(item.PlayerAnswer.IsCorrect); + Console.WriteLine(item.TurnNumber); } - Console.WriteLine(playedGame.GameType); // return playedGame; } } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index e2b4c095..e994e70d 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -2,8 +2,27 @@ namespace mathGame.MichaelHelgesen.Models; internal class MathProblem { - internal int CreateMathProblem() + public int Number1 { get; } + public int Number2 { get; } + public string Operator { get; } + + // Konstruktør som setter tallene når oppgaven lages + public MathProblem(int number1, int number2, string op) { - return 1; + Number1 = number1; + Number2 = number2; + Operator = op; } + + public int CorrectAnswer => Operator switch + { + "+" => Number1 + Number2, + "-" => Number1 - Number2, + "*" => Number1 * Number2, + "/" => Number1 / Number2, + _ => 0 + }; + + public string MathProblemAsString => $"{Number1} {Operator} {Number2}"; + } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs new file mode 100644 index 00000000..79ef4e44 --- /dev/null +++ b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs @@ -0,0 +1,16 @@ +namespace mathGame.MichaelHelgesen.Models; + +internal class PlayerAnswer +{ + public string MathProblem { get; set; } + public int CorrectAnswer { get; set; } + public int Answer { get; set; } + + public PlayerAnswer(string mathProblem, int correctAnswer, int answer) + { + MathProblem = mathProblem; + CorrectAnswer = correctAnswer; + Answer = answer; + } + public bool IsCorrect => Answer == CorrectAnswer; +} \ No newline at end of file From 0b1f81ce89c034434fefcf83660270f3b041b1be Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Wed, 19 Aug 2026 21:46:14 +0200 Subject: [PATCH 08/26] refactor: improve logic in models MathProblem and PlayerAnswer --- .../Controllers/MenuController.cs | 5 +- mathGame.MichaelHelgesen/Models/Game.cs | 24 +++----- .../Models/MathProblem.cs | 55 ++++++++++++------- .../Models/PlayerAnswer.cs | 15 ++--- mathGame.MichaelHelgesen/math_game.csproj | 2 +- 5 files changed, 55 insertions(+), 46 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index b9ca555b..5e4619e7 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -3,10 +3,11 @@ namespace mathGame.MichaelHelgesen.Controllers; using Spectre.Console; // DONE: Users should be presented with a menu to choose an operation +// DONE: A game needs to have at least 5 questions. +// DONE: The divisions should result on INTEGERS ONLY and dividends should go from 0 to 100. Example: Your app shouldn't present the division 7/2 to the user, since it doesn't result in an integer. + // TODO: You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. -// TODO: A game needs to have at least 5 questions. -// TODO: The divisions should result on INTEGERS ONLY and dividends should go from 0 to 100. Example: Your app shouldn't present the division 7/2 to the user, since it doesn't result in an integer. // TODO: You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. // TODO: Try to implement levels of difficulty. // TODO: Add a timer to track how long the user takes to finish the game. diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index 225c4a14..38d19236 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -8,13 +8,15 @@ internal class Game { private static int numberOfTurns = 5; + private static int points = 0; + internal static List gameTurns = new(); public class GameTurn { public MathProblem MathProblem { get; set; } public PlayerAnswer PlayerAnswer { get; set; } - public int TurnNumber { get; set; } + //public int TurnNumber { get; set; } } /* public class GameData @@ -33,39 +35,31 @@ internal static void PlayGame(MenuItems gameType) // Initialize turn GameTurn gameTurn = new(); - // Roll dice 1 - int dice1 = Dice.RollDice(10); - // Roll dice 2 - int dice2 = Dice.RollDice(10); - // Create math problem(dice1, dice2, operator) - MathProblem mathProblem = new MathProblem(dice1, dice2, "+"); + MathProblem mathProblem = new MathProblem(gameType); // Turn number AnsiConsole.MarkupLine($"[bold blue]Spørsmål {i + 1} av 5[/]"); // Generate question + collect answer - int svar = AnsiConsole.Ask($"Hva er [green]{dice1} + {dice2}[/]?"); + int playerAnswer = AnsiConsole.Ask($"Hva er [green]{mathProblem.FirstNumber} {mathProblem.Operator} {mathProblem.SecondNumber}[/]?"); // Player answer - PlayerAnswer playerAnswer = new PlayerAnswer(mathProblem.MathProblemAsString, mathProblem.CorrectAnswer, svar); + PlayerAnswer answer = new PlayerAnswer(mathProblem.CorrectAnswer, playerAnswer); // Add math problem to list gameTurn.MathProblem = mathProblem; + gameTurn.PlayerAnswer = answer; - // Add - - gameTurn.PlayerAnswer = playerAnswer; - gameTurn.TurnNumber = i + 1; gameTurns.Add(gameTurn); } foreach (var item in gameTurns) { - Console.WriteLine(item.MathProblem.MathProblemAsString); + Console.WriteLine($"{item.MathProblem.FirstNumber} {item.MathProblem.Operator} {item.MathProblem.SecondNumber}"); Console.WriteLine(item.PlayerAnswer.Answer); + Console.WriteLine(item.MathProblem.CorrectAnswer); Console.WriteLine(item.PlayerAnswer.IsCorrect); - Console.WriteLine(item.TurnNumber); } // return playedGame; } diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index e994e70d..3376a513 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -1,28 +1,45 @@ +using mathGame.MichaelHelgesen.Enums; + namespace mathGame.MichaelHelgesen.Models; internal class MathProblem { - public int Number1 { get; } - public int Number2 { get; } + public int FirstNumber { get; } + public int SecondNumber { get; } public string Operator { get; } + public int CorrectAnswer { get; } - // Konstruktør som setter tallene når oppgaven lages - public MathProblem(int number1, int number2, string op) - { - Number1 = number1; - Number2 = number2; - Operator = op; - } - - public int CorrectAnswer => Operator switch + public MathProblem(MenuItems gameType) { - "+" => Number1 + Number2, - "-" => Number1 - Number2, - "*" => Number1 * Number2, - "/" => Number1 / Number2, - _ => 0 - }; - - public string MathProblemAsString => $"{Number1} {Operator} {Number2}"; + var random = Random.Shared; + switch (gameType) + { + case MenuItems.Addition: + FirstNumber = random.Next(1, 100); + SecondNumber = random.Next(1, 100); + Operator = "+"; + CorrectAnswer = FirstNumber + SecondNumber; + break; + case MenuItems.Subtraction: + FirstNumber = random.Next(1, 100); + SecondNumber = random.Next(1, 100); + Operator = "-"; + CorrectAnswer = FirstNumber - SecondNumber; + break; + case MenuItems.Multiplication: + FirstNumber = random.Next(1, 100); + SecondNumber = random.Next(1, 100); + Operator = "*"; + CorrectAnswer = FirstNumber * SecondNumber; + break; + case MenuItems.Division: + FirstNumber = random.Next(1, 10); + SecondNumber = random.Next(1, 10); + FirstNumber *= SecondNumber; + Operator = "/"; + CorrectAnswer = FirstNumber / SecondNumber; + break; + } + } } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs index 79ef4e44..32f85d11 100644 --- a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs +++ b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs @@ -2,15 +2,12 @@ namespace mathGame.MichaelHelgesen.Models; internal class PlayerAnswer { - public string MathProblem { get; set; } - public int CorrectAnswer { get; set; } - public int Answer { get; set; } - - public PlayerAnswer(string mathProblem, int correctAnswer, int answer) + public int Answer { get; } + public int MathAnswer { get; } + public PlayerAnswer(int correctMathAnswer, int playerAnswer) { - MathProblem = mathProblem; - CorrectAnswer = correctAnswer; - Answer = answer; + Answer = playerAnswer; + MathAnswer = correctMathAnswer; } - public bool IsCorrect => Answer == CorrectAnswer; + public bool IsCorrect => Answer == MathAnswer; } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/math_game.csproj b/mathGame.MichaelHelgesen/math_game.csproj index 04af1154..2d744420 100644 --- a/mathGame.MichaelHelgesen/math_game.csproj +++ b/mathGame.MichaelHelgesen/math_game.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net8.0 enable enable From 890c492d16ad3c24d4c07521cede24c6dc1a7a87 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Wed, 19 Aug 2026 22:21:13 +0200 Subject: [PATCH 09/26] refactor: Improve switch in MathProblem model --- mathGame.MichaelHelgesen/Models/Dice.cs | 10 ------ mathGame.MichaelHelgesen/Models/Game.cs | 7 ++--- .../Models/MathProblem.cs | 31 ++++++++++--------- 3 files changed, 20 insertions(+), 28 deletions(-) delete mode 100644 mathGame.MichaelHelgesen/Models/Dice.cs diff --git a/mathGame.MichaelHelgesen/Models/Dice.cs b/mathGame.MichaelHelgesen/Models/Dice.cs deleted file mode 100644 index 19d75b83..00000000 --- a/mathGame.MichaelHelgesen/Models/Dice.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace mathGame.MichaelHelgesen.Models; - -internal static class Dice -{ - internal static int RollDice(int difficulty) - { - Random random = new(); - return random.Next(0,difficulty); - } -} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index 38d19236..b71a7a8f 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -18,13 +18,12 @@ public class GameTurn public PlayerAnswer PlayerAnswer { get; set; } //public int TurnNumber { get; set; } } - /* public class GameData { public string GameType { get; set; } - public List Rounds { get; set; } = new List(); + public List GameTurns { get; set; } = new List(); } - */ + internal static void PlayGame(MenuItems gameType) { //GameData playedGame = new GameData(); @@ -42,7 +41,7 @@ internal static void PlayGame(MenuItems gameType) AnsiConsole.MarkupLine($"[bold blue]Spørsmål {i + 1} av 5[/]"); // Generate question + collect answer - int playerAnswer = AnsiConsole.Ask($"Hva er [green]{mathProblem.FirstNumber} {mathProblem.Operator} {mathProblem.SecondNumber}[/]?"); + int playerAnswer = AnsiConsole.Ask($"Hva er [green]{mathProblem.AsString}[/]?"); // Player answer PlayerAnswer answer = new PlayerAnswer(mathProblem.CorrectAnswer, playerAnswer); diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 3376a513..2070f973 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -4,42 +4,45 @@ namespace mathGame.MichaelHelgesen.Models; internal class MathProblem { - public int FirstNumber { get; } - public int SecondNumber { get; } + public int FirstNumber { get; set; } + public int SecondNumber { get; set; } public string Operator { get; } - public int CorrectAnswer { get; } + public int CorrectAnswer { get; set; } public MathProblem(MenuItems gameType) { - var random = Random.Shared; - switch (gameType) { case MenuItems.Addition: - FirstNumber = random.Next(1, 100); - SecondNumber = random.Next(1, 100); + GenerateNumbers(); Operator = "+"; CorrectAnswer = FirstNumber + SecondNumber; break; case MenuItems.Subtraction: - FirstNumber = random.Next(1, 100); - SecondNumber = random.Next(1, 100); + GenerateNumbers(); Operator = "-"; CorrectAnswer = FirstNumber - SecondNumber; break; case MenuItems.Multiplication: - FirstNumber = random.Next(1, 100); - SecondNumber = random.Next(1, 100); + GenerateNumbers(); Operator = "*"; CorrectAnswer = FirstNumber * SecondNumber; break; case MenuItems.Division: - FirstNumber = random.Next(1, 10); - SecondNumber = random.Next(1, 10); - FirstNumber *= SecondNumber; + GenerateNumbers(); + FirstNumber *= SecondNumber; Operator = "/"; CorrectAnswer = FirstNumber / SecondNumber; break; } } + + public void GenerateNumbers() + { + var random = Random.Shared; + FirstNumber = random.Next(1, 100); + SecondNumber = random.Next(1, 100); + } + + public string AsString => $"{FirstNumber} {Operator} {SecondNumber}"; } \ No newline at end of file From 1794ad70b2b05319e988fb47ece157ccbd2cc2af Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Wed, 19 Aug 2026 22:28:59 +0200 Subject: [PATCH 10/26] feat(game): Add turns to Game object --- mathGame.MichaelHelgesen/Models/Game.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index b71a7a8f..dcd9f2fe 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -21,13 +21,13 @@ public class GameTurn public class GameData { public string GameType { get; set; } - public List GameTurns { get; set; } = new List(); + public List GameTurns { get; set; } } internal static void PlayGame(MenuItems gameType) { - //GameData playedGame = new GameData(); - //playedGame.GameType = gameType.ToString(); + GameData playedGame = new GameData(); + playedGame.GameType = gameType.ToString(); for (int i = 0; i < numberOfTurns; i++) { @@ -53,7 +53,9 @@ internal static void PlayGame(MenuItems gameType) gameTurns.Add(gameTurn); } - foreach (var item in gameTurns) + playedGame.GameTurns = gameTurns; + + foreach (var item in playedGame.GameTurns) { Console.WriteLine($"{item.MathProblem.FirstNumber} {item.MathProblem.Operator} {item.MathProblem.SecondNumber}"); Console.WriteLine(item.PlayerAnswer.Answer); From 66405c1623da36be6b38b3de86e51e86e1709a4b Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Wed, 19 Aug 2026 22:44:04 +0200 Subject: [PATCH 11/26] feat(game): Further improvements to logic --- mathGame.MichaelHelgesen/Models/Game.cs | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index dcd9f2fe..d6c734e9 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -1,7 +1,6 @@ namespace mathGame.MichaelHelgesen.Models; using mathGame.MichaelHelgesen.Enums; -using Microsoft.VisualBasic; using Spectre.Console; internal class Game @@ -12,18 +11,8 @@ internal class Game internal static List gameTurns = new(); - public class GameTurn - { - public MathProblem MathProblem { get; set; } - public PlayerAnswer PlayerAnswer { get; set; } - //public int TurnNumber { get; set; } - } - public class GameData - { - public string GameType { get; set; } - public List GameTurns { get; set; } - } + internal static void PlayGame(MenuItems gameType) { GameData playedGame = new GameData(); @@ -50,10 +39,10 @@ internal static void PlayGame(MenuItems gameType) gameTurn.MathProblem = mathProblem; gameTurn.PlayerAnswer = answer; - gameTurns.Add(gameTurn); + playedGame.GameTurns.Add(gameTurn); } - playedGame.GameTurns = gameTurns; + //playedGame.GameTurns = gameTurns; foreach (var item in playedGame.GameTurns) { @@ -64,4 +53,15 @@ internal static void PlayGame(MenuItems gameType) } // return playedGame; } + public class GameTurn + { + public MathProblem MathProblem { get; set; } + public PlayerAnswer PlayerAnswer { get; set; } + //public int TurnNumber { get; set; } + } + public class GameData + { + public string GameType { get; set; } + public List GameTurns { get; set; } = new(); + } } \ No newline at end of file From 90dc4af0d9160ff71abba5d8673b955be2dfadee Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Thu, 20 Aug 2026 10:14:22 +0200 Subject: [PATCH 12/26] feat(Archive): Add Archive model and logic to save game rounds to it. --- .../Controllers/GameController.cs | 7 ++-- .../Controllers/MenuController.cs | 2 +- mathGame.MichaelHelgesen/Models/Archive.cs | 10 ++++++ mathGame.MichaelHelgesen/Models/Game.cs | 32 ++++++++++++------- .../Models/MathProblem.cs | 4 +-- mathGame.MichaelHelgesen/math_game.csproj | 2 +- 6 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 mathGame.MichaelHelgesen/Models/Archive.cs diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index a42fd638..43471126 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -9,12 +9,13 @@ public class GameController() // DONE: Display message // Play Game // Archive game - + static Archive archive = new(); + // Etablere arkiv internal static void StartGame(MenuItems gameType) { - // var game = List of rounds? DisplayStartMessage(gameType); - Game.PlayGame(gameType); + var gameRound = Game.PlayRound(gameType); + archive.ArchiveGameRound(gameRound); } internal static void DisplayStartMessage(MenuItems gameType) diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 5e4619e7..6c9371ee 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -5,9 +5,9 @@ namespace mathGame.MichaelHelgesen.Controllers; // DONE: Users should be presented with a menu to choose an operation // DONE: A game needs to have at least 5 questions. // DONE: The divisions should result on INTEGERS ONLY and dividends should go from 0 to 100. Example: Your app shouldn't present the division 7/2 to the user, since it doesn't result in an integer. +// DONE: You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. -// TODO: You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. // TODO: You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. // TODO: Try to implement levels of difficulty. // TODO: Add a timer to track how long the user takes to finish the game. diff --git a/mathGame.MichaelHelgesen/Models/Archive.cs b/mathGame.MichaelHelgesen/Models/Archive.cs new file mode 100644 index 00000000..ba744541 --- /dev/null +++ b/mathGame.MichaelHelgesen/Models/Archive.cs @@ -0,0 +1,10 @@ +namespace mathGame.MichaelHelgesen.Models; + +internal class Archive +{ + public List ArchivedGames = new(); + public void ArchiveGameRound(Game.GameData game) + { + ArchivedGames.Add(game); + } +} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index d6c734e9..2a88c58c 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -7,16 +7,10 @@ internal class Game { private static int numberOfTurns = 5; - private static int points = 0; - - internal static List gameTurns = new(); - - - - internal static void PlayGame(MenuItems gameType) + internal static GameData PlayRound(MenuItems gameType) { - GameData playedGame = new GameData(); - playedGame.GameType = gameType.ToString(); + GameData playedGame = new GameData(gameType); + //playedGame.GameType = gameType.ToString(); for (int i = 0; i < numberOfTurns; i++) { @@ -51,7 +45,7 @@ internal static void PlayGame(MenuItems gameType) Console.WriteLine(item.MathProblem.CorrectAnswer); Console.WriteLine(item.PlayerAnswer.IsCorrect); } - // return playedGame; + return playedGame; } public class GameTurn { @@ -59,9 +53,23 @@ public class GameTurn public PlayerAnswer PlayerAnswer { get; set; } //public int TurnNumber { get; set; } } - public class GameData + public class GameData(MenuItems gameType) { - public string GameType { get; set; } + public MenuItems GameType { get; set; } = gameType; public List GameTurns { get; set; } = new(); + + //public int Points { get;set; } = 0; + + public int Points() + { + int points = 0; + foreach (var turn in GameTurns) + { + if(turn.PlayerAnswer.IsCorrect) + points++; + } + + return points; + } } } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 2070f973..25575015 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -40,8 +40,8 @@ public MathProblem(MenuItems gameType) public void GenerateNumbers() { var random = Random.Shared; - FirstNumber = random.Next(1, 100); - SecondNumber = random.Next(1, 100); + FirstNumber = random.Next(1, 10); + SecondNumber = random.Next(1, 10); } public string AsString => $"{FirstNumber} {Operator} {SecondNumber}"; diff --git a/mathGame.MichaelHelgesen/math_game.csproj b/mathGame.MichaelHelgesen/math_game.csproj index 2d744420..04af1154 100644 --- a/mathGame.MichaelHelgesen/math_game.csproj +++ b/mathGame.MichaelHelgesen/math_game.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net9.0 enable enable From 43b174379cf4c1920dea81d56a19d5da4dcec35c Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Thu, 20 Aug 2026 10:57:47 +0200 Subject: [PATCH 13/26] feat(menu): Display menu item 'Results' only if a game is played --- .../Controllers/GameController.cs | 4 ++- .../Controllers/MenuController.cs | 28 +++++++++++++++++-- mathGame.MichaelHelgesen/Models/Archive.cs | 19 +++++++++++-- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index 43471126..66d5b70b 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -1,4 +1,5 @@ namespace mathGame.MichaelHelgesen.Controllers; + using mathGame.MichaelHelgesen.Enums; using mathGame.MichaelHelgesen.Models; using Spectre.Console; @@ -9,13 +10,14 @@ public class GameController() // DONE: Display message // Play Game // Archive game - static Archive archive = new(); + internal static Archive archive = new(); // Etablere arkiv internal static void StartGame(MenuItems gameType) { DisplayStartMessage(gameType); var gameRound = Game.PlayRound(gameType); archive.ArchiveGameRound(gameRound); + MenuController.Run(); } internal static void DisplayStartMessage(MenuItems gameType) diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 6c9371ee..89c5e518 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -1,4 +1,5 @@ namespace mathGame.MichaelHelgesen.Controllers; + using mathGame.MichaelHelgesen.Enums; using Spectre.Console; @@ -6,13 +7,13 @@ namespace mathGame.MichaelHelgesen.Controllers; // DONE: A game needs to have at least 5 questions. // DONE: The divisions should result on INTEGERS ONLY and dividends should go from 0 to 100. Example: Your app shouldn't present the division 7/2 to the user, since it doesn't result in an integer. // DONE: You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. +// DONE: You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. +// DONE: To follow the DRY Principle, try using just one method for all games. Additionally, double check your project and try to find opportunities to achieve the same functionality with less code, avoiding repetition when possible. -// TODO: You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. // TODO: Try to implement levels of difficulty. // TODO: Add a timer to track how long the user takes to finish the game. // TODO: Create a 'Random Game' option where the players will be presented with questions from random operations -// TODO: To follow the DRY Principle, try using just one method for all games. Additionally, double check your project and try to find opportunities to achieve the same functionality with less code, avoiding repetition when possible. internal class MenuController { @@ -21,6 +22,7 @@ internal static void Run() ShowWelcomeMessage(); var playerChoice = PromptMenu(); ExecutePlayerChoice(playerChoice); + } private static void ShowWelcomeMessage() @@ -30,10 +32,23 @@ private static void ShowWelcomeMessage() private static MenuItems PromptMenu() { + var choices = Enum.GetValues().ToList(); + if (GameController.archive.ArchivedGames.Count < 1) + choices.Remove(MenuItems.Results); var menuChoices = AnsiConsole.Prompt( new SelectionPrompt() .Title("Choose [green]game type[/] would you like?") - .AddChoices(Enum.GetValues())); + .UseConverter(item => item switch + { + MenuItems.Addition => "➕ Legg sammen tall (Addisjon)", + MenuItems.Subtraction => "➖ Trekk fra tall (Subtraksjon)", + MenuItems.Division => "Dele", + MenuItems.Multiplication => "* Gange", + MenuItems.Results => "📊 Vis tidligere resultat og statistikk", + MenuItems.Quit => "❌ Avslutt spillet", + _ => item.ToString() + }) + .AddChoices(choices)); return menuChoices; } @@ -45,7 +60,14 @@ private static void ExecutePlayerChoice(MenuItems playerChoice) AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); break; case MenuItems.Results: + Console.Clear(); AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + GameController.archive.DisplayArchive(); + AnsiConsole.Prompt( + new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") + .AllowEmpty() +); + Run(); break; default: //AnsiConsole.MarkupLine($"Spill spill"); diff --git a/mathGame.MichaelHelgesen/Models/Archive.cs b/mathGame.MichaelHelgesen/Models/Archive.cs index ba744541..97228ab8 100644 --- a/mathGame.MichaelHelgesen/Models/Archive.cs +++ b/mathGame.MichaelHelgesen/Models/Archive.cs @@ -2,9 +2,24 @@ namespace mathGame.MichaelHelgesen.Models; internal class Archive { - public List ArchivedGames = new(); - public void ArchiveGameRound(Game.GameData game) + internal List ArchivedGames = new(); + internal void ArchiveGameRound(Game.GameData game) { ArchivedGames.Add(game); } + + internal void DisplayArchive() + { + foreach (var gameRound in ArchivedGames) + { + Console.WriteLine($"A game of {gameRound.GameType}"); + foreach (var gameTurn in gameRound.GameTurns) + { + Console.WriteLine($"Math problem: {gameTurn.MathProblem.AsString}"); + Console.WriteLine($"Correct answer: {gameTurn.MathProblem.CorrectAnswer}"); + Console.WriteLine($"Player answer: {gameTurn.PlayerAnswer.Answer}"); + Console.WriteLine($"Player answer correct: {gameTurn.PlayerAnswer.IsCorrect}"); + } + } + } } \ No newline at end of file From 7dbf7874a9c18e5f1998f0bfcd46b625e2a9e50a Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Thu, 20 Aug 2026 14:45:22 +0200 Subject: [PATCH 14/26] refactor(MenuController): Separate more code into their own methods for better single responsibility principle --- .../Controllers/MenuController.cs | 70 ++++++++++--------- mathGame.MichaelHelgesen/Models/Archive.cs | 1 + mathGame.MichaelHelgesen/Models/Game.cs | 10 +-- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 89c5e518..07c5ad86 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -15,64 +15,68 @@ namespace mathGame.MichaelHelgesen.Controllers; // TODO: Add a timer to track how long the user takes to finish the game. // TODO: Create a 'Random Game' option where the players will be presented with questions from random operations -internal class MenuController +class MenuController { internal static void Run() { - ShowWelcomeMessage(); + Console.Clear(); + AnsiConsole.MarkupLine("[bold blue]Welcome[/] to [green]the Math Game[/]!"); var playerChoice = PromptMenu(); ExecutePlayerChoice(playerChoice); - - } - - private static void ShowWelcomeMessage() - { - AnsiConsole.MarkupLine("[bold blue]Welcome[/] to [green]the Math Game[/]!"); } private static MenuItems PromptMenu() { - var choices = Enum.GetValues().ToList(); - if (GameController.archive.ArchivedGames.Count < 1) - choices.Remove(MenuItems.Results); - var menuChoices = AnsiConsole.Prompt( + var menuChoices = GenerateMenuChoices(); + var menuChoice = AnsiConsole.Prompt( new SelectionPrompt() .Title("Choose [green]game type[/] would you like?") - .UseConverter(item => item switch - { - MenuItems.Addition => "➕ Legg sammen tall (Addisjon)", - MenuItems.Subtraction => "➖ Trekk fra tall (Subtraksjon)", - MenuItems.Division => "Dele", - MenuItems.Multiplication => "* Gange", - MenuItems.Results => "📊 Vis tidligere resultat og statistikk", - MenuItems.Quit => "❌ Avslutt spillet", - _ => item.ToString() - }) - .AddChoices(choices)); - return menuChoices; + .UseConverter(item => GenerateMenuItems(item)) + .AddChoices(menuChoices)); + return menuChoice; } - private static void ExecutePlayerChoice(MenuItems playerChoice) + private static void ExecutePlayerChoice(MenuItems gameMode) { - switch (playerChoice) + switch (gameMode) { case MenuItems.Quit: - AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + AnsiConsole.MarkupLine($"You selected: [yellow]{gameMode}[/]"); break; case MenuItems.Results: Console.Clear(); - AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + AnsiConsole.MarkupLine($"You selected: [yellow]{gameMode}[/]"); GameController.archive.DisplayArchive(); AnsiConsole.Prompt( - new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") - .AllowEmpty() -); + new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") + .AllowEmpty() + ); Run(); break; default: - //AnsiConsole.MarkupLine($"Spill spill"); - GameController.StartGame(playerChoice); + GameController.StartGame(gameMode); break; } } + + private static List GenerateMenuChoices() + { + var choices = Enum.GetValues().ToList(); + if (GameController.archive.ArchivedGames.Count < 1) choices.Remove(MenuItems.Results); + return choices; + } + + private static string GenerateMenuItems(MenuItems item) + { + return item switch + { + MenuItems.Addition => "➕ Legg sammen tall (Addisjon)", + MenuItems.Subtraction => "➖ Trekk fra tall (Subtraksjon)", + MenuItems.Division => "Dele", + MenuItems.Multiplication => "* Gange", + MenuItems.Results => "📊 Vis tidligere resultat og statistikk", + MenuItems.Quit => "❌ Avslutt spillet", + _ => item.ToString() + }; + } } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/Archive.cs b/mathGame.MichaelHelgesen/Models/Archive.cs index 97228ab8..043062b3 100644 --- a/mathGame.MichaelHelgesen/Models/Archive.cs +++ b/mathGame.MichaelHelgesen/Models/Archive.cs @@ -13,6 +13,7 @@ internal void DisplayArchive() foreach (var gameRound in ArchivedGames) { Console.WriteLine($"A game of {gameRound.GameType}"); + Console.WriteLine($"Game number: {gameRound.GameNumber}"); foreach (var gameTurn in gameRound.GameTurns) { Console.WriteLine($"Math problem: {gameTurn.MathProblem.AsString}"); diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index 2a88c58c..b52b677c 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -1,12 +1,10 @@ namespace mathGame.MichaelHelgesen.Models; - using mathGame.MichaelHelgesen.Enums; using Spectre.Console; internal class Game { - private static int numberOfTurns = 5; - + static int numberOfTurns = 5; internal static GameData PlayRound(MenuItems gameType) { GameData playedGame = new GameData(gameType); @@ -55,6 +53,8 @@ public class GameTurn } public class GameData(MenuItems gameType) { + private static int _nextGameNumber = 1; + public int GameNumber { get; } = _nextGameNumber++; public MenuItems GameType { get; set; } = gameType; public List GameTurns { get; set; } = new(); @@ -65,8 +65,8 @@ public int Points() int points = 0; foreach (var turn in GameTurns) { - if(turn.PlayerAnswer.IsCorrect) - points++; + if (turn.PlayerAnswer.IsCorrect) + points++; } return points; From ce41cfa84b3be3775cd0361bc8baa58ff36adbe2 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Thu, 20 Aug 2026 15:03:49 +0200 Subject: [PATCH 15/26] refactor(GameController): remove comments --- .../Controllers/GameController.cs | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index 66d5b70b..aa55436c 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -7,24 +7,16 @@ namespace mathGame.MichaelHelgesen.Controllers; public class GameController() { - // DONE: Display message - // Play Game - // Archive game internal static Archive archive = new(); - // Etablere arkiv + internal static void StartGame(MenuItems gameType) { - DisplayStartMessage(gameType); + AnsiConsole.Prompt( + new TextPrompt($"You selected: [yellow]{gameType}[/]. [grey]Press [bold]Enter[/] to continue...[/]") + .AllowEmpty() + ); var gameRound = Game.PlayRound(gameType); archive.ArchiveGameRound(gameRound); MenuController.Run(); } - - internal static void DisplayStartMessage(MenuItems gameType) - { - AnsiConsole.Prompt( - new TextPrompt($"You selected: [yellow]{gameType}[/]. [grey]Press [bold]Enter[/] to continue...[/]") - .AllowEmpty() -); - } } \ No newline at end of file From cf42fb94f4b2108e507c77405abb86d006cfd97a Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Fri, 21 Aug 2026 12:16:41 +0200 Subject: [PATCH 16/26] refactor: remove comments and spaces --- .../Controllers/GameController.cs | 2 +- mathGame.MichaelHelgesen/Models/Game.cs | 22 ++----------------- .../Models/MathProblem.cs | 14 +++++------- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index aa55436c..d49d95a2 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -5,7 +5,7 @@ namespace mathGame.MichaelHelgesen.Controllers; using Spectre.Console; -public class GameController() +class GameController() { internal static Archive archive = new(); diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index b52b677c..f33e98da 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -4,52 +4,35 @@ namespace mathGame.MichaelHelgesen.Models; internal class Game { - static int numberOfTurns = 5; + static readonly int numberOfTurns = 5; internal static GameData PlayRound(MenuItems gameType) { GameData playedGame = new GameData(gameType); - //playedGame.GameType = gameType.ToString(); for (int i = 0; i < numberOfTurns; i++) { - // Initialize turn GameTurn gameTurn = new(); - // Create math problem(dice1, dice2, operator) MathProblem mathProblem = new MathProblem(gameType); - // Turn number AnsiConsole.MarkupLine($"[bold blue]Spørsmål {i + 1} av 5[/]"); - // Generate question + collect answer int playerAnswer = AnsiConsole.Ask($"Hva er [green]{mathProblem.AsString}[/]?"); - // Player answer PlayerAnswer answer = new PlayerAnswer(mathProblem.CorrectAnswer, playerAnswer); - // Add math problem to list gameTurn.MathProblem = mathProblem; gameTurn.PlayerAnswer = answer; playedGame.GameTurns.Add(gameTurn); } - //playedGame.GameTurns = gameTurns; - - foreach (var item in playedGame.GameTurns) - { - Console.WriteLine($"{item.MathProblem.FirstNumber} {item.MathProblem.Operator} {item.MathProblem.SecondNumber}"); - Console.WriteLine(item.PlayerAnswer.Answer); - Console.WriteLine(item.MathProblem.CorrectAnswer); - Console.WriteLine(item.PlayerAnswer.IsCorrect); - } return playedGame; } public class GameTurn { public MathProblem MathProblem { get; set; } public PlayerAnswer PlayerAnswer { get; set; } - //public int TurnNumber { get; set; } } public class GameData(MenuItems gameType) { @@ -58,9 +41,8 @@ public class GameData(MenuItems gameType) public MenuItems GameType { get; set; } = gameType; public List GameTurns { get; set; } = new(); - //public int Points { get;set; } = 0; - public int Points() + int Points() { int points = 0; foreach (var turn in GameTurns) diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 25575015..673e6041 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -2,7 +2,7 @@ namespace mathGame.MichaelHelgesen.Models; -internal class MathProblem +class MathProblem { public int FirstNumber { get; set; } public int SecondNumber { get; set; } @@ -11,25 +11,24 @@ internal class MathProblem public MathProblem(MenuItems gameType) { + GenerateNumbers(); + switch (gameType) { case MenuItems.Addition: - GenerateNumbers(); + Operator = "+"; CorrectAnswer = FirstNumber + SecondNumber; break; case MenuItems.Subtraction: - GenerateNumbers(); Operator = "-"; CorrectAnswer = FirstNumber - SecondNumber; break; case MenuItems.Multiplication: - GenerateNumbers(); Operator = "*"; CorrectAnswer = FirstNumber * SecondNumber; break; case MenuItems.Division: - GenerateNumbers(); FirstNumber *= SecondNumber; Operator = "/"; CorrectAnswer = FirstNumber / SecondNumber; @@ -39,9 +38,8 @@ public MathProblem(MenuItems gameType) public void GenerateNumbers() { - var random = Random.Shared; - FirstNumber = random.Next(1, 10); - SecondNumber = random.Next(1, 10); + FirstNumber = Random.Shared.Next(1, 10); + SecondNumber = Random.Shared.Next(1, 10); } public string AsString => $"{FirstNumber} {Operator} {SecondNumber}"; From 7ea57517192c70b622c85880e76c876feadc1616 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Fri, 21 Aug 2026 13:40:16 +0200 Subject: [PATCH 17/26] refactor: create primary parameterized constructors --- mathGame.MichaelHelgesen/Models/Archive.cs | 2 +- mathGame.MichaelHelgesen/Models/Game.cs | 30 +++++++++---------- .../Models/MathProblem.cs | 14 ++++----- .../Models/PlayerAnswer.cs | 14 ++++----- 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/mathGame.MichaelHelgesen/Models/Archive.cs b/mathGame.MichaelHelgesen/Models/Archive.cs index 043062b3..05661289 100644 --- a/mathGame.MichaelHelgesen/Models/Archive.cs +++ b/mathGame.MichaelHelgesen/Models/Archive.cs @@ -1,6 +1,6 @@ namespace mathGame.MichaelHelgesen.Models; -internal class Archive +class Archive { internal List ArchivedGames = new(); internal void ArchiveGameRound(Game.GameData game) diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index f33e98da..f2d02e5b 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -1,17 +1,17 @@ namespace mathGame.MichaelHelgesen.Models; + using mathGame.MichaelHelgesen.Enums; using Spectre.Console; -internal class Game +class Game { static readonly int numberOfTurns = 5; internal static GameData PlayRound(MenuItems gameType) { - GameData playedGame = new GameData(gameType); + List turns = []; for (int i = 0; i < numberOfTurns; i++) { - GameTurn gameTurn = new(); MathProblem mathProblem = new MathProblem(gameType); @@ -21,28 +21,28 @@ internal static GameData PlayRound(MenuItems gameType) PlayerAnswer answer = new PlayerAnswer(mathProblem.CorrectAnswer, playerAnswer); - gameTurn.MathProblem = mathProblem; - gameTurn.PlayerAnswer = answer; + GameTurn gameTurn = new GameTurn(mathProblem, answer); - playedGame.GameTurns.Add(gameTurn); + turns.Add(gameTurn); } + GameData playedGame = new GameData(gameType, turns); return playedGame; } - public class GameTurn + internal class GameTurn(MathProblem mathProblem, PlayerAnswer playerAnswer) { - public MathProblem MathProblem { get; set; } - public PlayerAnswer PlayerAnswer { get; set; } + internal MathProblem MathProblem { get; } = mathProblem; + internal PlayerAnswer PlayerAnswer { get; } = playerAnswer; } - public class GameData(MenuItems gameType) + internal class GameData(MenuItems gameType, List turns) { - private static int _nextGameNumber = 1; - public int GameNumber { get; } = _nextGameNumber++; - public MenuItems GameType { get; set; } = gameType; - public List GameTurns { get; set; } = new(); + static int _nextGameNumber = 1; + internal int GameNumber { get; } = _nextGameNumber++; + internal MenuItems GameType { get; } = gameType; + internal List GameTurns { get; } = turns; - int Points() + internal int Points() { int points = 0; foreach (var turn in GameTurns) diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 673e6041..b8f5c521 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -4,12 +4,12 @@ namespace mathGame.MichaelHelgesen.Models; class MathProblem { - public int FirstNumber { get; set; } - public int SecondNumber { get; set; } - public string Operator { get; } - public int CorrectAnswer { get; set; } + internal int FirstNumber { get; set; } + internal int SecondNumber { get; set; } + internal string Operator { get; } + internal int CorrectAnswer { get; set; } - public MathProblem(MenuItems gameType) + internal MathProblem(MenuItems gameType) { GenerateNumbers(); @@ -36,11 +36,11 @@ public MathProblem(MenuItems gameType) } } - public void GenerateNumbers() + void GenerateNumbers() { FirstNumber = Random.Shared.Next(1, 10); SecondNumber = Random.Shared.Next(1, 10); } - public string AsString => $"{FirstNumber} {Operator} {SecondNumber}"; + internal string AsString => $"{FirstNumber} {Operator} {SecondNumber}"; } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs index 32f85d11..e725fd0e 100644 --- a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs +++ b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs @@ -1,13 +1,9 @@ namespace mathGame.MichaelHelgesen.Models; -internal class PlayerAnswer +class PlayerAnswer(int correctMathAnswer, int playerAnswer) { - public int Answer { get; } - public int MathAnswer { get; } - public PlayerAnswer(int correctMathAnswer, int playerAnswer) - { - Answer = playerAnswer; - MathAnswer = correctMathAnswer; - } - public bool IsCorrect => Answer == MathAnswer; + internal int Answer { get; } = playerAnswer; + internal int MathAnswer { get; } = correctMathAnswer; + + internal bool IsCorrect => Answer == MathAnswer; } \ No newline at end of file From 2a6c2f500cc5ff75da30953e8d2aa6260283de29 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Fri, 21 Aug 2026 15:44:43 +0200 Subject: [PATCH 18/26] feat(mathproblem): Add method for random operator in random game mode --- .../Controllers/MenuController.cs | 2 +- mathGame.MichaelHelgesen/Enums/Enums.cs | 18 +++++++++++++++++- mathGame.MichaelHelgesen/Models/MathProblem.cs | 18 +++++++++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 07c5ad86..50f980b6 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -9,11 +9,11 @@ namespace mathGame.MichaelHelgesen.Controllers; // DONE: You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. // DONE: You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. // DONE: To follow the DRY Principle, try using just one method for all games. Additionally, double check your project and try to find opportunities to achieve the same functionality with less code, avoiding repetition when possible. +// DONE: Create a 'Random Game' option where the players will be presented with questions from random operations // TODO: Try to implement levels of difficulty. // TODO: Add a timer to track how long the user takes to finish the game. -// TODO: Create a 'Random Game' option where the players will be presented with questions from random operations class MenuController { diff --git a/mathGame.MichaelHelgesen/Enums/Enums.cs b/mathGame.MichaelHelgesen/Enums/Enums.cs index 745ad33e..6d4f3fb7 100644 --- a/mathGame.MichaelHelgesen/Enums/Enums.cs +++ b/mathGame.MichaelHelgesen/Enums/Enums.cs @@ -1,11 +1,27 @@ namespace mathGame.MichaelHelgesen.Enums; -internal enum MenuItems +enum MenuItems { Addition, Multiplication, Division, Subtraction, + Random, Results, Quit +} + +enum Difficulty +{ + Easy, + Normal, + Hard +} + +enum MenuChoice +{ + Play, + Results, + Difficulty, + Quit } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index b8f5c521..044e04e5 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -11,12 +11,15 @@ class MathProblem internal MathProblem(MenuItems gameType) { + + if (gameType == MenuItems.Random) gameType = GenerateRandomOperator(); + GenerateNumbers(); switch (gameType) { case MenuItems.Addition: - + Operator = "+"; CorrectAnswer = FirstNumber + SecondNumber; break; @@ -42,5 +45,18 @@ void GenerateNumbers() SecondNumber = Random.Shared.Next(1, 10); } + MenuItems GenerateRandomOperator() + { + // This feels like a bad solution + // I would rather have two Enums? + var values = Enum.GetValues() + .Where(m => m != MenuItems.Quit + && m != MenuItems.Results + && m != MenuItems.Random) + .ToArray(); + + return values[Random.Shared.Next(values.Length)]; + } + internal string AsString => $"{FirstNumber} {Operator} {SecondNumber}"; } \ No newline at end of file From 03db7b82e7e48ef0f70bbfa13e91be13f29a61d4 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Fri, 21 Aug 2026 22:26:49 +0200 Subject: [PATCH 19/26] feat(menu): Add menu for difficulty --- .../Controllers/GameController.cs | 2 +- .../Controllers/MenuController.cs | 109 ++++++++++++------ mathGame.MichaelHelgesen/Enums/Enums.cs | 8 +- mathGame.MichaelHelgesen/Models/Game.cs | 7 +- .../Models/MathProblem.cs | 35 +++--- mathGame.MichaelHelgesen/math_game.csproj | 2 +- 6 files changed, 101 insertions(+), 62 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index d49d95a2..f58787bc 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -9,7 +9,7 @@ class GameController() { internal static Archive archive = new(); - internal static void StartGame(MenuItems gameType) + internal static void StartGame(Menu gameType) { AnsiConsole.Prompt( new TextPrompt($"You selected: [yellow]{gameType}[/]. [grey]Press [bold]Enter[/] to continue...[/]") diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 50f980b6..b59f9c27 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -1,6 +1,7 @@ namespace mathGame.MichaelHelgesen.Controllers; using mathGame.MichaelHelgesen.Enums; +using mathGame.MichaelHelgesen.Models; using Spectre.Console; // DONE: Users should be presented with a menu to choose an operation @@ -10,9 +11,8 @@ namespace mathGame.MichaelHelgesen.Controllers; // DONE: You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. // DONE: To follow the DRY Principle, try using just one method for all games. Additionally, double check your project and try to find opportunities to achieve the same functionality with less code, avoiding repetition when possible. // DONE: Create a 'Random Game' option where the players will be presented with questions from random operations +// DONE: Try to implement levels of difficulty. - -// TODO: Try to implement levels of difficulty. // TODO: Add a timer to track how long the user takes to finish the game. class MenuController @@ -20,12 +20,59 @@ class MenuController internal static void Run() { Console.Clear(); + AnsiConsole.MarkupLine("[bold blue]Welcome[/] to [green]the Math Game[/]!"); - var playerChoice = PromptMenu(); - ExecutePlayerChoice(playerChoice); + + var playerChoice = DisplayMainMenu(); + + switch (playerChoice) + { + case MenuItems.Play: + DisplayGameMenu(); + break; + case MenuItems.Results: + DisplayResults(playerChoice); + break; + case MenuItems.Difficulty: + DisplayDifficultyMenu(); + break; + } + } + + private static void DisplayDifficultyMenu() + { + var difficulty = Enum.GetValues().ToList(); + var difficultyChoice = AnsiConsole.Prompt( + new SelectionPrompt() + .Title("Choose [green]game type[/] would you like?") + .AddChoices(difficulty)); + Game.DifficultySetting = difficultyChoice; + Run(); + } + + private static void DisplayResults(MenuItems playerChoice) + { + Console.Clear(); + AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + GameController.archive.DisplayArchive(); + AnsiConsole.Prompt( + new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") + .AllowEmpty() + ); + Run(); + } + private static void DisplayGameMenu() + { + var choices = Enum.GetValues().ToList(); + var menuChoice = AnsiConsole.Prompt( + new SelectionPrompt() + .Title("Choose [green]game type[/] would you like?") + .UseConverter(item => GenerateGameMenu(item)) + .AddChoices(choices)); + GameController.StartGame(menuChoice); } - private static MenuItems PromptMenu() + private static MenuItems DisplayMainMenu() { var menuChoices = GenerateMenuChoices(); var menuChoice = AnsiConsole.Prompt( @@ -36,29 +83,6 @@ private static MenuItems PromptMenu() return menuChoice; } - private static void ExecutePlayerChoice(MenuItems gameMode) - { - switch (gameMode) - { - case MenuItems.Quit: - AnsiConsole.MarkupLine($"You selected: [yellow]{gameMode}[/]"); - break; - case MenuItems.Results: - Console.Clear(); - AnsiConsole.MarkupLine($"You selected: [yellow]{gameMode}[/]"); - GameController.archive.DisplayArchive(); - AnsiConsole.Prompt( - new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") - .AllowEmpty() - ); - Run(); - break; - default: - GameController.StartGame(gameMode); - break; - } - } - private static List GenerateMenuChoices() { var choices = Enum.GetValues().ToList(); @@ -69,14 +93,25 @@ private static List GenerateMenuChoices() private static string GenerateMenuItems(MenuItems item) { return item switch - { - MenuItems.Addition => "➕ Legg sammen tall (Addisjon)", - MenuItems.Subtraction => "➖ Trekk fra tall (Subtraksjon)", - MenuItems.Division => "Dele", - MenuItems.Multiplication => "* Gange", - MenuItems.Results => "📊 Vis tidligere resultat og statistikk", - MenuItems.Quit => "❌ Avslutt spillet", - _ => item.ToString() - }; + { + MenuItems.Difficulty => "Velg vanskelighetsgrad", + MenuItems.Play => "Spill en runde", + MenuItems.Results => "📊 Vis tidligere resultat og statistikk", + MenuItems.Quit => "❌ Avslutt spillet", + _ => item.ToString() + }; } + + private static string GenerateGameMenu(Menu item) + { + return item switch + { + Menu.Addition => "➕ Legg sammen tall (Addisjon)", + Menu.Subtraction => "➖ Trekk fra tall (Subtraksjon)", + Menu.Division => "Dele", + Menu.Multiplication => "* Gange", + _ => item.ToString() + }; + } + } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Enums/Enums.cs b/mathGame.MichaelHelgesen/Enums/Enums.cs index 6d4f3fb7..f5665359 100644 --- a/mathGame.MichaelHelgesen/Enums/Enums.cs +++ b/mathGame.MichaelHelgesen/Enums/Enums.cs @@ -1,14 +1,12 @@ namespace mathGame.MichaelHelgesen.Enums; -enum MenuItems +enum Menu { Addition, Multiplication, Division, Subtraction, - Random, - Results, - Quit + Random } enum Difficulty @@ -18,7 +16,7 @@ enum Difficulty Hard } -enum MenuChoice +enum MenuItems { Play, Results, diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index f2d02e5b..4301985f 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -6,7 +6,8 @@ namespace mathGame.MichaelHelgesen.Models; class Game { static readonly int numberOfTurns = 5; - internal static GameData PlayRound(MenuItems gameType) +internal static Difficulty DifficultySetting { get; set; } = Difficulty.Normal; + internal static GameData PlayRound(Menu gameType) { List turns = []; @@ -34,11 +35,11 @@ internal class GameTurn(MathProblem mathProblem, PlayerAnswer playerAnswer) internal MathProblem MathProblem { get; } = mathProblem; internal PlayerAnswer PlayerAnswer { get; } = playerAnswer; } - internal class GameData(MenuItems gameType, List turns) + internal class GameData(Menu gameType, List turns) { static int _nextGameNumber = 1; internal int GameNumber { get; } = _nextGameNumber++; - internal MenuItems GameType { get; } = gameType; + internal Menu GameType { get; } = gameType; internal List GameTurns { get; } = turns; diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 044e04e5..1978ad9d 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -9,29 +9,29 @@ class MathProblem internal string Operator { get; } internal int CorrectAnswer { get; set; } - internal MathProblem(MenuItems gameType) + internal MathProblem(Menu gameType) { - if (gameType == MenuItems.Random) gameType = GenerateRandomOperator(); + if (gameType == Menu.Random) gameType = GenerateRandomOperator(); GenerateNumbers(); switch (gameType) { - case MenuItems.Addition: + case Menu.Addition: Operator = "+"; CorrectAnswer = FirstNumber + SecondNumber; break; - case MenuItems.Subtraction: + case Menu.Subtraction: Operator = "-"; CorrectAnswer = FirstNumber - SecondNumber; break; - case MenuItems.Multiplication: + case Menu.Multiplication: Operator = "*"; CorrectAnswer = FirstNumber * SecondNumber; break; - case MenuItems.Division: + case Menu.Division: FirstNumber *= SecondNumber; Operator = "/"; CorrectAnswer = FirstNumber / SecondNumber; @@ -41,18 +41,23 @@ internal MathProblem(MenuItems gameType) void GenerateNumbers() { - FirstNumber = Random.Shared.Next(1, 10); - SecondNumber = Random.Shared.Next(1, 10); + + var maxNumber = Game.DifficultySetting switch + { + Difficulty.Hard => 1000, + Difficulty.Easy => 10, + _ => 100, + }; + + FirstNumber = Random.Shared.Next(0, maxNumber); + SecondNumber = Random.Shared.Next(1, maxNumber); } - MenuItems GenerateRandomOperator() + Menu GenerateRandomOperator() { - // This feels like a bad solution - // I would rather have two Enums? - var values = Enum.GetValues() - .Where(m => m != MenuItems.Quit - && m != MenuItems.Results - && m != MenuItems.Random) + + var values = Enum.GetValues() + .Where(m => m != Menu.Random) .ToArray(); return values[Random.Shared.Next(values.Length)]; diff --git a/mathGame.MichaelHelgesen/math_game.csproj b/mathGame.MichaelHelgesen/math_game.csproj index 04af1154..2d744420 100644 --- a/mathGame.MichaelHelgesen/math_game.csproj +++ b/mathGame.MichaelHelgesen/math_game.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net8.0 enable enable From 880bd625fbc9cafc267abc3b9fb6132e4cf165f3 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Sat, 22 Aug 2026 19:00:58 +0200 Subject: [PATCH 20/26] feat(game): Implemented timer --- .../Controllers/GameController.cs | 4 +- .../Controllers/MenuController.cs | 94 +++++++++++-------- mathGame.MichaelHelgesen/Enums/Enums.cs | 4 +- mathGame.MichaelHelgesen/Models/Archive.cs | 2 + mathGame.MichaelHelgesen/Models/Game.cs | 21 +++-- .../Models/MathProblem.cs | 18 ++-- mathGame.MichaelHelgesen/Program.cs | 2 +- 7 files changed, 88 insertions(+), 57 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index f58787bc..d2f913f6 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -9,7 +9,7 @@ class GameController() { internal static Archive archive = new(); - internal static void StartGame(Menu gameType) + internal static void StartGame(GameType gameType) { AnsiConsole.Prompt( new TextPrompt($"You selected: [yellow]{gameType}[/]. [grey]Press [bold]Enter[/] to continue...[/]") @@ -17,6 +17,6 @@ internal static void StartGame(Menu gameType) ); var gameRound = Game.PlayRound(gameType); archive.ArchiveGameRound(gameRound); - MenuController.Run(); + MenuController.RenderMainMenu(); } } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index b59f9c27..935286c3 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -12,28 +12,28 @@ namespace mathGame.MichaelHelgesen.Controllers; // DONE: To follow the DRY Principle, try using just one method for all games. Additionally, double check your project and try to find opportunities to achieve the same functionality with less code, avoiding repetition when possible. // DONE: Create a 'Random Game' option where the players will be presented with questions from random operations // DONE: Try to implement levels of difficulty. +// DONE: Add a timer to track how long the user takes to finish the game. -// TODO: Add a timer to track how long the user takes to finish the game. class MenuController { - internal static void Run() + internal static void RenderMainMenu() { Console.Clear(); AnsiConsole.MarkupLine("[bold blue]Welcome[/] to [green]the Math Game[/]!"); - var playerChoice = DisplayMainMenu(); + var mainMenuChoice = DisplayMainMenu(); - switch (playerChoice) + switch (mainMenuChoice) { - case MenuItems.Play: + case GameChoice.Play: DisplayGameMenu(); break; - case MenuItems.Results: - DisplayResults(playerChoice); + case GameChoice.Results: + DisplayResults(mainMenuChoice); break; - case MenuItems.Difficulty: + case GameChoice.Difficulty: DisplayDifficultyMenu(); break; } @@ -41,77 +41,97 @@ internal static void Run() private static void DisplayDifficultyMenu() { - var difficulty = Enum.GetValues().ToList(); - var difficultyChoice = AnsiConsole.Prompt( + var DifficultyChoices = Enum.GetValues().ToList(); + var DifficultyChoice = AnsiConsole.Prompt( new SelectionPrompt() .Title("Choose [green]game type[/] would you like?") - .AddChoices(difficulty)); - Game.DifficultySetting = difficultyChoice; - Run(); + .UseConverter(item => GenerateDifficultyMenu(item)) + .AddChoices(DifficultyChoices)); + Game.DifficultySetting = DifficultyChoice; + RenderMainMenu(); } - private static void DisplayResults(MenuItems playerChoice) + private static void DisplayResults(GameChoice mainMenuChoice) { Console.Clear(); - AnsiConsole.MarkupLine($"You selected: [yellow]{playerChoice}[/]"); + AnsiConsole.MarkupLine($"You selected: [yellow]{mainMenuChoice}[/]"); GameController.archive.DisplayArchive(); AnsiConsole.Prompt( new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") .AllowEmpty() ); - Run(); + RenderMainMenu(); } private static void DisplayGameMenu() { - var choices = Enum.GetValues().ToList(); - var menuChoice = AnsiConsole.Prompt( - new SelectionPrompt() + var GameChoices = Enum.GetValues().ToList(); + var gameChoice = AnsiConsole.Prompt( + new SelectionPrompt() .Title("Choose [green]game type[/] would you like?") .UseConverter(item => GenerateGameMenu(item)) - .AddChoices(choices)); - GameController.StartGame(menuChoice); + .AddChoices(GameChoices)); + GameController.StartGame(gameChoice); } - private static MenuItems DisplayMainMenu() + private static GameChoice DisplayMainMenu() { var menuChoices = GenerateMenuChoices(); var menuChoice = AnsiConsole.Prompt( - new SelectionPrompt() + new SelectionPrompt() .Title("Choose [green]game type[/] would you like?") - .UseConverter(item => GenerateMenuItems(item)) + .UseConverter(item => GenerateMainMenuItem(item)) .AddChoices(menuChoices)); return menuChoice; } - private static List GenerateMenuChoices() + private static List GenerateMenuChoices() { - var choices = Enum.GetValues().ToList(); - if (GameController.archive.ArchivedGames.Count < 1) choices.Remove(MenuItems.Results); + var choices = Enum.GetValues().ToList(); + if (GameController.archive.ArchivedGames.Count < 1) choices.Remove(GameChoice.Results); return choices; } - private static string GenerateMenuItems(MenuItems item) + private static string GenerateMainMenuItem(GameChoice item) { return item switch { - MenuItems.Difficulty => "Velg vanskelighetsgrad", - MenuItems.Play => "Spill en runde", - MenuItems.Results => "📊 Vis tidligere resultat og statistikk", - MenuItems.Quit => "❌ Avslutt spillet", + GameChoice.Difficulty => "Velg vanskelighetsgrad", + GameChoice.Play => "Spill en runde", + GameChoice.Results => "📊 Vis tidligere resultat og statistikk", + GameChoice.Quit => "❌ Avslutt spillet", _ => item.ToString() }; } - private static string GenerateGameMenu(Menu item) + private static string GenerateGameMenu(GameType item) { return item switch { - Menu.Addition => "➕ Legg sammen tall (Addisjon)", - Menu.Subtraction => "➖ Trekk fra tall (Subtraksjon)", - Menu.Division => "Dele", - Menu.Multiplication => "* Gange", + GameType.Addition => "➕ Legg sammen tall (Addisjon)", + GameType.Subtraction => "➖ Trekk fra tall (Subtraksjon)", + GameType.Division => "Dele", + GameType.Multiplication => "* Gange", _ => item.ToString() }; } + private static string GenerateDifficultyMenu(Difficulty item) + { + bool isSelected = item == Game.DifficultySetting; + + string text = item switch + { + Difficulty.Easy => "Easy: Opp til 10", + Difficulty.Normal => "Normal: Opp til 100", + Difficulty.Hard => "Difficult: Opp til 1000", + _ => item.ToString() + }; + if (isSelected) + { + return $"[bold green]{text} (Aktiv)[/]"; + } + + // Ellers returneres teksten uendret/tonet ned + return $"[grey]{text}[/]"; + } } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Enums/Enums.cs b/mathGame.MichaelHelgesen/Enums/Enums.cs index f5665359..70fa58a1 100644 --- a/mathGame.MichaelHelgesen/Enums/Enums.cs +++ b/mathGame.MichaelHelgesen/Enums/Enums.cs @@ -1,6 +1,6 @@ namespace mathGame.MichaelHelgesen.Enums; -enum Menu +enum GameType { Addition, Multiplication, @@ -16,7 +16,7 @@ enum Difficulty Hard } -enum MenuItems +enum GameChoice { Play, Results, diff --git a/mathGame.MichaelHelgesen/Models/Archive.cs b/mathGame.MichaelHelgesen/Models/Archive.cs index 05661289..a8250954 100644 --- a/mathGame.MichaelHelgesen/Models/Archive.cs +++ b/mathGame.MichaelHelgesen/Models/Archive.cs @@ -14,6 +14,8 @@ internal void DisplayArchive() { Console.WriteLine($"A game of {gameRound.GameType}"); Console.WriteLine($"Game number: {gameRound.GameNumber}"); + Console.WriteLine($"Time: {gameRound.TimeUsed:mm\\:ss}"); + Console.WriteLine($"Score: {gameRound.Points()}"); foreach (var gameTurn in gameRound.GameTurns) { Console.WriteLine($"Math problem: {gameTurn.MathProblem.AsString}"); diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index 4301985f..1d12de29 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -2,13 +2,18 @@ namespace mathGame.MichaelHelgesen.Models; using mathGame.MichaelHelgesen.Enums; using Spectre.Console; +using System.Diagnostics; class Game { static readonly int numberOfTurns = 5; -internal static Difficulty DifficultySetting { get; set; } = Difficulty.Normal; - internal static GameData PlayRound(Menu gameType) + + internal static Difficulty DifficultySetting { get; set; } = Difficulty.Normal; + + internal static GameData PlayRound(GameType gameType) { + long startTimestamp = Stopwatch.GetTimestamp(); + List turns = []; for (int i = 0; i < numberOfTurns; i++) @@ -27,7 +32,11 @@ internal static GameData PlayRound(Menu gameType) turns.Add(gameTurn); } - GameData playedGame = new GameData(gameType, turns); + + TimeSpan tidBrukt = Stopwatch.GetElapsedTime(startTimestamp); + + GameData playedGame = new GameData(gameType, turns, tidBrukt); + return playedGame; } internal class GameTurn(MathProblem mathProblem, PlayerAnswer playerAnswer) @@ -35,11 +44,12 @@ internal class GameTurn(MathProblem mathProblem, PlayerAnswer playerAnswer) internal MathProblem MathProblem { get; } = mathProblem; internal PlayerAnswer PlayerAnswer { get; } = playerAnswer; } - internal class GameData(Menu gameType, List turns) + internal class GameData(GameType gameType, List turns, TimeSpan timeUsed) { static int _nextGameNumber = 1; internal int GameNumber { get; } = _nextGameNumber++; - internal Menu GameType { get; } = gameType; + internal TimeSpan TimeUsed { get; } = timeUsed; + internal GameType GameType { get; } = gameType; internal List GameTurns { get; } = turns; @@ -51,7 +61,6 @@ internal int Points() if (turn.PlayerAnswer.IsCorrect) points++; } - return points; } } diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 1978ad9d..93e33c03 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -9,29 +9,29 @@ class MathProblem internal string Operator { get; } internal int CorrectAnswer { get; set; } - internal MathProblem(Menu gameType) + internal MathProblem(GameType gameType) { - if (gameType == Menu.Random) gameType = GenerateRandomOperator(); + if (gameType == GameType.Random) gameType = GenerateRandomOperator(); GenerateNumbers(); switch (gameType) { - case Menu.Addition: + case GameType.Addition: Operator = "+"; CorrectAnswer = FirstNumber + SecondNumber; break; - case Menu.Subtraction: + case GameType.Subtraction: Operator = "-"; CorrectAnswer = FirstNumber - SecondNumber; break; - case Menu.Multiplication: + case GameType.Multiplication: Operator = "*"; CorrectAnswer = FirstNumber * SecondNumber; break; - case Menu.Division: + case GameType.Division: FirstNumber *= SecondNumber; Operator = "/"; CorrectAnswer = FirstNumber / SecondNumber; @@ -53,11 +53,11 @@ void GenerateNumbers() SecondNumber = Random.Shared.Next(1, maxNumber); } - Menu GenerateRandomOperator() + GameType GenerateRandomOperator() { - var values = Enum.GetValues() - .Where(m => m != Menu.Random) + var values = Enum.GetValues() + .Where(m => m != GameType.Random) .ToArray(); return values[Random.Shared.Next(values.Length)]; diff --git a/mathGame.MichaelHelgesen/Program.cs b/mathGame.MichaelHelgesen/Program.cs index 16a61ed8..3ff69ad2 100644 --- a/mathGame.MichaelHelgesen/Program.cs +++ b/mathGame.MichaelHelgesen/Program.cs @@ -1,3 +1,3 @@ using mathGame.MichaelHelgesen.Controllers; -MenuController.Run(); \ No newline at end of file +MenuController.RenderMainMenu(); \ No newline at end of file From 95b9aba90d192d99510447eb9eb6a1d7212e3e0d Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Mon, 24 Aug 2026 07:55:53 +0200 Subject: [PATCH 21/26] refactor: fix layout --- .../Controllers/GameController.cs | 23 +++++- .../Controllers/MenuController.cs | 79 ++++++++++--------- mathGame.MichaelHelgesen/Models/Game.cs | 43 +++++----- 3 files changed, 89 insertions(+), 56 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index d2f913f6..1a2d6937 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -15,8 +15,29 @@ internal static void StartGame(GameType gameType) new TextPrompt($"You selected: [yellow]{gameType}[/]. [grey]Press [bold]Enter[/] to continue...[/]") .AllowEmpty() ); + var gameRound = Game.PlayRound(gameType); + archive.ArchiveGameRound(gameRound); + + DisplayGameResults(gameRound); + MenuController.RenderMainMenu(); } -} \ No newline at end of file + + internal static void DisplayGameResults(Game.GameData gameRound) + { + Console.Clear(); + Console.WriteLine($"Round over. You scored: {gameRound.Points()}, in {gameRound.TimeUsed.ToString(@"mm\:ss")}"); + foreach (var q in gameRound.GameTurns) + { + Console.WriteLine($"{q.MathProblem.AsString} = {q.MathProblem.CorrectAnswer}\tYour answer: {q.PlayerAnswer.Answer}"); + } + + AnsiConsole.Prompt( + new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") + .AllowEmpty() + ); + } +} + diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index 935286c3..b860d1b1 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -4,17 +4,6 @@ namespace mathGame.MichaelHelgesen.Controllers; using mathGame.MichaelHelgesen.Models; using Spectre.Console; -// DONE: Users should be presented with a menu to choose an operation -// DONE: A game needs to have at least 5 questions. -// DONE: The divisions should result on INTEGERS ONLY and dividends should go from 0 to 100. Example: Your app shouldn't present the division 7/2 to the user, since it doesn't result in an integer. -// DONE: You need to create a game that consists of asking the player what's the result of a math question (i.e. 9 x 9 = ?), collecting the input and adding a point in case of a correct answer. -// DONE: You should record previous games in a List and there should be an option in the menu for the user to visualize a history of previous games. -// DONE: To follow the DRY Principle, try using just one method for all games. Additionally, double check your project and try to find opportunities to achieve the same functionality with less code, avoiding repetition when possible. -// DONE: Create a 'Random Game' option where the players will be presented with questions from random operations -// DONE: Try to implement levels of difficulty. -// DONE: Add a timer to track how long the user takes to finish the game. - - class MenuController { internal static void RenderMainMenu() @@ -22,6 +11,7 @@ internal static void RenderMainMenu() Console.Clear(); AnsiConsole.MarkupLine("[bold blue]Welcome[/] to [green]the Math Game[/]!"); + AnsiConsole.MarkupLine($"[bold blue]Current difficulty:[/] [green]{Game.DifficultySetting}[/].\n"); var mainMenuChoice = DisplayMainMenu(); @@ -41,13 +31,21 @@ internal static void RenderMainMenu() private static void DisplayDifficultyMenu() { - var DifficultyChoices = Enum.GetValues().ToList(); + var DifficultyChoices = Enum.GetValues().Cast().ToList(); + DifficultyChoices.Add(null); var DifficultyChoice = AnsiConsole.Prompt( - new SelectionPrompt() - .Title("Choose [green]game type[/] would you like?") - .UseConverter(item => GenerateDifficultyMenu(item)) - .AddChoices(DifficultyChoices)); - Game.DifficultySetting = DifficultyChoice; + new SelectionPrompt() + .Title("Choose [green]difficulty[/] level:") + .UseConverter(item => item.HasValue + ? GenerateDifficultyMenu(item.Value) + : "[yellow]<- Back to Main Menu[/]") + .AddChoices(DifficultyChoices)); + if (DifficultyChoice == null) + { + RenderMainMenu(); + return; + } + Game.DifficultySetting = DifficultyChoice.Value; RenderMainMenu(); } @@ -64,18 +62,26 @@ private static void DisplayResults(GameChoice mainMenuChoice) } private static void DisplayGameMenu() { - var GameChoices = Enum.GetValues().ToList(); + var GameChoices = Enum.GetValues().Cast().ToList(); + GameChoices.Add(null); var gameChoice = AnsiConsole.Prompt( - new SelectionPrompt() - .Title("Choose [green]game type[/] would you like?") - .UseConverter(item => GenerateGameMenu(item)) + new SelectionPrompt() + .Title("Choose an [green]option[/] from the meny to continue.") + .UseConverter(item => item.HasValue + ? GenerateGameMenu(item.Value) + : "[yellow]<- Back to Main Menu[/]") .AddChoices(GameChoices)); - GameController.StartGame(gameChoice); + if (gameChoice == null) + { + RenderMainMenu(); + return; + } + GameController.StartGame(gameChoice.Value); } private static GameChoice DisplayMainMenu() { - var menuChoices = GenerateMenuChoices(); + var menuChoices = GenerateMainMenuChoices(); var menuChoice = AnsiConsole.Prompt( new SelectionPrompt() .Title("Choose [green]game type[/] would you like?") @@ -84,7 +90,7 @@ private static GameChoice DisplayMainMenu() return menuChoice; } - private static List GenerateMenuChoices() + private static List GenerateMainMenuChoices() { var choices = Enum.GetValues().ToList(); if (GameController.archive.ArchivedGames.Count < 1) choices.Remove(GameChoice.Results); @@ -95,10 +101,10 @@ private static string GenerateMainMenuItem(GameChoice item) { return item switch { - GameChoice.Difficulty => "Velg vanskelighetsgrad", - GameChoice.Play => "Spill en runde", - GameChoice.Results => "📊 Vis tidligere resultat og statistikk", - GameChoice.Quit => "❌ Avslutt spillet", + GameChoice.Difficulty => "🪜 Choose difficulty", + GameChoice.Play => "▶️ Play a round of The Math Game", + GameChoice.Results => "📊 Show results of previous games", + GameChoice.Quit => "❌ Quit the game", _ => item.ToString() }; } @@ -107,10 +113,11 @@ private static string GenerateGameMenu(GameType item) { return item switch { - GameType.Addition => "➕ Legg sammen tall (Addisjon)", - GameType.Subtraction => "➖ Trekk fra tall (Subtraksjon)", - GameType.Division => "Dele", - GameType.Multiplication => "* Gange", + GameType.Addition => "➕ Add numbers (addition)", + GameType.Subtraction => "➖ Subtract numbers (subtraction)", + GameType.Division => "➗ Divide numbers (division)", + GameType.Multiplication => "✖️ Multiply numbers (multiplication)", + GameType.Random => "🔄 Random (random operators)", _ => item.ToString() }; } @@ -121,14 +128,14 @@ private static string GenerateDifficultyMenu(Difficulty item) string text = item switch { - Difficulty.Easy => "Easy: Opp til 10", - Difficulty.Normal => "Normal: Opp til 100", - Difficulty.Hard => "Difficult: Opp til 1000", + Difficulty.Easy => "Easy: up to 10", + Difficulty.Normal => "Normal: up to 100", + Difficulty.Hard => "Difficult: up to 1000", _ => item.ToString() }; if (isSelected) { - return $"[bold green]{text} (Aktiv)[/]"; + return $"[bold green]{text} (active)[/]"; } // Ellers returneres teksten uendret/tonet ned diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index 1d12de29..eb765afb 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -8,7 +8,7 @@ class Game { static readonly int numberOfTurns = 5; - internal static Difficulty DifficultySetting { get; set; } = Difficulty.Normal; + internal static Difficulty DifficultySetting { get; set; } = Difficulty.Easy; internal static GameData PlayRound(GameType gameType) { @@ -16,27 +16,12 @@ internal static GameData PlayRound(GameType gameType) List turns = []; - for (int i = 0; i < numberOfTurns; i++) - { + PlayTurns(gameType, turns); - MathProblem mathProblem = new MathProblem(gameType); + TimeSpan timeUsed = Stopwatch.GetElapsedTime(startTimestamp); - AnsiConsole.MarkupLine($"[bold blue]Spørsmål {i + 1} av 5[/]"); + GameData playedGame = new GameData(gameType, turns, timeUsed); - int playerAnswer = AnsiConsole.Ask($"Hva er [green]{mathProblem.AsString}[/]?"); - - PlayerAnswer answer = new PlayerAnswer(mathProblem.CorrectAnswer, playerAnswer); - - GameTurn gameTurn = new GameTurn(mathProblem, answer); - - turns.Add(gameTurn); - - } - - TimeSpan tidBrukt = Stopwatch.GetElapsedTime(startTimestamp); - - GameData playedGame = new GameData(gameType, turns, tidBrukt); - return playedGame; } internal class GameTurn(MathProblem mathProblem, PlayerAnswer playerAnswer) @@ -64,4 +49,24 @@ internal int Points() return points; } } + + static void PlayTurns(GameType gameType, List turns) + { + for (int i = 0; i < numberOfTurns; i++) + { + + MathProblem mathProblem = new MathProblem(gameType); + + AnsiConsole.MarkupLine($"[bold blue]Spørsmål {i + 1} av 5[/]"); + + int playerAnswer = AnsiConsole.Ask($"Hva er [green]{mathProblem.AsString}[/]?"); + + PlayerAnswer answer = new PlayerAnswer(mathProblem.CorrectAnswer, playerAnswer); + + GameTurn gameTurn = new GameTurn(mathProblem, answer); + + turns.Add(gameTurn); + + } + } } \ No newline at end of file From dce3fd4928d93043110e5c79e4028714df1aaedd Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Mon, 24 Aug 2026 10:55:34 +0200 Subject: [PATCH 22/26] feat(menu): Upgraded the look of the menus. --- .../Controllers/GameController.cs | 25 ++++------- .../Controllers/MenuController.cs | 12 +++--- mathGame.MichaelHelgesen/Models/Archive.cs | 43 ++++++++++++++----- mathGame.MichaelHelgesen/Models/Game.cs | 7 +-- mathGame.MichaelHelgesen/math_game.csproj | 2 +- 5 files changed, 54 insertions(+), 35 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index 1a2d6937..9959aca9 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -1,5 +1,4 @@ namespace mathGame.MichaelHelgesen.Controllers; - using mathGame.MichaelHelgesen.Enums; using mathGame.MichaelHelgesen.Models; using Spectre.Console; @@ -9,35 +8,29 @@ class GameController() { internal static Archive archive = new(); - internal static void StartGame(GameType gameType) + internal static void RunGame(GameType gameType) { + Console.Clear(); AnsiConsole.Prompt( - new TextPrompt($"You selected: [yellow]{gameType}[/]. [grey]Press [bold]Enter[/] to continue...[/]") + new TextPrompt($"[grey]Press [bold]Enter[/] when ready. Your game is beeing timed.[/]") .AllowEmpty() ); + Console.Clear(); var gameRound = Game.PlayRound(gameType); archive.ArchiveGameRound(gameRound); - DisplayGameResults(gameRound); + Console.Clear(); - MenuController.RenderMainMenu(); - } + archive.DisplayLastGame(); - internal static void DisplayGameResults(Game.GameData gameRound) - { - Console.Clear(); - Console.WriteLine($"Round over. You scored: {gameRound.Points()}, in {gameRound.TimeUsed.ToString(@"mm\:ss")}"); - foreach (var q in gameRound.GameTurns) - { - Console.WriteLine($"{q.MathProblem.AsString} = {q.MathProblem.CorrectAnswer}\tYour answer: {q.PlayerAnswer.Answer}"); - } - AnsiConsole.Prompt( - new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") + new TextPrompt($"[grey]Press [bold]Enter[/] to return to main menu.[/]") .AllowEmpty() ); + + MenuController.RenderMainMenu(); } } diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index b860d1b1..dd97f8cc 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -31,6 +31,7 @@ internal static void RenderMainMenu() private static void DisplayDifficultyMenu() { + Console.Clear(); var DifficultyChoices = Enum.GetValues().Cast().ToList(); DifficultyChoices.Add(null); var DifficultyChoice = AnsiConsole.Prompt( @@ -52,21 +53,22 @@ private static void DisplayDifficultyMenu() private static void DisplayResults(GameChoice mainMenuChoice) { Console.Clear(); - AnsiConsole.MarkupLine($"You selected: [yellow]{mainMenuChoice}[/]"); + AnsiConsole.MarkupLine($"[yellow]{mainMenuChoice}[/]:\n"); GameController.archive.DisplayArchive(); AnsiConsole.Prompt( - new TextPrompt($"[grey]Press [bold]Enter[/] to continue...[/]") + new TextPrompt($"[grey]Press [bold]Enter[/] to return to main menu.[/]") .AllowEmpty() ); RenderMainMenu(); } private static void DisplayGameMenu() { + Console.Clear(); var GameChoices = Enum.GetValues().Cast().ToList(); GameChoices.Add(null); var gameChoice = AnsiConsole.Prompt( new SelectionPrompt() - .Title("Choose an [green]option[/] from the meny to continue.") + .Title("Choose a [green]game mode[/] from the meny to continue.") .UseConverter(item => item.HasValue ? GenerateGameMenu(item.Value) : "[yellow]<- Back to Main Menu[/]") @@ -76,7 +78,7 @@ private static void DisplayGameMenu() RenderMainMenu(); return; } - GameController.StartGame(gameChoice.Value); + GameController.RunGame(gameChoice.Value); } private static GameChoice DisplayMainMenu() @@ -84,7 +86,7 @@ private static GameChoice DisplayMainMenu() var menuChoices = GenerateMainMenuChoices(); var menuChoice = AnsiConsole.Prompt( new SelectionPrompt() - .Title("Choose [green]game type[/] would you like?") + .Title("Please choose [green]an option[/] from the meny below") .UseConverter(item => GenerateMainMenuItem(item)) .AddChoices(menuChoices)); return menuChoice; diff --git a/mathGame.MichaelHelgesen/Models/Archive.cs b/mathGame.MichaelHelgesen/Models/Archive.cs index a8250954..9d0ad42a 100644 --- a/mathGame.MichaelHelgesen/Models/Archive.cs +++ b/mathGame.MichaelHelgesen/Models/Archive.cs @@ -1,5 +1,7 @@ namespace mathGame.MichaelHelgesen.Models; +using Spectre.Console; + class Archive { internal List ArchivedGames = new(); @@ -8,21 +10,42 @@ internal void ArchiveGameRound(Game.GameData game) ArchivedGames.Add(game); } + internal void DisplayLastGame() + { + if (ArchivedGames.Count == 0) return; + + DisplayArchive([ArchivedGames[^1]]); + } + internal void DisplayArchive() { - foreach (var gameRound in ArchivedGames) + DisplayArchive(ArchivedGames); + } + + internal void DisplayArchive(List games) + { + foreach (var gameRound in games) { - Console.WriteLine($"A game of {gameRound.GameType}"); - Console.WriteLine($"Game number: {gameRound.GameNumber}"); - Console.WriteLine($"Time: {gameRound.TimeUsed:mm\\:ss}"); - Console.WriteLine($"Score: {gameRound.Points()}"); - foreach (var gameTurn in gameRound.GameTurns) + AnsiConsole.MarkupLine($"[bold blue]Game #{gameRound.GameNumber} - {gameRound.GameType}[/]"); + AnsiConsole.MarkupLine($"[dim]Time used:[/] [yellow]{gameRound.TimeUsed:mm\\:ss}[/]"); + AnsiConsole.MarkupLine($"[dim]Total points:[/] [bold underline]{gameRound.Points()}[/]\n"); + + for (int i = 0; i < gameRound.GameTurns.Count; i++) { - Console.WriteLine($"Math problem: {gameTurn.MathProblem.AsString}"); - Console.WriteLine($"Correct answer: {gameTurn.MathProblem.CorrectAnswer}"); - Console.WriteLine($"Player answer: {gameTurn.PlayerAnswer.Answer}"); - Console.WriteLine($"Player answer correct: {gameTurn.PlayerAnswer.IsCorrect}"); + var turn = gameRound.GameTurns[i]; + bool isCorrect = turn.PlayerAnswer.IsCorrect; + + // Velg farge basert på om svaret var riktig eller feil + string statusColor = isCorrect ? "green" : "red"; + string statusIcon = isCorrect ? "[✓]" : "[✗]"; + + AnsiConsole.MarkupLine( + $" [dim]Round {i + 1}:[/] {turn.MathProblem.AsString} = [bold]{turn.MathProblem.CorrectAnswer}[/]" + + $"\tYour answer: [{statusColor}]{turn.PlayerAnswer.Answer} [{statusIcon}][/]" + ); } + + AnsiConsole.WriteLine(); } } } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index eb765afb..571334ac 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -54,12 +54,13 @@ static void PlayTurns(GameType gameType, List turns) { for (int i = 0; i < numberOfTurns; i++) { - + Console.Clear(); + MathProblem mathProblem = new MathProblem(gameType); - AnsiConsole.MarkupLine($"[bold blue]Spørsmål {i + 1} av 5[/]"); + AnsiConsole.MarkupLine($"[bold blue]Question {i + 1} of 5[/]"); - int playerAnswer = AnsiConsole.Ask($"Hva er [green]{mathProblem.AsString}[/]?"); + int playerAnswer = AnsiConsole.Ask($"What is [green]{mathProblem.AsString}[/]?"); PlayerAnswer answer = new PlayerAnswer(mathProblem.CorrectAnswer, playerAnswer); diff --git a/mathGame.MichaelHelgesen/math_game.csproj b/mathGame.MichaelHelgesen/math_game.csproj index 2d744420..04af1154 100644 --- a/mathGame.MichaelHelgesen/math_game.csproj +++ b/mathGame.MichaelHelgesen/math_game.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net9.0 enable enable From 5675b61d06e7d8d0693bf6fc54c2d2496943118a Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Mon, 24 Aug 2026 12:22:51 +0200 Subject: [PATCH 23/26] refactor: Remove casting from Enums in menu --- .../Controllers/MenuController.cs | 46 +++++++++++-------- mathGame.MichaelHelgesen/Enums/Enums.cs | 6 ++- .../Models/MathProblem.cs | 2 +- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index dd97f8cc..bd932e7b 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -27,26 +27,30 @@ internal static void RenderMainMenu() DisplayDifficultyMenu(); break; } + } private static void DisplayDifficultyMenu() { Console.Clear(); - var DifficultyChoices = Enum.GetValues().Cast().ToList(); - DifficultyChoices.Add(null); - var DifficultyChoice = AnsiConsole.Prompt( - new SelectionPrompt() - .Title("Choose [green]difficulty[/] level:") - .UseConverter(item => item.HasValue - ? GenerateDifficultyMenu(item.Value) - : "[yellow]<- Back to Main Menu[/]") + var DifficultyChoices = Enum.GetValues(); + + var difficultyChoice = AnsiConsole.Prompt( + new SelectionPrompt() + .Title("Choose [green]difficulty[/] level:") + .UseConverter(item => item switch + { + Difficulty.Back => "[yellow]<- Back to Main Menu[/]", + _ => GenerateDifficultyMenu(item) + }) .AddChoices(DifficultyChoices)); - if (DifficultyChoice == null) + + if (difficultyChoice == Difficulty.Back) { RenderMainMenu(); return; } - Game.DifficultySetting = DifficultyChoice.Value; + Game.DifficultySetting = difficultyChoice; RenderMainMenu(); } @@ -64,26 +68,30 @@ private static void DisplayResults(GameChoice mainMenuChoice) private static void DisplayGameMenu() { Console.Clear(); - var GameChoices = Enum.GetValues().Cast().ToList(); - GameChoices.Add(null); + var GameChoices = Enum.GetValues(); + var gameChoice = AnsiConsole.Prompt( - new SelectionPrompt() + new SelectionPrompt() .Title("Choose a [green]game mode[/] from the meny to continue.") - .UseConverter(item => item.HasValue - ? GenerateGameMenu(item.Value) - : "[yellow]<- Back to Main Menu[/]") + .UseConverter(item => item switch + { + GameType.Back => "[yellow]<- Back to Main Menu[/]", + _ => GenerateGameMenu(item) + }) .AddChoices(GameChoices)); - if (gameChoice == null) + + if (gameChoice == GameType.Back) { RenderMainMenu(); return; } - GameController.RunGame(gameChoice.Value); + GameController.RunGame(gameChoice); } private static GameChoice DisplayMainMenu() { var menuChoices = GenerateMainMenuChoices(); + var menuChoice = AnsiConsole.Prompt( new SelectionPrompt() .Title("Please choose [green]an option[/] from the meny below") @@ -139,8 +147,6 @@ private static string GenerateDifficultyMenu(Difficulty item) { return $"[bold green]{text} (active)[/]"; } - - // Ellers returneres teksten uendret/tonet ned return $"[grey]{text}[/]"; } } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Enums/Enums.cs b/mathGame.MichaelHelgesen/Enums/Enums.cs index 70fa58a1..a28252bb 100644 --- a/mathGame.MichaelHelgesen/Enums/Enums.cs +++ b/mathGame.MichaelHelgesen/Enums/Enums.cs @@ -6,14 +6,16 @@ enum GameType Multiplication, Division, Subtraction, - Random + Random, + Back } enum Difficulty { Easy, Normal, - Hard + Hard, + Back } enum GameChoice diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 93e33c03..1080ae61 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -31,7 +31,7 @@ internal MathProblem(GameType gameType) Operator = "*"; CorrectAnswer = FirstNumber * SecondNumber; break; - case GameType.Division: + default: FirstNumber *= SecondNumber; Operator = "/"; CorrectAnswer = FirstNumber / SecondNumber; From fa70a549eaeb0f738eb77730edfac5bc10c93bd8 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Mon, 24 Aug 2026 22:04:26 +0200 Subject: [PATCH 24/26] fix: deleted old files --- mathGame.MichaelHelgesen/Game.cs | 10 -- mathGame.MichaelHelgesen/MathQuestion.cs | 8 -- mathGame.MichaelHelgesen/PlayGame.cs | 119 ---------------------- mathGame.MichaelHelgesen/PlayerMenu.cs | 57 ----------- mathGame.MichaelHelgesen/Program-old.cs | 77 -------------- mathGame.MichaelHelgesen/math_game.csproj | 2 +- 6 files changed, 1 insertion(+), 272 deletions(-) delete mode 100644 mathGame.MichaelHelgesen/Game.cs delete mode 100644 mathGame.MichaelHelgesen/MathQuestion.cs delete mode 100644 mathGame.MichaelHelgesen/PlayGame.cs delete mode 100644 mathGame.MichaelHelgesen/PlayerMenu.cs delete mode 100644 mathGame.MichaelHelgesen/Program-old.cs diff --git a/mathGame.MichaelHelgesen/Game.cs b/mathGame.MichaelHelgesen/Game.cs deleted file mode 100644 index ecd963bf..00000000 --- a/mathGame.MichaelHelgesen/Game.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Hva betyr static og ikke static igjen? -public class Game -{ - public int GameNumber { get; set; } - public int GameScore { get; set; } - public string GameType { get; set; } - public string PlayerName { get; set;} - public List Questions { get; set; } = new List(); - -} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/MathQuestion.cs b/mathGame.MichaelHelgesen/MathQuestion.cs deleted file mode 100644 index 124e65bf..00000000 --- a/mathGame.MichaelHelgesen/MathQuestion.cs +++ /dev/null @@ -1,8 +0,0 @@ -public struct MathQuestion -{ - public string QuestionText { get; set; } - public int CorrectAnswer { get; set; } - public int PlayerAnswer { get; set; } - - public bool IsCorrect => PlayerAnswer == CorrectAnswer; -} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/PlayGame.cs b/mathGame.MichaelHelgesen/PlayGame.cs deleted file mode 100644 index 961fd847..00000000 --- a/mathGame.MichaelHelgesen/PlayGame.cs +++ /dev/null @@ -1,119 +0,0 @@ -public static class PlayGame -{ - public static Game StartGame(int selectedGame, string playerName, int gameNumber) - { - int gameRounds = 1; - int gameScore = 0; - - var (operand, gameType) = selectedGame switch - { - 1 => ("+", "addition"), - 2 => ("*", "multiplication"), - 3 => ("/", "division"), - _ => ("-", "subtraction"), - }; - - Game game = new Game - { - GameNumber = gameNumber, - GameType = gameType - }; - - Console.Clear(); - Console.WriteLine($"You chose {gameType}!\n\nTry to solve five math problems in a row\n\nPress enter when ready {playerName}!"); - - while (Console.ReadKey(true).Key != ConsoleKey.Enter) - { - // Ignorerer alle andre taster lydløst - } - - // -- Egen metode gather valid answer -- - do - { - int a = Random.Shared.Next(1, 11); - int b = Random.Shared.Next(0, 11); - int c = a * b; - bool validAnswer = false; - int answer = 0; - int correctAnswer; - - Console.Clear(); - if (selectedGame == 3) - Console.WriteLine($"Question {gameRounds}/5: What is {c} {operand} {a}?"); - - else - Console.WriteLine($"Question {gameRounds}/5: What is {a} {operand} {b}?"); - - do - { - try - { - answer = int.Parse(Console.ReadLine()); - validAnswer = true; - - } - catch (FormatException ex) - { - Console.WriteLine($"Only use numbers. Please try again!"); - } - } - while (!validAnswer); - - // -- Egen metode create math problem // - if (selectedGame == 1) - correctAnswer = a + b; - - else if (selectedGame == 2) - correctAnswer = a * b; - - else if (selectedGame == 3) - correctAnswer = c / a; - - else correctAnswer = a - b; - - MathQuestion newTask = new MathQuestion - { - QuestionText = $"{a} {operand} {b}", - CorrectAnswer = correctAnswer, - PlayerAnswer = answer - }; - - if (newTask.IsCorrect) - { - gameScore++; - } - - game.Questions.Add(newTask); - gameRounds++; - } - while (gameRounds < 6); - - Console.Clear(); - Console.WriteLine($"Game over for game number {gameNumber}. You scored {gameScore} points.\nHere are the results:\n"); - game.GameScore = gameScore; - - // -- Egen metode display result -- - foreach (var q in game.Questions) - { - Console.WriteLine($"{q.QuestionText} = {q.CorrectAnswer}\tYour answer: {q.PlayerAnswer}"); - } - - // -- Egen metode play again-- - Console.WriteLine("\nDo you want to play again? (Y/N): "); - - ConsoleKeyInfo tastInput; - do - { - // tar imot tastetrykk uten at brukeren må trykke Enter - tastInput = Console.ReadKey(intercept: true); - } while (tastInput.Key != ConsoleKey.Y && tastInput.Key != ConsoleKey.N); - - if (tastInput.Key == ConsoleKey.N) - { - Console.WriteLine("Bye"); - Environment.Exit(0); - } - - return game; - } -} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/PlayerMenu.cs b/mathGame.MichaelHelgesen/PlayerMenu.cs deleted file mode 100644 index 0d02cb78..00000000 --- a/mathGame.MichaelHelgesen/PlayerMenu.cs +++ /dev/null @@ -1,57 +0,0 @@ - -public static class PlayerMenu -{ - public static int GeneratePlayerMenu(int gameNumber, string playerName) - { - ConsoleKeyInfo tastInput; - int selectedGame; - bool validPlayerChoise = false; - - List allMenuChoices = new List { - "Press 1 for addition (+)", - "Press 2 for multiplication (*)", - "Press 3 for division (/)", - "Press 4 for subtraction (-)", - "Press 5 for game results", - "Press Esc to quit" - }; - - List activeMenuChoices = new List(); - - for (int i = 0; i < 4; i++) - { - activeMenuChoices.Add(allMenuChoices[i]); - } - - if (gameNumber > 1) - activeMenuChoices.Add(allMenuChoices[4]); - - activeMenuChoices.Add(allMenuChoices[5]); - - Console.Clear(); - Console.WriteLine($"Choose your prefered game, {playerName}:\n"); - - foreach (string menuElement in activeMenuChoices) - { - Console.WriteLine(menuElement); - } - - do - { - tastInput = Console.ReadKey(intercept: true); - if (((int)char.GetNumericValue(tastInput.KeyChar) > 0 && (int)char.GetNumericValue(tastInput.KeyChar) < activeMenuChoices.Count) || tastInput.Key == ConsoleKey.Escape) - { - validPlayerChoise = true; - } - } while (!validPlayerChoise); - - if (tastInput.Key == ConsoleKey.Escape) { - selectedGame = -1; - } else - { - selectedGame = (int)char.GetNumericValue(tastInput.KeyChar); - } - - return selectedGame; - } -} \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Program-old.cs b/mathGame.MichaelHelgesen/Program-old.cs deleted file mode 100644 index f0780b9c..00000000 --- a/mathGame.MichaelHelgesen/Program-old.cs +++ /dev/null @@ -1,77 +0,0 @@ -/* -List FinishedGamesArchive = new List(); -string playerName = "unknown"; -int numberOfRounds = 0; -bool displayGameMenu = false; -bool playerIsPlaying = false; -int chosenGame = 0; - -Console.WriteLine("-- Welcome to the Math Game! --"); -Console.Write("Please enter your name: "); - -while (chosenGame != -1) -{ - // Register name - if (numberOfRounds == 0) - { - playerName = Console.ReadLine(); - ++numberOfRounds; - Console.WriteLine(numberOfRounds); - displayGameMenu = true; - } - - // Generate menu - if (displayGameMenu) - { - chosenGame = PlayerMenu.GeneratePlayerMenu(numberOfRounds, playerName); - displayGameMenu = false; - playerIsPlaying = true; - if (chosenGame == -1) - { - Console.WriteLine("Bye"); - Environment.Exit(0); - } - } - - // Start game - if (playerIsPlaying && chosenGame != 5) - { - Console.Clear(); - FinishedGamesArchive.Add(PlayGame.StartGame(chosenGame, playerName, numberOfRounds)); - numberOfRounds++; - playerIsPlaying = false; - displayGameMenu = true; - } - - // View results - if (chosenGame == 5) - { - Console.Clear(); - foreach (var g in FinishedGamesArchive) - { - Console.WriteLine($"Game number {g.GameNumber}"); - Console.WriteLine($"Question\tCorrect answer\tPlayer answer\tResult"); - //int score; - foreach (var question in g.Questions) - { - Console.WriteLine($"{question.QuestionText}\t\t{question.CorrectAnswer}\t\t{question.PlayerAnswer}\t\t{question.IsCorrect}"); - - } - Console.WriteLine($"\nScore: {g.GameScore} \n"); - } - - Console.WriteLine("\nPress enter to return to menu"); - while (Console.ReadKey(true).Key != ConsoleKey.Enter) - { - // Ignorerer alle andre taster lydløst - } - displayGameMenu = true; - chosenGame = 0; - } - -} - -Console.WriteLine("Bye"); - - -*/ \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/math_game.csproj b/mathGame.MichaelHelgesen/math_game.csproj index 04af1154..2d744420 100644 --- a/mathGame.MichaelHelgesen/math_game.csproj +++ b/mathGame.MichaelHelgesen/math_game.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net8.0 enable enable From e8f87f8fba0bb0248143267be27feab7ef29c9ab Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Mon, 24 Aug 2026 22:59:13 +0200 Subject: [PATCH 25/26] fix: clean up code --- mathGame.MichaelHelgesen/Controllers/GameController.cs | 2 -- mathGame.MichaelHelgesen/Controllers/MenuController.cs | 1 - mathGame.MichaelHelgesen/Models/Game.cs | 3 --- mathGame.MichaelHelgesen/Models/MathProblem.cs | 1 - mathGame.MichaelHelgesen/Models/PlayerAnswer.cs | 1 - mathGame.MichaelHelgesen/Program.cs | 1 - 6 files changed, 9 deletions(-) diff --git a/mathGame.MichaelHelgesen/Controllers/GameController.cs b/mathGame.MichaelHelgesen/Controllers/GameController.cs index 9959aca9..95865583 100644 --- a/mathGame.MichaelHelgesen/Controllers/GameController.cs +++ b/mathGame.MichaelHelgesen/Controllers/GameController.cs @@ -18,7 +18,6 @@ internal static void RunGame(GameType gameType) Console.Clear(); var gameRound = Game.PlayRound(gameType); - archive.ArchiveGameRound(gameRound); Console.Clear(); @@ -29,7 +28,6 @@ internal static void RunGame(GameType gameType) new TextPrompt($"[grey]Press [bold]Enter[/] to return to main menu.[/]") .AllowEmpty() ); - MenuController.RenderMainMenu(); } } diff --git a/mathGame.MichaelHelgesen/Controllers/MenuController.cs b/mathGame.MichaelHelgesen/Controllers/MenuController.cs index bd932e7b..4cc5167c 100644 --- a/mathGame.MichaelHelgesen/Controllers/MenuController.cs +++ b/mathGame.MichaelHelgesen/Controllers/MenuController.cs @@ -27,7 +27,6 @@ internal static void RenderMainMenu() DisplayDifficultyMenu(); break; } - } private static void DisplayDifficultyMenu() diff --git a/mathGame.MichaelHelgesen/Models/Game.cs b/mathGame.MichaelHelgesen/Models/Game.cs index 571334ac..714b390e 100644 --- a/mathGame.MichaelHelgesen/Models/Game.cs +++ b/mathGame.MichaelHelgesen/Models/Game.cs @@ -61,11 +61,8 @@ static void PlayTurns(GameType gameType, List turns) AnsiConsole.MarkupLine($"[bold blue]Question {i + 1} of 5[/]"); int playerAnswer = AnsiConsole.Ask($"What is [green]{mathProblem.AsString}[/]?"); - PlayerAnswer answer = new PlayerAnswer(mathProblem.CorrectAnswer, playerAnswer); - GameTurn gameTurn = new GameTurn(mathProblem, answer); - turns.Add(gameTurn); } diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 1080ae61..4f3e10db 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -59,7 +59,6 @@ GameType GenerateRandomOperator() var values = Enum.GetValues() .Where(m => m != GameType.Random) .ToArray(); - return values[Random.Shared.Next(values.Length)]; } diff --git a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs index e725fd0e..43bd04c1 100644 --- a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs +++ b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs @@ -4,6 +4,5 @@ class PlayerAnswer(int correctMathAnswer, int playerAnswer) { internal int Answer { get; } = playerAnswer; internal int MathAnswer { get; } = correctMathAnswer; - internal bool IsCorrect => Answer == MathAnswer; } \ No newline at end of file diff --git a/mathGame.MichaelHelgesen/Program.cs b/mathGame.MichaelHelgesen/Program.cs index 3ff69ad2..decc99ac 100644 --- a/mathGame.MichaelHelgesen/Program.cs +++ b/mathGame.MichaelHelgesen/Program.cs @@ -1,3 +1,2 @@ using mathGame.MichaelHelgesen.Controllers; - MenuController.RenderMainMenu(); \ No newline at end of file From 8c7138e2511f0710dc988634ad8262c1992ebc20 Mon Sep 17 00:00:00 2001 From: Michael Helgesen Date: Sun, 30 Aug 2026 12:10:28 +0200 Subject: [PATCH 26/26] refactor: update access modifiers --- mathGame.MichaelHelgesen/Models/Archive.cs | 5 ++--- mathGame.MichaelHelgesen/Models/MathProblem.cs | 7 +++---- mathGame.MichaelHelgesen/Models/PlayerAnswer.cs | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/mathGame.MichaelHelgesen/Models/Archive.cs b/mathGame.MichaelHelgesen/Models/Archive.cs index 9d0ad42a..b3081d91 100644 --- a/mathGame.MichaelHelgesen/Models/Archive.cs +++ b/mathGame.MichaelHelgesen/Models/Archive.cs @@ -1,10 +1,10 @@ namespace mathGame.MichaelHelgesen.Models; - using Spectre.Console; class Archive { internal List ArchivedGames = new(); + internal void ArchiveGameRound(Game.GameData game) { ArchivedGames.Add(game); @@ -22,7 +22,7 @@ internal void DisplayArchive() DisplayArchive(ArchivedGames); } - internal void DisplayArchive(List games) + void DisplayArchive(List games) { foreach (var gameRound in games) { @@ -35,7 +35,6 @@ internal void DisplayArchive(List games) var turn = gameRound.GameTurns[i]; bool isCorrect = turn.PlayerAnswer.IsCorrect; - // Velg farge basert på om svaret var riktig eller feil string statusColor = isCorrect ? "green" : "red"; string statusIcon = isCorrect ? "[✓]" : "[✗]"; diff --git a/mathGame.MichaelHelgesen/Models/MathProblem.cs b/mathGame.MichaelHelgesen/Models/MathProblem.cs index 4f3e10db..68278c2d 100644 --- a/mathGame.MichaelHelgesen/Models/MathProblem.cs +++ b/mathGame.MichaelHelgesen/Models/MathProblem.cs @@ -4,9 +4,9 @@ namespace mathGame.MichaelHelgesen.Models; class MathProblem { - internal int FirstNumber { get; set; } - internal int SecondNumber { get; set; } - internal string Operator { get; } + int FirstNumber { get; set; } + int SecondNumber { get; set; } + string Operator { get; } internal int CorrectAnswer { get; set; } internal MathProblem(GameType gameType) @@ -19,7 +19,6 @@ internal MathProblem(GameType gameType) switch (gameType) { case GameType.Addition: - Operator = "+"; CorrectAnswer = FirstNumber + SecondNumber; break; diff --git a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs index 43bd04c1..b2c24c2c 100644 --- a/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs +++ b/mathGame.MichaelHelgesen/Models/PlayerAnswer.cs @@ -3,6 +3,6 @@ namespace mathGame.MichaelHelgesen.Models; class PlayerAnswer(int correctMathAnswer, int playerAnswer) { internal int Answer { get; } = playerAnswer; - internal int MathAnswer { get; } = correctMathAnswer; + int MathAnswer { get; } = correctMathAnswer; internal bool IsCorrect => Answer == MathAnswer; } \ No newline at end of file