Conway's Game of Life in C# using Lists

Run Settings
LanguageC#
Language Version
Run Command
using System; using System.Collections.Generic; using System.Timers; //NOTE: Need to account for all directions in expanding list, not just diagonally! class MainClass {//Conway's Game of Life enum cell {dead, alive, tempD, tempA,}; static int gen = 0; static bool iterate = false; static void Life(List<List<int>> life) { int y = 1; bool addTop = true; bool addBot = true; for(int i = 1; i < life.Count-1; i ++)//If any live cell is nearing the edge, the list will gain an index in both dimensions to remain square { for(int a = 1; a < life[0].Count-1; a ++) { if(addTop) { if (i == 1 || a == 1) { if(life[i][a] == (int)cell.alive) { addTop = false; life.Insert(0,new List<int>()); for(int w = 0; w < life[1].Count; w ++) life[0].Add(0); for(int w = 0; w < life.Count; w ++) life[w].Insert(0,0); } } } if(addBot) { if (i == life.Count-2 || a == life[0].Count-2) { if(life[i][a] == (int)cell.alive) { addBot = false; life.Add(new List<int>()); for(int w = 0; w < life[1].Count; w ++) life[life.Count-1].Add(0); for(int w = 0; w < life.Count; w ++) life[w].Add(0); } } } int count = -1; for(int w = -1; w <= 1; w ++) { for(int z = -1; z <= 1; z ++)//Based on Conway's rules, the cells take up temporary states so as not to mess with the ongoing process { if(life[(i+w)][(a+z)] == (int)cell.alive || life[(i+w)][(a+z)] == (int)cell.tempD) ++count; } } if((count < 2) || (count > 3))//Cells are switched to either dead or alive based on temp states { if(life[i][a] != (int)cell.dead) life[i][a] = (int)cell.tempD; } else if(count == 2) { if(life[i][a] != (int)cell.alive) life[i][a] = (int)cell.tempA; } else if(count == 3) { if(life[i][a] != (int)cell.alive) life[i][a] = (int)cell.dead; } } } for(int i = 0; i < life.Count-1; i ++)//The cells are converted into the proper format { for(int a = 0; a < life[0].Count-1; a ++) { int x = life[i][a]; if(x == (int)cell.tempD) x = (int)cell.dead; if(x == (int)cell.tempA) x = (int)cell.alive; life[i][a] = x; } } Console.WriteLine("\n-----------GENERATION {0}------------------",gen); Console.Write("\t"); foreach(List<int> x in life) { foreach(int i in x) { Console.Write(i+" "); if(y++ % life[0].Count == 0 && life.IndexOf(x) != life.Count-1) Console.Write("\n\t"); } } } static void Main() { Console.Write("Number of Generations: ");//How many iterations of the list will be made int limit = Convert.ToInt32(Console.ReadLine()); Timer t = new Timer(2500);//Seperates iterations by 2.5 seconds so that it is easier to see them int[,] b = {{0,0,0,0,0,0,0,0,0,0},//The array is easier to visually manipulate values within the script itself {0,0,0,0,0,0,0,0,0,0},//The initial pattern is made here {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,1,0,0,0,0}, {0,0,0,0,0,0,1,0,0,0}, {0,0,0,0,1,1,1,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}}; List<List<int>> life = new List<List<int>>();//The array is converted into a list to be used hereafter for(int i = 0; i < b.GetLength(0); i ++) { life.Add(new List<int>()); } int y = 1; foreach(int i in b) { life[(y-1)].Add(i); if(y++ % b.GetLength(0) == 0) { y = 1; } } y=1; Console.WriteLine("\n-----------GENERATION {0}------------------",gen); Console.Write("\t"); foreach(List<int> i in life) { foreach(int c in i) { Console.Write(c+" "); if(y++ % life[0].Count == 0 && life.IndexOf(i) != life.Count-1) Console.Write("\n\t"); } } t.Elapsed += new ElapsedEventHandler(timer_Tick); t.Start(); while(gen < limit+1)//stops the timer method when the number of desired generations is reached { if(iterate == true) { Life(life); iterate = false; } if(gen == limit) t.Stop(); } } static void timer_Tick(object sender, EventArgs e) { iterate = true; ++gen; } } /* Oh, I'm a goofy goober, yeah! You're a goofy goober, yeah! We're all goofy goobers, yeah! Goofy, goofy, goober, goober, YEAH! */
Editor Settings
Theme
Key bindings
Full width
Lines