# 8. Обробник події натискання кнопки b.get_object("button1").signal_connect("clicked"){ # 9. Зчитати параметри гри: nx = b.get_object("entry1").text.to_i ny = b.get_object("entry2").text.to_i m = b.get_object("entry3").text.to_i # 10. При неприйнятних значеннях параметрів… if (!((5'error', 'message'=>'Хибні значення параметрів!', 'title' =>'Гра «Сапер»', 'type' =>'ok' }) else # 11. Підрахувати кількість мін m=nx*ny*m/100 # 12. Випадковим чином заповнити частину клітин мінами v = Array.new(nx*ny+2) {|j| 0} # допоміжний масив для # 1) випадкового розташування мін # 2) черги відкриття клітин без мін (абсциси) u = Array.new(nx*ny+2) {|j| 0} # допоміжний масив для # черги відкриття клітин без мін (ординати) a = Array.new(ny+2){|j| Array.new(nx+2) {|k| 0}} # дані про кількість клітин-сусідів з мінами b = Array.new(ny+2){|j| Array.new(nx+2) {|k| false}} # дані про наявність мін у клітинах d = Array.new(ny+2){|j| Array.new(nx+2) {|k| true}} # дані про невідкриті клітини nxy=nx*ny # кількість клітин ігрового поля n = nxy-m # кількість невідкритих клітин без мін v = Array.new(nxy){|j| j} # дані про невідкриті клітини for j in (0...m) k=rand(0..nxy-j-1) # випадкове ціле число у діапазоні [0..nxy-j) v[k], v[nxy-j-1] = v[nxy-j-1], v[k] # обмін значень v[k] і v[nxy-j-1] end for j in (0...m) # заповнення клітинок мінами b[v[nxy-j-1]/nx+1][v[nxy-j-1]%nx+1]=true end # 13. Підрахувати кількість мін у сусідніх клітинах for j in (1..ny) for k in (1..nx) if (b[j][k]) then a[j][k]=9 else a[j][k]=0 if (b[j][k+1]) then a[j][k]+=1 end if (b[j][k-1]) then a[j][k]+=1 end if (b[j+1][k]) then a[j][k]+=1 end if (b[j-1][k]) then a[j][k]+=1 end if (b[j-1][k+1]) then a[j][k]+=1 end if (b[j-1][k-1]) then a[j][k]+=1 end if (b[j+1][k+1]) then a[j][k]+=1 end if (b[j+1][k-1]) then a[j][k]+=1 end end end end for j in (1..ny) print(a[j],"\n") end # 14. Cтворити вікно з полотном для зображення ігрового поля w=30 # довжина сторони клітинки поля set title:"Гра «Сапер»", # параметри вікна ігрового поля background:'#008000', width: nx*w, height: ny*w # 15. Зобразити межі клітин товщиною 3 пікселі сірого кольору '#D0D0D0'. for j in (1..nx) Line.new(x1: j*w, y1:0, x2: j*w, y2: ny*w, width:3, z:0, color:'gray') end for j in (1..ny) Line.new(y1: j*w, x1:0, y2: j*w, x2: nx*w, width:3, z:0, color:'gray') end # 16. Створити обробник події натискання лівої кнопки миші ігровому полі on :mouse_down do |e| k = e.x/w+1 j = e.y/w+1 Tk.messageBox ({ 'icon' =>'info', 'message'=>'Клацнули по клітині у рядку '+j.to_s+' і стовпчику '+k.to_s, 'title' =>'Гра «Сапер»', 'type' =>'ok' }) end show # показ вікна з ігровим полем end }