mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-24 20:10:15 -08:00
58 lines
1.8 KiB
C#
58 lines
1.8 KiB
C#
namespace Queen;
|
|
|
|
internal class Game
|
|
{
|
|
private readonly IReadWrite _io;
|
|
private readonly IRandom _random;
|
|
private readonly Computer _computer;
|
|
|
|
public Game(IReadWrite io, IRandom random)
|
|
{
|
|
_io = io;
|
|
_random = random;
|
|
_computer = new Computer(random);
|
|
}
|
|
|
|
internal void PlaySeries()
|
|
{
|
|
_io.Write(Streams.Title);
|
|
if (_io.ReadYesNo(Prompts.Instructions)) { _io.Write(Streams.Instructions); }
|
|
|
|
while (true)
|
|
{
|
|
var result = PlayGame();
|
|
_io.Write(result switch
|
|
{
|
|
Result.HumanForfeits => Streams.Forfeit,
|
|
Result.HumanWins => Streams.Congratulations,
|
|
Result.ComputerWins => Streams.IWin,
|
|
_ => throw new InvalidOperationException($"Unexpected result {result}")
|
|
});
|
|
|
|
if (!_io.ReadYesNo(Prompts.Anyone)) { break; }
|
|
}
|
|
|
|
_io.Write(Streams.Thanks);
|
|
}
|
|
|
|
private Result PlayGame()
|
|
{
|
|
_io.Write(Streams.Board);
|
|
var humanPosition = _io.ReadPosition(Prompts.Start, p => p.IsStart, Streams.IllegalStart, repeatPrompt: true);
|
|
if (humanPosition.IsZero) { return Result.HumanForfeits; }
|
|
|
|
while (true)
|
|
{
|
|
var computerPosition = _computer.GetMove(humanPosition);
|
|
_io.Write(Strings.ComputerMove(computerPosition));
|
|
if (computerPosition.IsEnd) { return Result.ComputerWins; }
|
|
|
|
humanPosition = _io.ReadPosition(Prompts.Move, p => (p - computerPosition).IsValid, Streams.IllegalMove);
|
|
if (humanPosition.IsZero) { return Result.HumanForfeits; }
|
|
if (humanPosition.IsEnd) { return Result.HumanWins; }
|
|
}
|
|
}
|
|
|
|
private enum Result { ComputerWins, HumanWins, HumanForfeits };
|
|
}
|