Below is a (very naive) implementation of Conway Game of Life in WPF. This is just a demo ...
XAML:
<Window x:Class="wpf_conway_life_2013_05_19.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="500" Width="500"> <Grid> <Canvas Name="canvas" Width="auto" Height="auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> </Canvas> </Grid> </Window>
code behind:
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; using System.Windows.Threading; namespace wpf_conway_life_2013_05_19 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var random = new Random(); var data = new int[100, 100]; var dataB = new int[100, 100]; Func<int, int, int> at = (x, y) => { if (x < 0) x = 100 + x; if (x >= 100) x = x % 100; if (y < 0) y = 100 + y; if (y >= 100) y = y % 100; return data[x, y]; }; for (var x = 0; x < 100; x++) for (var y = 0; y < 100; y++) data[x, y] = random.Next(2); var rectangles = new Rectangle[100, 100]; for (var x = 0; x < 100; x++) for (var y = 0; y < 100; y++) { rectangles[x, y] = new Rectangle(); canvas.Children.Add(rectangles[x, y]); } canvas.SizeChanged += (s, e) => { for (var x = 0; x < 100; x++) { for (var y = 0; y < 100; y++) { rectangles[x, y].Width = canvas.ActualWidth / 100; rectangles[x, y].Height = canvas.ActualHeight / 100; Canvas.SetLeft(rectangles[x, y], (canvas.ActualWidth / 100) * x); Canvas.SetTop(rectangles[x, y], (canvas.ActualHeight / 100) * y); } } }; Action macroStep = () => { dataB = new int[100, 100]; for (var x = 0; x < 100; x++) { for (var y = 0; y < 100; y++) { var neighbors = 0; for (var i = -1; i <= 1; i++) for (var j = -1; j <= 1; j++) if (i == 0 && j == 0) continue; else neighbors += at(x + i, y + j); dataB[x, y] = data[x, y]; if (neighbors < 2) dataB[x, y] = 0; if (neighbors == 3) dataB[x, y] = 1; if (neighbors > 3) dataB[x, y] = 0; rectangles[x, y].Fill = dataB[x, y] == 0 ? new SolidColorBrush(new Color()) : Brushes.Black; } } data = dataB; }; var timer = new DispatcherTimer(); timer.Tick += (s, e) => macroStep(); timer.Start(); } } }
Here's what it looks like:

If you replace new SolidColorBrush(new Color()) with Brushes.White , the program will work much slower. Why?
I am testing the 64-bit version of Windows 7 using Express Express 2010.
c # wpf conways-game-of-life
dharmatech
source share