Merge pull request #314 from drewjcooper/csharp-62-mugwump

Add C# implementation of 62 Mugwump
This commit is contained in:
Jeff Atwood
2021-10-04 14:11:55 -07:00
committed by GitHub
10 changed files with 280 additions and 0 deletions

View File

@@ -0,0 +1,34 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mugwump", "Mugwump\Mugwump.csproj", "{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Debug|x64.ActiveCfg = Debug|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Debug|x64.Build.0 = Debug|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Debug|x86.ActiveCfg = Debug|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Debug|x86.Build.0 = Debug|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Release|Any CPU.Build.0 = Release|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Release|x64.ActiveCfg = Release|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Release|x64.Build.0 = Release|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Release|x86.ActiveCfg = Release|Any CPU
{83F42802-4E7C-49B5-A022-DB9B6A65F2C6}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,36 @@
using System;
using System.Linq;
namespace Mugwump
{
internal class Game
{
private readonly Grid _grid;
private Game(Random random)
{
_grid = new Grid(Enumerable.Range(1, 4).Select(id => new Mugwump(id, random.Next(10), random.Next(10))));
}
public static void Play(Random random) => new Game(random).Play();
private void Play()
{
for (int turn = 1; turn <= 10; turn++)
{
var guess = Input.ReadGuess($"Turn no. {turn} -- what is your guess");
if (_grid.Check(guess))
{
Console.WriteLine();
Console.WriteLine($"You got them all in {turn} turns!");
return;
}
}
Console.WriteLine();
Console.WriteLine("Sorry, that's 10 tries. Here is where they're hiding:");
_grid.Reveal();
}
}
}

View File

@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Mugwump
{
internal class Grid
{
private readonly List<Mugwump> _mugwumps;
public Grid(IEnumerable<Mugwump> mugwumps)
{
_mugwumps = mugwumps.ToList();
}
public bool Check(Position guess)
{
foreach (var mugwump in _mugwumps.ToList())
{
var (found, distance) = mugwump.FindFrom(guess);
Console.WriteLine(found ? $"You have found {mugwump}" : $"You are {distance} units from {mugwump}");
if (found)
{
_mugwumps.Remove(mugwump);
}
}
return _mugwumps.Count == 0;
}
public void Reveal()
{
foreach (var mugwump in _mugwumps.ToList())
{
Console.WriteLine(mugwump.Reveal());
}
}
}
}

View File

@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
namespace Mugwump
{
// Provides input methods which emulate the BASIC interpreter's keyboard input routines
internal static class Input
{
internal static Position ReadGuess(string prompt)
{
Console.WriteLine();
Console.WriteLine();
var input = ReadNumbers(prompt, 2);
return new Position(input[0], input[1]);
}
private static void Prompt(string text = "") => Console.Write($"{text}? ");
private static List<float> ReadNumbers(string prompt, int requiredCount)
{
var numbers = new List<float>();
while (!TryReadNumbers(prompt, requiredCount, numbers))
{
prompt = "";
}
return numbers;
}
private static bool TryReadNumbers(string prompt, int requiredCount, List<float> numbers)
{
Prompt(prompt);
var inputValues = ReadStrings();
foreach (var value in inputValues)
{
if (numbers.Count == requiredCount)
{
Console.WriteLine("!Extra input ingored");
return true;
}
if (!TryParseNumber(value, out var number))
{
return false;
}
numbers.Add(number);
}
return numbers.Count == requiredCount || TryReadNumbers("?", requiredCount, numbers);
}
private static string[] ReadStrings() => Console.ReadLine().Split(',', StringSplitOptions.TrimEntries);
private static bool TryParseNumber(string text, out float number)
{
if (float.TryParse(text, out number)) { return true; }
Console.WriteLine("!Number expected - retry input line");
number = default;
return false;
}
}
}

View File

@@ -0,0 +1,20 @@
namespace Mugwump
{
internal class Mugwump
{
private readonly int _id;
private readonly Position _position;
public Mugwump(int id, int x, int y)
{
_id = id;
_position = new Position(x, y);
}
public (bool, Distance) FindFrom(Position guess) => (guess == _position, guess - _position);
public string Reveal() => $"{this} is at {_position}";
public override string ToString() => $"Mugwump {_id}";
}
}

View File

@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Strings\Intro.txt" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,16 @@
using System;
namespace Mugwump
{
internal class Distance
{
private readonly float _value;
public Distance(float deltaX, float deltaY)
{
_value = (float)Math.Sqrt(deltaX * deltaX + deltaY * deltaY);
}
public override string ToString() => $"{_value:0.0}";
}
}

View File

@@ -0,0 +1,9 @@
namespace Mugwump
{
internal record Position(float X, float Y)
{
public override string ToString() => $"( {X} , {Y} )";
public static Distance operator -(Position p1, Position p2) => new(p1.X - p2.X, p1.Y - p2.Y);
}
}

View File

@@ -0,0 +1,33 @@
using System;
using System.Reflection;
namespace Mugwump
{
class Program
{
static void Main(string[] args)
{
DisplayIntro();
var random = new Random();
while (true)
{
Game.Play(random);
Console.WriteLine();
Console.WriteLine("That was fun! Let's play again.......");
Console.WriteLine("Four more mugwumps are now in hiding.");
}
}
private static void DisplayIntro()
{
using var stream = Assembly.GetExecutingAssembly()
.GetManifestResourceStream("Mugwump.Strings.Intro.txt");
using var stdout = Console.OpenStandardOutput();
stream.CopyTo(stdout);
}
}
}

View File

@@ -0,0 +1,15 @@
Mugwump
Creative Computing Morristown, New Jersey
The object of this game is to find four mugwumps
hidden on a 10 by 10 grid. Homebase is position 0,0.
Any guess you make must be two numbers with each
number between 0 and 9, inclusive. First number
is distance to right of homebase and second number
is distance above homebase.
You get 10 tries. After each try, I will tell
you how far you are from each wugwump.