using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Data.Common;
using System.Text.RegularExpressions;
public partial class MainWindow : Window
Border[] BorderFields = new Border[0];
BrushConverter bc = new BrushConverter();
static int HowManyColumns = 128;
static int HowManyRows = 128;
ColumnDefinition[] Columns = new ColumnDefinition[HowManyColumns];
RowDefinition[] Rows = new RowDefinition[HowManyRows];
Stack<Tuple<int, int>> KillCells = new Stack<Tuple<int, int>>();
Stack<Tuple<int, int>> CreateCells = new Stack<Tuple<int, int>>();
Dictionary<Tuple<int, int>, int> PositionToField = new Dictionary<Tuple<int, int>, int>();
bool KillingProcessListFinished = false;
bool PopulationProcessListFinished = false;
bool isShiftKeyPressed = false;
Border[] borders = new Border[0];
for (int i = 0; i < HowManyColumns; i++)
Columns[i] = new ColumnDefinition();
Columns[i].Width = new GridLength(35.0, GridUnitType.Pixel);
Playground.ColumnDefinitions.Add(Columns[i]);
for (int i = 0; i < HowManyRows; i++)
Rows[i] = new RowDefinition();
Rows[i].Height = new GridLength(35.0, GridUnitType.Pixel);
Playground.RowDefinitions.Add(Rows[i]);
rows = Playground.RowDefinitions.Count;
columns = Playground.ColumnDefinitions.Count;
Array.Resize(ref borders, rows*columns);
for (int i = 0; i < rows * columns; i++)
borders[i] = new Border();
borders[i].Visibility = Visibility.Visible;
borders[i].BorderThickness = new Thickness(1, 1, 1, 1);
borders[i].BorderBrush = (Brush)bc.ConvertFrom("#FAF300");
Grid.SetColumn(borders[i], col);
Grid.SetRow(borders[i], ro);
Playground.Children.Add(borders[i]);
if (currentF % 10 == 0 || currentF==0)
Array.Resize(ref BorderFields, BorderFields.Length + 10);
void CreateNewBorderField(int SetColumnPosition, int SetRowPosition)
if (!PositionToField.ContainsKey(new Tuple<int, int>(SetColumnPosition, SetRowPosition)) && SetColumnPosition >= 0 && SetRowPosition >= 0)
int NumberOfCurrentField = GetField();
BorderFields[NumberOfCurrentField] = new Border();
BorderFields[NumberOfCurrentField].Background = (Brush)bc.ConvertFrom("#3FF026");
BorderFields[NumberOfCurrentField].Visibility = Visibility.Visible;
Grid.SetColumn(BorderFields[NumberOfCurrentField], SetColumnPosition);
Grid.SetRow(BorderFields[NumberOfCurrentField], SetRowPosition);
Playground.Children.Add(BorderFields[NumberOfCurrentField]);
Tuple<int, int> DictTuple = new Tuple<int, int>(SetColumnPosition, SetRowPosition);
PositionToField.Add(DictTuple, NumberOfCurrentField);
void DeleteBorderFields(int ColumnPosition, int RowPosition)
if (PositionToField.ContainsKey(new Tuple<int, int>(ColumnPosition, RowPosition)))
Tuple<int, int> DelTuple = new Tuple<int, int>(ColumnPosition, RowPosition);
int NumberOfCurrentField = PositionToField[DelTuple];
Playground.Children.Remove(BorderFields[NumberOfCurrentField]);
BorderFields[NumberOfCurrentField] = null;
PositionToField.Remove(DelTuple);
Tuple<int, int> CheckTuple = new Tuple<int, int>(-1, -1);
Tuple<int, int> currentTuple = new Tuple<int, int>(-1, -1);
foreach (KeyValuePair<Tuple<int, int>, int> Field in PositionToField)
CheckTuple = new Tuple<int, int>(Field.Key.Item1 - 1, Field.Key.Item2);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(Field.Key.Item1 + 1, Field.Key.Item2);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(Field.Key.Item1, Field.Key.Item2 - 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(Field.Key.Item1, Field.Key.Item2 + 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(Field.Key.Item1 - 1, Field.Key.Item2 - 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(Field.Key.Item1 - 1, Field.Key.Item2 + 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(Field.Key.Item1 + 1, Field.Key.Item2 + 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(Field.Key.Item1 + 1, Field.Key.Item2 - 1);
if (PositionToField.ContainsKey(CheckTuple))
if (count > 3 || count < 2)
currentTuple = new Tuple<int, int>(Field.Key.Item1, Field.Key.Item2);
KillCells.Push(currentTuple);
KillingProcessListFinished = true;
Tuple<int, int> currentPopTuple = new Tuple<int, int>(-1,-1);
Tuple<int, int> CheckTuple = new Tuple<int, int>(- 1, -1);
Tuple<int, int> creatTuple = new Tuple<int, int>(-1, -1);
foreach (Border CheckBorder in borders)
currentColumn = Grid.GetColumn(CheckBorder);
currentRow = Grid.GetRow(CheckBorder);
currentPopTuple = new Tuple<int, int>(currentColumn, currentRow);
if (PositionToField.ContainsKey(currentPopTuple))
CheckTuple = new Tuple<int, int>(currentColumn - 1, currentRow);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(currentColumn + 1, currentRow);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(currentColumn, currentRow - 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(currentColumn, currentRow + 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(currentColumn - 1, currentRow - 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(currentColumn - 1, currentRow + 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(currentColumn + 1, currentRow + 1);
if (PositionToField.ContainsKey(CheckTuple))
CheckTuple = new Tuple<int, int>(currentColumn + 1, currentRow - 1);
if (PositionToField.ContainsKey(CheckTuple))
if (CountPopulation == 3)
creatTuple = new Tuple<int, int>(currentColumn, currentRow);
CreateCells.Push(creatTuple);
PopulationProcessListFinished = true;
if (PopulationProcessListFinished && KillingProcessListFinished)
PopulationProcessListFinished = false;
KillingProcessListFinished = false;
int AmountOfCells = KillCells.Count;
for (int i = 0; i < AmountOfCells; i++)
Tuple<int, int> KillTuple = KillCells.Pop();
DeleteBorderFields(KillTuple.Item1, KillTuple.Item2);
AmountOfCells = CreateCells.Count;
for (int i = 0; i < AmountOfCells; i++)
Tuple<int, int> CreationTuple = CreateCells.Pop();
CreateNewBorderField(CreationTuple.Item1, CreationTuple.Item2);
if (!PositionToField.ContainsKey(new Tuple<int, int>(ClickedColumn, ClickedRow)))
CreateNewBorderField(ClickedColumn, ClickedRow);
PopulationProcessListFinished = false;
KillingProcessListFinished = false;
DeleteBorderFields(ClickedColumn, ClickedRow);
PopulationProcessListFinished = false;
KillingProcessListFinished = false;
await Task.Delay(TimeSpan.FromMilliseconds(0.5));
Random rand = new Random();
for (int i = 0; i < (rows*columns)/3; i++)
int currentColumn = rand.Next(0, columns);
int currentRow = rand.Next(0, rows);
CreateNewBorderField(currentColumn, currentRow);
await Task.Delay(TimeSpan.FromMilliseconds(0.5));
public void maingrid_MouseDown(object sender, MouseButtonEventArgs e)
if (e.LeftButton == MouseButtonState.Pressed)
else if (e.RightButton == MouseButtonState.Pressed)
var point = Mouse.GetPosition(Playground);
double accumulatedHeight = 0.0;
double accumulatedWidth = 0.0;
foreach (var rowDefinition in Playground.RowDefinitions)
accumulatedHeight += rowDefinition.ActualHeight;
if (accumulatedHeight >= point.Y)
foreach (var columnDefinition in Playground.ColumnDefinitions)
accumulatedWidth += columnDefinition.ActualWidth;
if (accumulatedWidth >= point.X)
public void maingrid_KeyDown(object sender, KeyEventArgs e)
if (!(WindowState == WindowState.Maximized))
WindowState = WindowState.Maximized;
Visibility = Visibility.Collapsed;
WindowStyle = WindowStyle.None;
Visibility = Visibility.Visible;
else if (e.Key == Key.Space)
else if (e.Key == Key.Delete)
MainWindow mainWindow = new MainWindow();
mainWindow.WindowState = oldstate;
else if (e.Key == Key.F1)
else if (e.Key == Key.F2)
Scroller.ScrollToHorizontalOffset(Scroller.ScrollableWidth / 2);
Scroller.ScrollToVerticalOffset(Scroller.ScrollableHeight / 2);
else if (e.Key == Key.Escape)
else if (e.Key == Key.Back)
this.WindowState = WindowState.Minimized;
void Scroller_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
Scroller.ScrollToHorizontalOffset(Scroller.HorizontalOffset - 30);
Scroller.ScrollToHorizontalOffset(Scroller.HorizontalOffset + 30);
else if (!isShiftKeyPressed && !(Keyboard.Modifiers == ModifierKeys.Control))
Scroller.ScrollToVerticalOffset(Scroller.VerticalOffset - 30);
Scroller.ScrollToVerticalOffset(Scroller.VerticalOffset + 30);
else if (Keyboard.Modifiers == ModifierKeys.Control)
double zoomDelta = e.Delta > 0 ? 0.01 : -0.01;
double newZoom = Scroller.LayoutTransform.Value.M11 + zoomDelta;
if (newZoom < 0.1 || newZoom > 10.0)
Matrix matrix = Scroller.LayoutTransform.Value;
matrix.ScaleAtPrepend(newZoom / matrix.M11, newZoom / matrix.M11, e.GetPosition(Playground).X, e.GetPosition(Playground).Y);
Scroller.LayoutTransform = new MatrixTransform(matrix);
private void Scroller_KeyDown(object sender, KeyEventArgs e)
if (e.Key == Key.LeftShift)
isShiftKeyPressed = true;
private void Scroller_KeyUp(object sender, KeyEventArgs e)
if (e.Key == Key.LeftShift)
isShiftKeyPressed = false;
string fileName = "cgol.rle";
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string filePath = Path.Combine(desktopPath, fileName);
if (!File.Exists(filePath))
MessageBox.Show("Datei nicht gefunden!");
string fileContents = File.ReadAllText(filePath);
Match match = Regex.Match(fileContents, @"x\s*=\s*(\d+),\s*y\s*=\s*(\d+)");
int width = int.Parse(match.Groups[1].Value);
int height = int.Parse(match.Groups[2].Value);
bool[,] grid = new bool[width, height];
string[] lines = fileContents.Split('\n');
foreach (string line in lines)
if (line.StartsWith("#"))
else if (line.StartsWith("x"))
count = Convert.ToInt32(Convert.ToString(c));
count = Convert.ToInt32(Convert.ToString(count) + line[posInLine]);
for (int l = count; l > 0; l--)
else if (x < width && y < height)
for (int l = count; l > 0; l--)
else if (x < width && y < height)
for (int l = count; l > 0; l--)
int orientCol = (columns / 2) - (height / 2);
int orientRow = (rows / 2) - (width / 2);
if (orientCol+height>=columns)
if (orientRow+width>=rows)
for (int j = 0; j < height; j++)
for (int k = 0; k < width; k++)
CreateNewBorderField(k + orientRow, j + orientCol);