Guest User

Untitled

a guest
Dec 27th, 2015
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.76 KB | None | 0 0
  1. using System;
  2. using System.Timers;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5.  
  6.  
  7. namespace WindowsFormsApplication2
  8. {
  9.     public partial class Form1 : Form
  10.     {
  11.         static System.Timers.Timer myTimer;             //таймер, который решает судьбу клеток
  12.         const int L = 26, H = 26;                       //длина и высота одной клетки
  13.         float A = 0, B = 0;                             //количество клеток в экране приложения по горизонтали и вертикали
  14.         int[,] start = new int[22, 2] { {6, 6}, {6, 7}, {6, 8}, {6, 9}, {6, 10}, {6, 11}, {6, 12}, {6, 13},
  15.                                         {7, 6},         {7, 8}, {7, 9}, {7, 10}, {7, 11},          {7, 13},
  16.                                         {8, 6}, {8, 7}, {8, 8}, {8, 9}, {8, 10}, {8, 11}, {8, 12}, {8, 13} };  //живые клетки в начале игры
  17.         int[,,] present, future;                        //массивы хранят карту живых/мёртвых клеток
  18.         BufferedGraphicsContext myContext;              //двойная буферизация
  19.         BufferedGraphics myBuffer;
  20.  
  21.         private void TimerEventProcessor(Object myObject,                                //решаем судьбу жизни/смерти клеток
  22.                                             EventArgs myEventArgs)
  23.         {
  24.             myContext = new BufferedGraphicsContext();                                   //создаём контекст для двойной буферизации
  25.             myBuffer = myContext.Allocate(this.CreateGraphics(), this.DisplayRectangle);
  26.             Array.Copy(future, present, (int)(A) * (int)(B)*3);                          //меняем массивы местами. Будущее становится настоящим!
  27.             Draw_All(present);                                       //рисуем в буфере
  28.             myBuffer.Render();                                       //копируем изображение из буфера на экран
  29.             myBuffer.Dispose();
  30.             myContext.Dispose();
  31.  
  32.             //теперь мы расчитываем следующий шаг
  33.                for (int i = 0; i <= A - 1; i++)                                  //проверяем каждую клетку
  34.                 for (int j = 0; j <= B - 1; j++)                                 //внимание! массив начинается с нуля!
  35.                 {
  36.                     int neighbour = 0;                                           //вычисляем число соседей у данной клетки
  37.                                                                                  //и следим, чтобы не обращаться за пределы массива                                                                          
  38.                     if ((i > 0) && (j > 0) && (present[i - 1, j - 1, 0] == 1)) neighbour++;
  39.                     if ((j > 0) && (present[i, j - 1, 0] == 1)) neighbour++;
  40.                     if ((i < A - 1) && (j > 0) && (present[i + 1, j - 1, 0] == 1)) neighbour++;
  41.                     if ((i > 0) && present[i - 1, j, 0] == 1) neighbour++;
  42.                     if ((i < A - 1) && present[i + 1, j, 0] == 1) neighbour++;
  43.                     if ((i > 0) && (j < B - 1) && present[i - 1, j + 1, 0] == 1) neighbour++;
  44.                     if ((j < B - 1) && present[i, j + 1, 0] == 1) neighbour++;
  45.                     if ((i < A - 1) && (j < B - 1) && present[i + 1, j + 1, 0] == 1) neighbour++;
  46.  
  47.                     //if (neighbour != 0)  Text = neighbour.ToString();
  48.                                                                            //соседи известны -
  49.                     if (neighbour < 2) future[i, j, 0] = 0;                //применяем правила Игры Конвея
  50.                     else
  51.                     if (((neighbour == 2) || (neighbour == 3)) && present[i, j, 0] == 1) future[i, j, 0] = 1;
  52.                     else
  53.                     if (neighbour > 3) future[i, j, 0] = 0;
  54.                     else
  55.                     if (neighbour == 3) future[i, j, 0] = 1;
  56.                     //на этом месте массив future полностью заполнен и готов поменяться местами с present
  57.                 }
  58.         }
  59.         public Form1()
  60.         {
  61.             InitializeComponent();
  62.         }
  63.  
  64.         public void Draw_All(int[,,] array)                      //процедура рисует все клетки
  65.         {
  66.             //Graphics Graph = Graphics.FromHwnd(Handle);
  67.             for (int i = 0; i < A - 1; i++)                      //внимание! массив начинается с нуля!
  68.                 for (int j = 0; j < B - 1; j++)
  69.                 {
  70.                     Rectangle Rect = new Rectangle(0 + i * L, 0 + j * H, L + 6, H + 6);
  71.                     myBuffer.Graphics.FillRectangle(Brushes.LightGray, Rect);                        //рисуем серую сетку
  72.                     Rect = new Rectangle(0 + i * L + 3, 0 + j * L + 3, L, H);
  73.                     if (array[i, j, 0] == 0) myBuffer.Graphics.FillRectangle(Brushes.White, Rect);   //рисуем чёрную или белую клетку в сетке
  74.                     else myBuffer.Graphics.FillRectangle(Brushes.Black, Rect);
  75.                 }
  76.             //Graph.Dispose();
  77.         }
  78.  
  79.         public void All_Dead(int[,,] array)                          //процедура делает клетки мёртвыми
  80.         {
  81.             for (int i = 0; i < A - 1; i++)                          //внимание! массив начинается с нуля!
  82.                 for (int j = 0; j < B - 1; j++)
  83.                 {
  84.                     array[i, j, 0] = 0;                              //определяем, что клетка мертва
  85.                     array[i, j, 1] = 0 + i * L;                      //записываем координату X клетки
  86.                     array[i, j, 2] = 0 + j * H;                      //записываем координату Y клетки
  87.                 }
  88.         }
  89.  
  90.  
  91.         public void Alive(int x, int y)                               //делаем заданную клетку в массиве future живой
  92.         {
  93.             future[x, y, 0] = 1;                           //клетка ЖИВА!
  94.         }
  95.  
  96.         public void Dead(int x, int y)                                //делаем заданную клетку в массиве future мёртвой
  97.         {
  98.             future[x, y, 0] = 0;                           //клетка уже не жива
  99.         }
  100.  
  101.         private void Form1_Load(object sender, EventArgs e)             //процедура исполняется при создании приложения
  102.         {
  103.             myContext = new BufferedGraphicsContext();                  //двойная буферизация
  104.             myBuffer = myContext.Allocate(this.CreateGraphics(), this.DisplayRectangle);
  105.  
  106.             A = Width / (float)L;
  107.             B = Height / (float)H;
  108.             A = (float)Math.Ceiling(A);
  109.             B = (float)Math.Ceiling(B);
  110.             present = new int[(int)A, (int)B, 3];            //два массива одинаковой размерности
  111.             future = new int[(int)A, (int)B, 3];             //столбец; ряд; 0: живая/мёртвая, 1,2: координаты X, Y
  112.  
  113.             Text = A.ToString() + ' ' + B.ToString();        //пишет в заголовок количество клеток по горизонтали и вертикали
  114.  
  115.             All_Dead(future);                                //делаем все клетки мёртвыми
  116.             Draw_All(future);                                //рисуем все клетки
  117.             for (int i = 0; i <= 21; i++)                    //оживляем заданные клетки (начальное семя)
  118.             {
  119.                 Alive(start[i, 0], start[i, 1]);
  120.             }
  121.             myBuffer.Render();                              
  122.             myContext.Dispose();
  123.             myTimer = new System.Timers.Timer(1000);                            
  124.             myTimer.Interval = 1000;                                             //интервал таймера - секунда
  125.             myTimer.Elapsed += new ElapsedEventHandler(TimerEventProcessor);     //устанавливаем обработчик таймера                            
  126.             myTimer.Start();                            
  127.         }
  128.  
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment