mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 07:10:42 -08:00
Simplify Mastermind (C#) folder structure
This commit is contained in:
92
60_Mastermind/csharp/CodeFactory.cs
Normal file
92
60_Mastermind/csharp/CodeFactory.cs
Normal file
@@ -0,0 +1,92 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Game
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides methods for generating codes with a given number of positions
|
||||
/// and colors.
|
||||
/// </summary>
|
||||
public class CodeFactory
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the number of colors in codes generated by this factory.
|
||||
/// </summary>
|
||||
public int Colors { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the number of positions in codes generated by this factory.
|
||||
/// </summary>
|
||||
public int Positions { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the number of distinct codes that this factory can
|
||||
/// generate.
|
||||
/// </summary>
|
||||
public int Possibilities { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CodeFactory class.
|
||||
/// </summary>
|
||||
/// <param name="positions">
|
||||
/// The number of positions.
|
||||
/// </param>
|
||||
/// <param name="colors">
|
||||
/// The number of colors.
|
||||
/// </param>
|
||||
public CodeFactory(int positions, int colors)
|
||||
{
|
||||
if (positions < 1)
|
||||
throw new ArgumentException("A code must contain at least one position");
|
||||
|
||||
if (colors < 1)
|
||||
throw new ArgumentException("A code must contain at least one color");
|
||||
|
||||
if (colors > Game.Colors.List.Length)
|
||||
throw new ArgumentException($"A code can contain no more than {Game.Colors.List.Length} colors");
|
||||
|
||||
Positions = positions;
|
||||
Colors = colors;
|
||||
Possibilities = (int)Math.Pow(colors, positions);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a specified code.
|
||||
/// </summary>
|
||||
/// <param name="number">
|
||||
/// The number of the code to create from 0 to Possibilities - 1.
|
||||
/// </param>
|
||||
public Code Create(int number) =>
|
||||
EnumerateCodes().Skip(number).First();
|
||||
|
||||
/// <summary>
|
||||
/// Creates a random code using the provided random number generator.
|
||||
/// </summary>
|
||||
/// <param name="random">
|
||||
/// The random number generator.
|
||||
/// </param>
|
||||
public Code Create(Random random) =>
|
||||
Create(random.Next(Possibilities));
|
||||
|
||||
/// <summary>
|
||||
/// Generates a collection of codes containing every code that this
|
||||
/// factory can create exactly once.
|
||||
/// </summary>
|
||||
public IEnumerable<Code> EnumerateCodes()
|
||||
{
|
||||
var current = new int[Positions];
|
||||
var position = default(int);
|
||||
|
||||
do
|
||||
{
|
||||
yield return new Code(current);
|
||||
|
||||
position = 0;
|
||||
while (position < Positions && ++current[position] == Colors)
|
||||
current[position++] = 0;
|
||||
}
|
||||
while (position < Positions);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user