using System; using Cairo; using Gdk; using Gtk; class Area : DrawingArea { // # 3 Властивості класу області малювання public int h = 38, // відстань від області малювання до верхньої частини екрану w = 30, // довжина сторони клітини ігрового поля w1 = 2, // ширина обмежувальної лінії nx = 0, // кількість стовпчиків - клітин по горизонталі ny = 10, // кількість рядків - клітин по вертикалі nxy, // кількість усіх клітин поля гри m = 10, // відсоток або кількість мін n, // кількість невідкритих клітин без мін j, // номер рядка k, // номер стовпчика j0, // номер стовпчика клітини з підірваною міною k0, // номер рядка клітини з підірваною міною l0, l; // лічильники для відкриття public int[] v = new int[1664];// допоміжний масив для: // 1) випадкового розташування мін // 2) черги відкриття клітин без мін public int[] u = new int [1664]; // допоміжний масив для черги відкриття клітин без мін public int[,] a = new int [32, 52]; // дані про кількість сусідніх клітин з мінами public bool[,] b = new bool[32, 52]; // дані про наявність мін public bool[,] d = new bool[32, 52]; // справджується для відкритих клітин Cairo.Color[] c = { new Cairo.Color(1,1,1,1), // білий колір new Cairo.Color(0,0,1,1), // синій колір new Cairo.Color(0,0.5,0,1), // зелений колір new Cairo.Color(0.855, 0.651, 0.125, 1), // золотарний колір new Cairo.Color(0.25 , 0 , 0.5, 1), // фіолетовий колір new Cairo.Color(1 , 0 , 0 , 1), // червоний колір new Cairo.Color(0.5 , 0.5 , 0 , 1), // оливковий колір new Cairo.Color(0.293, 0 , 0.508, 1), // колір індиго new Cairo.Color(0.545, 0.271, 0.075, 1), // сідельно коричневий колір saddle brown new Cairo.Color(0.5 , 0.5 , 0.5 , 1) // сірий колір для міни }; public bool p = false; // чи є потреба перемальовувати? // # 3 Кінець // # 4 Відображення поточного стану ігрового поля protected override bool OnDrawn(Context g) // малювання { if (p) { g.SelectFontFace("Ubuntu", FontSlant.Normal, FontWeight.Bold); // гарнітура й написання шрифту g.SetFontSize(28); // розмір шрифту g.Rectangle (0, 0, nx*w, ny*w); // зображення тла g.SetSourceColor(new Cairo.Color (0,0.5,0,1)); // зелений колір невідкритих клітин g.Fill(); // заповнення g.LineWidth = 3; // ширина межі g.SetSourceColor(new Cairo.Color (0.75,0.75,0.75,1)); // сірий колір межі for (k=0; k<=ny; k++) { g.MoveTo (0, k*w); g.LineTo (nx*w, k*w); } for (j=0; j<=nx; j++) { g.MoveTo (j*w, 0); g.LineTo (j*w,ny*w); } g.Stroke(); for (k=1; k<=ny; k++) for (j=1; j<=nx; j++) if (d[j,k]) { g.SetSourceColor(new Cairo.Color (1,1,1,1)); // білий колір тла відкритої клітини g.Rectangle((j-1)*w+2,(k-1)*w+2,w-3,w-3); g.Fill(); g.SetSourceColor(c[a[j,k]]); // колір цифри відкритої клітини g.MoveTo((j-1)*w+6, k*w-6); if (a[j,k]<9) g.ShowText(a[j,k].ToString()); else { if ((j==j0) && (k==k0)) g.SetSourceColor(new Cairo.Color (1,0,0,1)); else g.SetSourceColor(c[9]); g.ShowText("*"); } g.Stroke(); } } ((IDisposable) g.GetTarget()).Dispose(); ((IDisposable) g).Dispose(); return true; } // # 4 Кінець // # 5 Метод створення початкової позиції гри" public void btClicked() { int j, k, vv; // допоміжні лічильники і комірка для збереження значення try { p = (9 < nx) && (nx <51) && (5 < ny) && (ny <31) && (0 < m) && (m <100); if (p) { nxy = nx*ny; m = m *nxy/100; // кількість мін n = nxy - m; // кількість невідкритих клітин без мін for (j=0; j<= nx +1; j++) for (k=0; k<= ny +1; k++) { b[j,k]=false; // усі клітини без мін d[j,k]=false; // усі клітини закрито } Random r = new Random();// ініціалізація генератора випадкових чисел for (j=0; j<=nxy; j++) v[j]=j; for (j=0; j< m; j++) { k=r.Next(nxy-j+1); // випадкове число у діапазоні [0..nxy-j] vv = v[k]; // переміщення вибраного № клітини на місце nxy-j v[k] = v[nxy-j-1]; v[nxy-j-1]=vv; } for (j=0; j< m; j++) // заповнення мінами b[v[nxy-j-1]/ny +1, v[nxy-j-1]%ny +1]=true; for (j=1; j