mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-23 07:29:02 -08:00
Refactoring, plus adding real user input again.
This commit is contained in:
@@ -1,40 +1,16 @@
|
|||||||
// See https://aka.ms/new-console-template for more information
|
using System.Text;
|
||||||
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
const int MaxWidth = 70;
|
|
||||||
const int MaxHeight = 24;
|
|
||||||
|
|
||||||
|
|
||||||
|
const int maxWidth = 70;
|
||||||
|
const int maxHeight = 24;
|
||||||
|
|
||||||
Console.WriteLine("ENTER YOUR PATTERN:");
|
Console.WriteLine("ENTER YOUR PATTERN:");
|
||||||
// var pattern = ReadPattern(limitHeight: MaxHeight).ToArray();
|
var pattern = ReadPattern(limitHeight: maxHeight).ToArray();
|
||||||
var pattern = new[]
|
|
||||||
{
|
|
||||||
"*",
|
|
||||||
"*",
|
|
||||||
"*"
|
|
||||||
}; // FOR DEBUGGING PURPOSES
|
|
||||||
// var pattern = new[]
|
|
||||||
// {
|
|
||||||
// "**",
|
|
||||||
// "**",
|
|
||||||
// }; // FOR DEBUGGING PURPOSES
|
|
||||||
// var pattern = new[]
|
|
||||||
// {
|
|
||||||
// "***",
|
|
||||||
// "*",
|
|
||||||
// }; // FOR DEBUGGING PURPOSES
|
|
||||||
|
|
||||||
var isInvalid = false;
|
var (minX, minY) = FindTopLeftCorner(pattern);
|
||||||
|
var maxX = maxHeight;
|
||||||
|
var maxY = maxWidth;
|
||||||
|
|
||||||
var (index, value) = FindLongestInput(pattern);
|
var matrix = new Matrix(height: maxHeight, width: maxWidth);
|
||||||
var minX = (11 - index / 2) - 1; // middle x
|
|
||||||
var minY = (33 - value.Length / 2) - 1; // middle y
|
|
||||||
var maxX = MaxHeight;
|
|
||||||
var maxY = MaxWidth;
|
|
||||||
var matrix = new Matrix(height: MaxHeight, width: MaxWidth);
|
|
||||||
var simulation = InitializeSimulation(pattern, matrix);
|
var simulation = InitializeSimulation(pattern, matrix);
|
||||||
|
|
||||||
PrintHeader();
|
PrintHeader();
|
||||||
@@ -59,12 +35,15 @@ IEnumerable<string> ReadPattern(int limitHeight)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(int index, string value) FindLongestInput(IEnumerable<string> strings)
|
(int minX, int minY) FindTopLeftCorner(IEnumerable<string> patternLines)
|
||||||
{
|
{
|
||||||
return strings
|
var longestInput = patternLines
|
||||||
.Select((value, index) => (index, value))
|
.Select((value, index) => (index, value))
|
||||||
.OrderByDescending(input => input.value.Length)
|
.OrderByDescending(input => input.value.Length)
|
||||||
.First();
|
.First();
|
||||||
|
var centerX = (11 - longestInput.index / 2) - 1;
|
||||||
|
var centerY = (33 - longestInput.value.Length / 2) - 1;
|
||||||
|
return (centerX, centerY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintHeader()
|
void PrintHeader()
|
||||||
@@ -88,13 +67,14 @@ void PrintHeader()
|
|||||||
Simulation InitializeSimulation(IReadOnlyList<string> inputPattern, Matrix matrixToInitialize) {
|
Simulation InitializeSimulation(IReadOnlyList<string> inputPattern, Matrix matrixToInitialize) {
|
||||||
var newSimulation = new Simulation();
|
var newSimulation = new Simulation();
|
||||||
|
|
||||||
|
// copies 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 < inputPattern.Count; x++)
|
||||||
{
|
{
|
||||||
for (var y = 0; y < inputPattern[x].Length; y++)
|
for (var y = 0; y < inputPattern[x].Length; y++)
|
||||||
{
|
{
|
||||||
if (inputPattern[x][y] == ' ') continue;
|
if (inputPattern[x][y] == ' ') continue;
|
||||||
|
|
||||||
matrixToInitialize[minX + x, minY + y] = Cell.NeutralCell; // copy the pattern to the middle of the simulation
|
matrixToInitialize[minX + x, minY + y] = Cell.NeutralCell;
|
||||||
newSimulation.IncreasePopulation();
|
newSimulation.IncreasePopulation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,20 +84,19 @@ Simulation InitializeSimulation(IReadOnlyList<string> inputPattern, Matrix matri
|
|||||||
|
|
||||||
void ProcessGeneration()
|
void ProcessGeneration()
|
||||||
{
|
{
|
||||||
void PrintPopulation(int generation, int population)
|
var isInvalid = false;
|
||||||
{
|
|
||||||
Console.WriteLine($"GENERATION: {generation}\tPOPULATION: {population}");
|
|
||||||
if (isInvalid)
|
|
||||||
Console.WriteLine("INVALID!");
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
PrintPopulation(simulation.Generation, simulation.Population);
|
// Thread.Sleep(millisecondsTimeout: 1000);
|
||||||
|
Console.WriteLine($"GENERATION: {simulation.Generation}\tPOPULATION: {simulation.Population}");
|
||||||
|
if (isInvalid)
|
||||||
|
Console.WriteLine("INVALID!");
|
||||||
|
|
||||||
simulation.StartNewGeneration();
|
simulation.StartNewGeneration();
|
||||||
|
|
||||||
var nextMinX = MaxHeight - 1;
|
var nextMinX = maxHeight - 1;
|
||||||
var nextMinY = MaxWidth - 1;
|
var nextMinY = maxWidth - 1;
|
||||||
var nextMaxX = 0;
|
var nextMaxX = 0;
|
||||||
var nextMaxY = 0;
|
var nextMaxY = 0;
|
||||||
|
|
||||||
@@ -130,7 +109,7 @@ void ProcessGeneration()
|
|||||||
// refreshes the matrix and updates search area
|
// refreshes the matrix and updates search area
|
||||||
for (var x = minX; x < maxX; x++)
|
for (var x = minX; x < maxX; x++)
|
||||||
{
|
{
|
||||||
var printedLine = Enumerable.Repeat(' ', MaxWidth).ToList();
|
var printedLine = Enumerable.Repeat(' ', maxWidth).ToList();
|
||||||
for (var y = minY; y < maxY; y++)
|
for (var y = minY; y < maxY; y++)
|
||||||
{
|
{
|
||||||
if (matrix[x, y] == Cell.DyingCel)
|
if (matrix[x, y] == Cell.DyingCel)
|
||||||
@@ -159,7 +138,7 @@ void ProcessGeneration()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// prints empty lines after search area
|
// prints empty lines after search area
|
||||||
for (var x = maxX + 1; x < MaxHeight; x++)
|
for (var x = maxX + 1; x < maxHeight; x++)
|
||||||
{
|
{
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
}
|
}
|
||||||
@@ -172,7 +151,6 @@ void ProcessGeneration()
|
|||||||
minY = nextMinY;
|
minY = nextMinY;
|
||||||
maxY = nextMaxY;
|
maxY = nextMaxY;
|
||||||
|
|
||||||
// TODO boundaries? review
|
|
||||||
if (minX < 3)
|
if (minX < 3)
|
||||||
{
|
{
|
||||||
minX = 3;
|
minX = 3;
|
||||||
|
|||||||
Reference in New Issue
Block a user