From ed339ccd3f08577803de19e3390f87b8ed3abfb1 Mon Sep 17 00:00:00 2001 From: epvanhouten Date: Sat, 27 Feb 2021 20:59:55 -0600 Subject: [PATCH] Introduce a view class Move all the console interaction into a view class making the game logic isolated from UI. --- .../csharp/src/hurkle/ConsoleHurkleView.cs | 67 +++++++++++++++ 51 Hurkle/csharp/src/hurkle/GuessViewModel.cs | 7 ++ 51 Hurkle/csharp/src/hurkle/HurkleGame.cs | 84 ++----------------- 51 Hurkle/csharp/src/hurkle/IHurkleView.cs | 10 +++ 51 Hurkle/csharp/src/hurkle/Program.cs | 3 +- 5 files changed, 94 insertions(+), 77 deletions(-) create mode 100644 51 Hurkle/csharp/src/hurkle/ConsoleHurkleView.cs create mode 100644 51 Hurkle/csharp/src/hurkle/GuessViewModel.cs create mode 100644 51 Hurkle/csharp/src/hurkle/IHurkleView.cs diff --git a/51 Hurkle/csharp/src/hurkle/ConsoleHurkleView.cs b/51 Hurkle/csharp/src/hurkle/ConsoleHurkleView.cs new file mode 100644 index 00000000..40366ad2 --- /dev/null +++ b/51 Hurkle/csharp/src/hurkle/ConsoleHurkleView.cs @@ -0,0 +1,67 @@ +using System; + +namespace hurkle +{ + internal class ConsoleHurkleView : IHurkleView + { + public GamePoint GetGuess(GuessViewModel guessViewModel) + { + Console.WriteLine($"GUESS #{guessViewModel.CurrentGuessNumber}"); + var inputLine = Console.ReadLine(); + var seperateStrings = inputLine.Split(',', 2, StringSplitOptions.TrimEntries); + var guessPoint = new GamePoint{ + X = int.Parse(seperateStrings[0]), + Y = int.Parse(seperateStrings[1]) + }; + + return guessPoint; + } + + public void ShowDirection(FailedGuessViewModel failedGuessViewModel) + { + Console.Write("GO "); + switch(failedGuessViewModel.Direction) + { + case CardinalDirection.East: + Console.WriteLine("EAST"); + break; + case CardinalDirection.North: + Console.WriteLine("NORTH"); + break; + case CardinalDirection.South: + Console.WriteLine("SOUTH"); + break; + case CardinalDirection.West: + Console.WriteLine("WEST"); + break; + case CardinalDirection.NorthEast: + Console.WriteLine("NORTHEAST"); + break; + case CardinalDirection.NorthWest: + Console.WriteLine("NORTHWEST"); + break; + case CardinalDirection.SouthEast: + Console.WriteLine("SOUTHEAST"); + break; + case CardinalDirection.SouthWest: + Console.WriteLine("SOUTHWEST"); + break; + } + + Console.WriteLine(); + } + + public void ShowLoss(LossViewModel lossViewModel) + { + Console.WriteLine(); + Console.WriteLine($"SORRY, THAT'S {lossViewModel.MaxGuesses} GUESSES"); + Console.WriteLine($"THE HURKLE IS AT {lossViewModel.HurkleLocation.X},{lossViewModel.HurkleLocation.Y}"); + } + + public void ShowVictory(VictoryViewModel victoryViewModel) + { + Console.WriteLine(); + Console.WriteLine($"YOU FOUND HIM IN {victoryViewModel.CurrentGuessNumber} GUESSES!"); + } + } +} \ No newline at end of file diff --git a/51 Hurkle/csharp/src/hurkle/GuessViewModel.cs b/51 Hurkle/csharp/src/hurkle/GuessViewModel.cs new file mode 100644 index 00000000..b0c5227c --- /dev/null +++ b/51 Hurkle/csharp/src/hurkle/GuessViewModel.cs @@ -0,0 +1,7 @@ +namespace hurkle +{ + internal class GuessViewModel + { + public int CurrentGuessNumber {get;init;} + } +} \ No newline at end of file diff --git a/51 Hurkle/csharp/src/hurkle/HurkleGame.cs b/51 Hurkle/csharp/src/hurkle/HurkleGame.cs index 8b3b13f3..88620bbc 100644 --- a/51 Hurkle/csharp/src/hurkle/HurkleGame.cs +++ b/51 Hurkle/csharp/src/hurkle/HurkleGame.cs @@ -2,14 +2,16 @@ using System; namespace hurkle { - public partial class HurkleGame + internal class HurkleGame { private readonly Random _random = new Random(); + private readonly IHurkleView _view; private readonly int guesses; private readonly int gridSize; - public HurkleGame(int guesses, int gridSize) + public HurkleGame(int guesses, int gridSize, IHurkleView view) { + _view = view; this.guesses = guesses; this.gridSize = gridSize; } @@ -26,91 +28,21 @@ namespace hurkle for(var K=1;K<=guesses;K++) { - var guessPoint = GetGuess(new GuessViewModel{CurrentGuessNumber = K}); + var guessPoint = _view.GetGuess(new GuessViewModel{CurrentGuessNumber = K}); var direction = guessPoint.GetDirectionTo(hurklePoint); switch(direction) { case CardinalDirection.None: - ShowVictory(new VictoryViewModel{CurrentGuessNumber = K}); + _view.ShowVictory(new VictoryViewModel{CurrentGuessNumber = K}); return; default: - ShowDirection(new FailedGuessViewModel{Direction = direction}); + _view.ShowDirection(new FailedGuessViewModel{Direction = direction}); continue; } } - ShowLoss(new LossViewModel{MaxGuesses = guesses, HurkleLocation = hurklePoint } ); - } - - private void ShowLoss(LossViewModel lossViewModel) - { - Console.WriteLine(); - Console.WriteLine($"SORRY, THAT'S {lossViewModel.MaxGuesses} GUESSES"); - Console.WriteLine($"THE HURKLE IS AT {lossViewModel.HurkleLocation.X},{lossViewModel.HurkleLocation.Y}"); - } - - private void ShowDirection(FailedGuessViewModel failedGuessViewModel) - { - Console.Write("GO "); - switch(failedGuessViewModel.Direction) - { - case CardinalDirection.East: - Console.WriteLine("EAST"); - break; - case CardinalDirection.North: - Console.WriteLine("NORTH"); - break; - case CardinalDirection.South: - Console.WriteLine("SOUTH"); - break; - case CardinalDirection.West: - Console.WriteLine("WEST"); - break; - case CardinalDirection.NorthEast: - Console.WriteLine("NORTHEAST"); - break; - case CardinalDirection.NorthWest: - Console.WriteLine("NORTHWEST"); - break; - case CardinalDirection.SouthEast: - Console.WriteLine("SOUTHEAST"); - break; - case CardinalDirection.SouthWest: - Console.WriteLine("SOUTHWEST"); - break; - } - - Console.WriteLine(); - } - - private void ShowVictory(VictoryViewModel victoryViewModel) - { - Console.WriteLine(); - Console.WriteLine($"YOU FOUND HIM IN {victoryViewModel.CurrentGuessNumber} GUESSES!"); - } - - private class GuessViewModel - { - public int CurrentGuessNumber {get;init;} - } - - private static GamePoint GetGuess(GuessViewModel model) - { - Console.WriteLine($"GUESS #{model.CurrentGuessNumber}"); - var inputLine = Console.ReadLine(); - var seperateStrings = inputLine.Split(',', 2, StringSplitOptions.TrimEntries); - var guessPoint = new GamePoint{ - X = int.Parse(seperateStrings[0]), - Y = int.Parse(seperateStrings[1]) - }; - - return guessPoint; - } - - private static void PrintInfo(GamePoint guess, GamePoint target) - { - + _view.ShowLoss(new LossViewModel{MaxGuesses = guesses, HurkleLocation = hurklePoint } ); } } } \ No newline at end of file diff --git a/51 Hurkle/csharp/src/hurkle/IHurkleView.cs b/51 Hurkle/csharp/src/hurkle/IHurkleView.cs new file mode 100644 index 00000000..e5ce3a1a --- /dev/null +++ b/51 Hurkle/csharp/src/hurkle/IHurkleView.cs @@ -0,0 +1,10 @@ +namespace hurkle +{ + internal interface IHurkleView + { + GamePoint GetGuess(GuessViewModel guessViewModel); + void ShowVictory(VictoryViewModel victoryViewModel); + void ShowDirection(FailedGuessViewModel failedGuessViewModel); + void ShowLoss(LossViewModel lossViewModel); + } +} \ No newline at end of file diff --git a/51 Hurkle/csharp/src/hurkle/Program.cs b/51 Hurkle/csharp/src/hurkle/Program.cs index 4c4040b7..148308d1 100644 --- a/51 Hurkle/csharp/src/hurkle/Program.cs +++ b/51 Hurkle/csharp/src/hurkle/Program.cs @@ -40,7 +40,8 @@ namespace hurkle Console.WriteLine(@"DIRECTION TO GO TO LOOK FOR THE HURKLE."); Console.WriteLine(); - var hurkle = new HurkleGame(N,G); + var view = new ConsoleHurkleView(); + var hurkle = new HurkleGame(N,G, view); while(true) { hurkle.PlayGame();