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 namespace hurkle
{ {
public partial class HurkleGame internal class HurkleGame
{ {
private readonly Random _random = new Random(); private readonly Random _random = new Random();
private readonly IHurkleView _view;
private readonly int guesses; private readonly int guesses;
private readonly int gridSize; private readonly int gridSize;
public HurkleGame(int guesses, int gridSize) public HurkleGame(int guesses, int gridSize, IHurkleView view)
{ {
_view = view;
this.guesses = guesses; this.guesses = guesses;
this.gridSize = gridSize; this.gridSize = gridSize;
} }
@@ -26,91 +28,21 @@ namespace hurkle
for(var K=1;K<=guesses;K++) 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); var direction = guessPoint.GetDirectionTo(hurklePoint);
switch(direction) switch(direction)
{ {
case CardinalDirection.None: case CardinalDirection.None:
ShowVictory(new VictoryViewModel{CurrentGuessNumber = K}); _view.ShowVictory(new VictoryViewModel{CurrentGuessNumber = K});
return; return;
default: default:
ShowDirection(new FailedGuessViewModel{Direction = direction}); _view.ShowDirection(new FailedGuessViewModel{Direction = direction});
continue; continue;
} }
} }
ShowLoss(new LossViewModel{MaxGuesses = guesses, HurkleLocation = hurklePoint } ); _view.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 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(@"DIRECTION TO GO TO LOOK FOR THE HURKLE.");
Console.WriteLine(); Console.WriteLine();
var hurkle = new HurkleGame(N,G); var view = new ConsoleHurkleView();
var hurkle = new HurkleGame(N,G, view);
while(true) while(true)
{ {
hurkle.PlayGame(); hurkle.PlayGame();