mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-23 15:37:51 -08:00
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:
67
51 Hurkle/csharp/src/hurkle/ConsoleHurkleView.cs
Normal file
67
51 Hurkle/csharp/src/hurkle/ConsoleHurkleView.cs
Normal 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!");
|
||||
}
|
||||
}
|
||||
}
|
||||
7
51 Hurkle/csharp/src/hurkle/GuessViewModel.cs
Normal file
7
51 Hurkle/csharp/src/hurkle/GuessViewModel.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace hurkle
|
||||
{
|
||||
internal class GuessViewModel
|
||||
{
|
||||
public int CurrentGuessNumber {get;init;}
|
||||
}
|
||||
}
|
||||
@@ -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 } );
|
||||
}
|
||||
}
|
||||
}
|
||||
10
51 Hurkle/csharp/src/hurkle/IHurkleView.cs
Normal file
10
51 Hurkle/csharp/src/hurkle/IHurkleView.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user