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
|
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)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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(@"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();
|
||||||
|
|||||||
Reference in New Issue
Block a user