Fix the initialization of the matrix, which was displacing the pattern in the initial position onto the matrix, which caused the evolution of the simulation to variate in relation with the original game in Basic when once the cells reached the boarder (invalid cases).

This commit is contained in:
Dyego Maas
2022-01-12 16:07:35 -03:00
parent 73665d8b09
commit f25adca07a

View File

@@ -4,11 +4,12 @@ const int maxWidth = 70;
const int maxHeight = 24; const int maxHeight = 24;
Console.WriteLine("ENTER YOUR PATTERN:"); Console.WriteLine("ENTER YOUR PATTERN:");
var pattern = ReadPattern(limitHeight: maxHeight).ToArray(); var pattern = new Pattern(ReadPattern(limitHeight: maxHeight).ToArray());
var (minX, minY) = FindTopLeftCorner(pattern); var minX = 10 - pattern.Height / 2; // was 11
var maxX = maxHeight; var minY = 32 - pattern.Width / 2; // was 33
var maxY = maxWidth; var maxX = maxHeight - 1;
var maxY = maxWidth - 1;
var matrix = new Matrix(height: maxHeight, width: maxWidth); var matrix = new Matrix(height: maxHeight, width: maxWidth);
var simulation = InitializeSimulation(pattern, matrix); var simulation = InitializeSimulation(pattern, matrix);
@@ -36,17 +37,6 @@ IEnumerable<string> ReadPattern(int limitHeight)
} }
} }
(int minX, int minY) FindTopLeftCorner(IEnumerable<string> patternLines)
{
var longestInput = patternLines
.Select((value, index) => (index, value))
.OrderByDescending(input => input.value.Length)
.First();
var centerX = (11 - longestInput.index / 2) - 1;
var centerY = (33 - longestInput.value.Length / 2) - 1;
return (centerX, centerY);
}
void PrintHeader() void PrintHeader()
{ {
void PrintCentered(string text) void PrintCentered(string text)
@@ -65,15 +55,16 @@ void PrintHeader()
Console.WriteLine(); Console.WriteLine();
} }
Simulation InitializeSimulation(IReadOnlyList<string> inputPattern, Matrix matrixToInitialize) { Simulation InitializeSimulation(Pattern pattern, Matrix matrixToInitialize) {
var newSimulation = new Simulation(); var newSimulation = new Simulation();
// translates the pattern to the middle of the simulation and counts initial population // transcribes the pattern to the middle of the simulation and counts initial population
for (var x = 0; x < inputPattern.Count; x++) for (var x = 0; x < pattern.Height; x++)
{ {
for (var y = 0; y < inputPattern[x].Length; y++) for (var y = 0; y < pattern.Width; y++)
{ {
if (inputPattern[x][y] == ' ') continue; if (pattern.Content[x][y] == ' ')
continue;
matrixToInitialize[minX + x, minY + y] = CellState.Stable; matrixToInitialize[minX + x, minY + y] = CellState.Stable;
newSimulation.IncreasePopulation(); newSimulation.IncreasePopulation();
@@ -247,6 +238,23 @@ void ProcessSimulation()
} }
} }
public class Pattern
{
public string[] Content { get; }
public int Height { get; }
public int Width { get; }
public Pattern(IReadOnlyCollection<string> patternLines)
{
Height = patternLines.Count;
Width = patternLines.Max(x => x.Length);
Content = patternLines
.Select(x => x.PadRight(Width, ' '))
.ToArray();
}
}
/// <summary> /// <summary>
/// Indicates the state of a given cell in the simulation. /// Indicates the state of a given cell in the simulation.
/// </summary> /// </summary>