# 1. Cтворення й відображення вікна програми require 'ruby2d' w=800 # ширина вікна програми h=450 # висота вікна програми dh=20 # висота смуги з з елементами керування r0=4 # радіус зображення ядра r1=4 # радіус зображення цілі sf="/usr/share/fonts/truetype/ubuntu/Ubuntu-R.ttf" # адреса використаного шрифту set title:"Гра «Постріл гармати»", # параметри вікна ігрового поля background:"#96C8FF", width: w, height: h # 2. Cтворення й відображення написів, "полів введення" й "кнопки" з написом "Fire!" te = [] # список текстів у "полях введення" (спочатку порожній) r = Rectangle.new(x: 0, y: 0, width: w, height: dh, z: 0, color: "#DDDDDD") tc = Text.new("Target coordinates", x:5, y:1, z:1, size: 16, font: sf, color:"black") bx = Rectangle.new(x: 150, y: 0, width: 35, height: dh, z: 1, color: "#999999") fx = Rectangle.new(x: 151, y: 1, width: 33, height: dh-2, z: 1, color: "#FFFFFF") te[0] = Text.new("|",x: 151, y: 1, z:1, size: 16, font: sf, color:"black") by = Rectangle.new(x: 195, y: 0, width: 35, height: dh, z: 1, color: "#999999") fy = Rectangle.new(x: 196, y: 1, width: 33, height: dh-2, z: 1, color: "#FFFFFF") te[1] = Text.new("",x: 196, y: 1, z:1, size: 16, font: sf, color:"black") ta = Text.new("Angle", x:300, y:1, z:1, size: 16, font: sf, color:"black") ba = Rectangle.new(x: 350, y: 0, width: 35, height: dh, z: 1, color: "#999999") fa = Rectangle.new(x: 351, y: 1, width: 33, height: dh-2, z: 1, color: "#FFFFFF") te[2] = Text.new("",x: 351, y: 1, z:1, size: 16, font: sf, color:"black") tv = Text.new("Velosity", x:430, y:1, z:1, size: 16, font: sf, color:"black") bv = Rectangle.new(x: 495, y: 0, width: 40, height: dh, z: 1, color: "#999999") fv = Rectangle.new(x: 496, y: 1, width: 38, height: dh-2, z: 1, color: "#FFFFFF") te[3] = Text.new("",x: 496, y: 1, z:1, size: 16, font: sf, color:"black") bb = Rectangle.new(x: 655, y: 0, width: 45, height: dh, z: 1, color: "#999999") b1 = Rectangle.new(x: 656, y: 1, width: 43, height: dh-2, z: 1, color: "#FFFFFF") b2 = Rectangle.new(x: 658, y: 3, width: 39, height: dh-6, z: 1, color: "#F0F0F0") tv = Text.new("Fire!", x:660, y:1, z:1, size: 16, font: sf, color:"black") # 3. Початкові значення і зображення ядра, цілі й вибуху за межами ігрового поля f = 0 # номер області клацання лівою кнопкою миші: # 0 - «поле введення» абсциси цілі # 1 - «поле введення» ординати цілі # 2 - «поле введення» кута нахилу ствола гармати # 3 - «поле введення» початкової швидкості # 4 - "кнопка" з написом "Fire!" # 5 - поза межами елементів керування i = 0 # стан гри: # 0 - введення значень параметрів і підготовка до відображення руху # 1 - відображення руху # 2 - пауза перед новим введенням параметрів c = ['0','1',"2","3","4","5","6","7","8","9","."] # список цифр і десяткової крапки g =9.8 # прискорення земного тяжіння a = 0 # кут нахилу гармати v0 = 0 # абсолютна величина (модуль) початкової швидкості v0x = 0 # складова початкової швидкості по горизонталі v0y = 0 # складова початкової швидкості по вертикалі x0 = 0 # початкова абсциса центра ядра y0 = h # початкова ордината центра ядра x1 = 0 # абсциса центра цілі y1 = 0 # ордината центра цілі x = 0 # поточна абсциса центра ядра y = h # поточна ордината центра ядра t = 0 # поточний час моделі dt =0.01666666666666666667 # приріст часу у секундах при оновленні 60 разів на секунду tend=100 # верхня межа часу демонстрації руху в секундах # 4. Зображення ядра, цілі, вибуху й оголошення про некоректність значень параметрів за межами ігрового поля i0 = Image.new("ball.png", x: w, y: h, z:0, width: 2*r0, height: 2*r0, color:"black") i1 = Image.new("ball.png", x: w, y: h, z:0, width: 2*r1, height: 2*r1, color:"red") boom = Image.new("boom.png", x: w, y: h, z:0, width: 155, height: 140, color:"white") ba = Rectangle.new(x: w, y: h/2, width: w, height: 32, z: 0, color: "white") ta = Text.new("Input valid values: x in (1, 800), y in (0, 430), a in (0, 90), v in (0, 900).", x:w, y:h/2, z:1, size: 26, font: sf, color:"red") # 5. Обробник події натискання лівої кнопки миші ігровому полі on :mouse_down do |e| f0=f k = e.x j = e.y if (j