Introduce a view class

Move all the console interaction into a view class making the game logic
isolated from UI.
This commit is contained in:
epvanhouten
2021-02-27 20:59:55 -06:00
parent 4f4ae0b981
commit ed339ccd3f
5 changed files with 94 additions and 77 deletions

View File

@@ -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!");
}
}
}

View File

@@ -0,0 +1,7 @@
namespace hurkle
{
internal class GuessViewModel
{
public int CurrentGuessNumber {get;init;}
}
}

View File

@@ -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 } );
}
}
}

View File

@@ -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);
}
}

View File

@@ -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();