using System; using Cairo; using Gdk; using Gtk; class Area : DrawingArea { // # 3а Надання значень властивостям області малювання public int i=0, // стан гри il=0, // кількість очок на рахунку програми ir=0, // кількість очок на рахунку гравця w=780, // ширина вікна програми та ігрового поля h=500, // висота ігрового поля a=10, // ширини прямокутника — зображення ракетки b=100, // висота прямокутника — зображення ракетки, r=10, // радіус круга — зображення м'яча, d_=8, // приріст ординати ракетки на одне оновлення екрану (3), dx, // приріст поточної величини абсциси круга за 1 такт оновлення екрану dy, // приріст поточної величини ординати круга за 1 такт оновлення екрану dx_=9, // модуль приросту абсциси круга за 1 такт оновлення екрану dy_=7, // верхня межа приросту ординати круга за 1 такт оновлення екрану x =390,// поточна абсциса центра зображення м'яча y =250,// поточна ордината центра зображення м'яча yl=200,// ордината верхнього краю прямокутника-ракетки ліворуч, керованого програмою yr=200;// ордината верхнього краю прямокутника-ракетки праворуч, керованого людиною public bool up = false, // потрібно рухати жовтий прямокутник догори down = false, // потрібно рухати жовтий прямокутник донизу timer = true; // # 3a Кінець protected override bool OnDrawn(Context cr) // малювання { cr.SetSourceRGB(0, 0.5, 0); // Темно-зелений колір cr.Paint(); // # 4 cr.SetSourceRGB(1,1,1); // Білий колір малювання cr.Arc(x, y, r, 0, 2 * Math.PI); // Круг-м'яч cr.Fill(); // // Лінії розмітки: cr.MoveTo(a, 0); cr.LineTo(a, h); // ліворуч cr.MoveTo(w-a,0); cr.LineTo(w-a, h); // праворуч cr.MoveTo(w/2,0); cr.LineTo(w/2, h); // посередині cr.Stroke(); // Виведення контуру cr.SelectFontFace("Ubuntu", FontSlant.Normal, FontWeight.Bold); cr.SetFontSize(32); TextExtents te = cr.TextExtents(Convert.ToString(il)); cr.MoveTo( w/4, 32); cr.ShowText(Convert.ToString(il)); // Виведення рахунку ПК cr.MoveTo(3*w/4, 32); cr.ShowText(Convert.ToString(ir)); // Виведення рахунку людини cr.SetSourceRGB(1, 0, 0); // Червоний колір малювання cr.Rectangle(0, yl, a, b); // Прямокутник-ракетка ліворуч cr.Fill(); // Заповнення контуру cr.SetSourceRGB(1, 1, 0); // Жовтий колір малювання cr.Rectangle(w-a,yr, a, b); // Прямокутник-ракетка праворуч cr.Fill(); // Заповнення контуру // # 4 Кінець return true; } } class OwnWindow : Gtk.Window // клас вікна застосунку { public Area da; public OwnWindow() : base("Гра «Пінг-Понг»") { // # 3b Зміна розміру вікна програми da = new Area(); Resize(da.w, da.h); GLib.Timeout.Add(50, new GLib.TimeoutHandler(OnTimer)); // Кожні 20 мс виклик методу OnTimer. // # 3b Кінець DeleteEvent += delegate { Application.Quit(); }; Add(da); } protected override bool OnDeleteEvent(Event e) { Application.Quit(); return true;} bool OnTimer() { if (!da.timer) return false; da.QueueDraw(); return true; } // # 5 Обробники подій натискання й вивільнення клавіш protected override bool OnKeyPressEvent(EventKey e) { switch (Convert.ToString(e.Key)) { case "Up": da.up =true; break; case "Down": da.down=true; break; }; return true; } protected override bool OnKeyReleaseEvent(EventKey e) { switch (Convert.ToString(e.Key)) { case "Up": da.up = false; break; case "Down": da.down = false; break; }; return true; } // # 5 Кінець } class Example { static void Main() { Application.Init(); OwnWindow w = new OwnWindow(); w.ShowAll(); Application.Run(); } }