Посібник з розробки динамічної логічної гри на Visual Basic 6.0
Роботу підготував Валерій Шмельов
Москва
Даний посібник містить докладне опис процесу розробки повного аналога JAVA-гри на Visual Basic 6.0 (частина 1). У наступних частинах документа:
- Частина 2 - доведення ігрової програми
- Частина 3 - розробка версії гри на VB для «наладонних» комп'ютерів
- Частина 4 - розробка версії гри на Delphi
- Частина 5 - розробка версії гри на JAVA для стільникових телефонів
OFLAMERON
Частина 1
Створимо проект формату Project EXE. Створимо форму Form1 розміром 2715х5745. На формі розташуємо елемент Frame, а в ньому розмістимо елементи Label1 - Label55. Де Label1 - Label6 це колонка Level. А Label7 - Label46 - комірки ігрового поля з номіналами. Label 47-48 - комірки для службової інформації. Нижній кольоровий індикатор утворений Label49-Label55.
Колонці елементів Level і ігровому полю будуть відповідати числові масиви.
Масив Dim level (5)
Масив Dim field (8, 6)
Короткий опис гри. Гра починається з установки гравцем маркера в будь-яку клітинку нижнього ряду осередків (просто Click-нуть мишкою). Така клітинка позначається синім кольором,
а номінал зайнятої комірки додається (або віднімається) до рахунку гравця. Нижній кольоровий лінійний індикатор починає зменшуватися. Поки індикатор не зник, гравець може переміщати ігровий маркер по нижньому рядку вправо або вліво від поточного положення натискаючи на клавіатурі стрілки «Праворуч» або «Ліворуч». Номінали всіх осередків, які буде «проходити» маркер, будуть додаватися (або відніматися) до рахунку. Як тільки весь кольоровий лінійний індикатор зникне, гравець не може переміщати свій маркер (на мить), а номінали всіх осередків зсуваються зверху-вниз на один рядок. Верхній рядок ігрового поля заповнюється новими значеннями від генератора випадкових чисел. При цьому, номінал осередку, зрушивши зверху на клітинку, в якій вже знаходиться маркер, так само додається до рахунку - це може суттєво змінити ваш рахунок. Після цього кольоровий лінійний індикатор відновлюється і починає знову коротшати, а гравець знову може переміщати ігровий маркер.
Рахунок гри ведеться у помаранчевій комірці
Гра ведеться до тих пір, поки рахунок гравця не стане рівним нулю або маркер не потрапить на клітинку з номіналом | End |.
Гра зовсім не так проста, як може здатися. Зовсім легко розмістити свій маркер так, що на нього зміститься осередок з номіналом | Z | - обнуління рахунку, або | End | - закінчення гри.
Тут описується процес програмування «текстовій версії» логічної табличній гри «Oflameron». Номінали осередків представлені на екрані в символьному вигляді, а осередки представляють собою елементи Label. У наступній частині документа буде подано повний опис процесу розробки графічної версії гри і версії гри для кишенькових компьютерів (PDA).
Програмування
Заповнимо осередки ігрового (масив field (8, 6)) поля значеннями від генератора випадкових чисел. Обчислимо кількість секунд у поточному часу і стільки разів «прокрутити» цикл із зверненням до генератора випадкових чисел:
TM = Time 'Отримати час в змінну
TTMS = Len (TM) 'Визначити довжину рядка з значенням часу
TTM = Mid $ (TM, 7, 2) 'Виділити з рядка кількість секунд
For i = 0 To TTM 'Цикл з числом повторень, що дорівнює кількості секунд
Form1.Caption = Int ((20 * Rnd) + 1) 'Значення запишемо в заголовок форми, щоб
'Подивитися, що працює
Next i
Заповнимо масив field (8, 5). Повністю процедура буде:
Private Sub Set_Nominal ()
TM = Time 'Отримати час в змінну
TTMS = Len (TM) 'Визначити довжину рядка з значенням часу
TTM = Mid $ (TM, 7, 2) 'Виділити з рядка кількість секунд
For i = 0 To TTM
Form1.Caption = Int ((20 * Rnd) + 1)
Next i
'------------------------------------------------- -
'Заповнимо масив field (8, 5)
For i = 0 To 7
For j = 0 To 4
field (i, j) = Int ((20 * Rnd) + 1)
Next j
Next i
End Sub
Тепер можна записати тестову процедуру Private Sub Fdraw () для того, щоб подивитися, як заповнюється масив field (8, 6)
Процедура буде виглядати наступним чином:
Private Sub Fdraw ()
Label7.Caption = field (0, 0)
Label8.Caption = field (1, 0)
Label9.Caption = field (2, 0)
Label10.Caption = field (3, 0)
Label11.Caption = field (4, 0)
Label12.Caption = field (5, 0)
Label13.Caption = field (6, 0)
Label14.Caption = field (7, 0)
Label15.Caption = field (0, 1)
Label16.Caption = field (1, 1)
Label17.Caption = field (2, 1)
Label18.Caption = field (3, 1)
Label19.Caption = field (4, 1)
Label20.Caption = field (5, 1)
Label21.Caption = field (6, 1)
Label22.Caption = field (7, 1)
Label23.Caption = field (0, 2)
Label24.Caption = field (1, 2)
Label25.Caption = field (2, 2)
Label26.Caption = field (3, 2)
Label27.Caption = field (4, 2)
Label28.Caption = field (5, 2)
Label29.Caption = field (6, 2)
Label30.Caption = field (7, 2)
Label31.Caption = field (0, 3)
Label32.Caption = field (1, 3)
Label33.Caption = field (2, 3)
Label34.Caption = field (3, 3)
Label35.Caption = field (4, 3)
Label36.Caption = field (5, 3)
Label37.Caption = field (6, 3)
Label38.Caption = field (7, 3)
Label39.Caption = field (0, 4)
Label40.Caption = field (1, 4)
Label41.Caption = field (2, 4)
Label42.Caption = field (3, 4)
Label43.Caption = field (4, 4)
Label44.Caption = field (5, 4)
Label45.Caption = field (6, 4)
Label46.Caption = field (7, 4)
End Sub
Тобто тут просто кожна клітинка записується в Caption кожного осередку. Такий метод не варто вважати оптимальним і в подальшому можна використовувати інші прийоми програмування. Щоб подивитися резльтати, потрібно вставити виклик двох процедур Private Sub Set_Nominal () і Private Sub Fdraw () в автозапуск при старті програми (на час):
Private Sub Form_Load ()
Set_Nominal
Fdraw
End Sub
Повний проект на Visual Basic цього етапу розробки гри - у файлі vbg1.zip
Тепер потрібно створити процедуру, в якій буде аналізуватися вміст комірок масиву field (8, 6) і в залежності від їх значень буде формуватися потрібне символьне значення (номінал) осередки ігрового поля і задаватися потрібний колір символу і фону комірки.
Перепишемо процедуру Fdraw () в іншу процедуру. Створимо ще одну Label56 для тимчасового зберігання «згенерованого» номіналу осередку та його колірних атрибутів (виділена на малюнку).
Private Sub Color_Chars ()
If field (i, j) = 0 Then Label56.Caption = "+1"
If field (i, j) = 0 Then Label56.BackColor = & HBBECF4
If field (i, j) = 0 Then Label56.ForeColor = & H80000008
If field (i, j) = 1 Then Label56.Caption = "-1"
If field (i, j) = 1 Then Label56.BackColor = & HBBECF4
If field (i, j) = 1 Then Label56.ForeColor = & H80000008
If field (i, j) = 2 Then Label56.Caption = "+5"
If field (i, j) = 2 Then Label56.BackColor = & HBBECF4
If field (i, j) = 2 Then Label56.ForeColor = & H80000008
If field (i, j) = 3 Then Label56.Caption = "-5"
If field (i, j) = 3 Then Label56.BackColor = & HBBECF4
If field (i, j) = 3 Then Label56.ForeColor = & H80000008
If field (i, j) = 4 Then Label56.Caption = "+10"
If field (i, j) = 4 Then Label56.BackColor = & HBBECF4
If field (i, j) = 4 Then Label56.ForeColor = & H80000008
If field (i, j) = 5 Then Label56.Caption = "-10"
If field (i, j) = 5 Then Label56.BackColor = & HBBECF4
If field (i, j) = 5 Then Label56.ForeColor = & H80000008
If field (i, j) = 6 Then Label56.Caption = "+15"
If field (i, j) = 6 Then Label56.BackColor = & HBBECF4
If field (i, j) = 6 Then Label56.ForeColor = & H80000008
If field (i, j) = 7 Then Label56.Caption = "-15"
If field (i, j) = 7 Then Label56.BackColor = & HBBECF4
If field (i, j) = 7 Then Label56.ForeColor = & H80000008
If field (i, j) = 8 Then Label56.Caption = "+25"
If field (i, j) = 8 Then Label56.BackColor = & HBBECF4
If field (i, j) = 8 Then Label56.ForeColor = & H80000008
If field (i, j) = 9 Then Label56.Caption = "T"
If field (i, j) = 9 Then Label56.BackColor = & HABCFBB
If field (i, j) = 9 Then Label56.ForeColor = & H80000008
If field (i, j) = 10 Then Label56.Caption = "P"
If field (i, j) = 10 Then Label56.BackColor = & HFFC0C0
If field (i, j) = 10 Then Label56.ForeColor = & H80000008
If field (i, j) = 11 Then Label56.Caption = "B"
If field (i, j) = 11 Then Label56.BackColor = & H80FFFF
If field (i, j) = 11 Then Label56.ForeColor = & H80000008
If field (i, j) = 12 Then Label56.Caption = "Z"
If field (i, j) = 12 Then Label56.BackColor = & H40 &
If field (i, j) = 12 Then Label56.ForeColor = & HFFFFFF
If field (i, j) = 13 Then Label56.Caption = "Z"
If field (i, j) = 13 Then Label56.BackColor = & H40 &
If field (i, j) = 13 Then Label56.ForeColor = & HFFFFFF
If field (i, j) = 14 Then Label56.Caption = "End"
If field (i, j) = 14 Then Label56.BackColor = & HFF &
If field (i, j) = 14 Then Label56.ForeColor = & HFFFFFF
If field (i, j) = 15 Then Label56.Caption = "-10"
If field (i, j) = 15 Then Label56.BackColor = & HBBECF4
If field (i, j) = 15 Then Label56.ForeColor = & H80000008
If field (i, j) = 16 Then Label56.Caption = "-5"
If field (i, j) = 16 Then Label56.BackColor = & HBBECF4
If field (i, j) = 16 Then Label56.ForeColor = & H80000008
If field (i, j) = 17 Then Label56.Caption = "-1"
If field (i, j) = 17 Then Label56.BackColor = & HBBECF4
If field (i, j) = 17 Then Label56.ForeColor = & H80000008
If field (i, j) = 18 Then Label56.Caption = "+1"
If field (i, j) = 18 Then Label56.BackColor = & HBBECF4
If field (i, j) = 18 Then Label56.ForeColor = & H80000008
If field (i, j) = 19 Then Label56.Caption = "+5"
If field (i, j) = 19 Then Label56.BackColor = & HBBECF4
If field (i, j) = 19 Then Label56.ForeColor = & H80000008
End Sub
Тепер додамо копіювання значення і атрибутів клітинки Label56 в клітинку ігрового поля і використовуємо кілька циклів для обробки всього масиву field (8, 6):
- Приклад копіювання
Label7.Caption = Label56.Caption
Label7.BackColor = Label56.BackColor
Label7.ForeColor = Label56.ForeColor
У результаті з'явиться процедура Sub Field_Fill () копіювання номіналів з «черговій» осередки Label56, а процедура Color_Chars () зміниться наступним чином:
Private Sub Color_Chars ()
If field (i, j) = 0 Then Label56.Caption = "+1"
If field (i, j) = 0 Then Label56.BackColor = & HBBECF4
If field (i, j) = 0 Then Label56.ForeColor = & H80000008
If field (i, j) = 1 Then Label56.Caption = "-1"
If field (i, j) = 1 Then Label56.BackColor = & HBBECF4
If field (i, j) = 1 Then Label56.ForeColor = & H80000008
If field (i, j) = 2 Then Label56.Caption = "+5"
If field (i, j) = 2 Then Label56.BackColor = & HBBECF4
If field (i, j) = 2 Then Label56.ForeColor = & H80000008
If field (i, j) = 3 Then Label56.Caption = "-5"
If field (i, j) = 3 Then Label56.BackColor = & HBBECF4
If field (i, j) = 3 Then Label56.ForeColor = & H80000008
If field (i, j) = 4 Then Label56.Caption = "+10"
If field (i, j) = 4 Then Label56.BackColor = & HBBECF4
If field (i, j) = 4 Then Label56.ForeColor = & H80000008
If field (i, j) = 5 Then Label56.Caption = "-10"
If field (i, j) = 5 Then Label56.BackColor = & HBBECF4
If field (i, j) = 5 Then Label56.ForeColor = & H80000008
If field (i, j) = 6 Then Label56.Caption = "+15"
If field (i, j) = 6 Then Label56.BackColor = & HBBECF4
If field (i, j) = 6 Then Label56.ForeColor = & H80000008
If field (i, j) = 7 Then Label56.Caption = "-15"
If field (i, j) = 7 Then Label56.BackColor = & HBBECF4
If field (i, j) = 7 Then Label56.ForeColor = & H80000008
If field (i, j) = 8 Then Label56.Caption = "+25"
If field (i, j) = 8 Then Label56.BackColor = & HBBECF4
If field (i, j) = 8 Then Label56.ForeColor = & H80000008
If field (i, j) = 9 Then Label56.Caption = "T"
If field (i, j) = 9 Then Label56.BackColor = & HABCFBB
If field (i, j) = 9 Then Label56.ForeColor = & H80000008
If field (i, j) = 10 Then Label56.Caption = "P"
If field (i, j) = 10 Then Label56.BackColor = & HFFC0C0
If field (i, j) = 10 Then Label56.ForeColor = & H80000008
If field (i, j) = 11 Then Label56.Caption = "B"
If field (i, j) = 11 Then Label56.BackColor = & H80FFFF
If field (i, j) = 11 Then Label56.ForeColor = & H80000008
If field (i, j) = 12 Then Label56.Caption = "Z"
If field (i, j) = 12 Then Label56.BackColor = & H40 &
If field (i, j) = 12 Then Label56.ForeColor = & HFFFFFF
If field (i, j) = 13 Then Label56.Caption = "Z"
If field (i, j) = 13 Then Label56.BackColor = & H40 &
If field (i, j) = 13 Then Label56.ForeColor = & HFFFFFF
If field (i, j) = 14 Then Label56.Caption = "End"
If field (i, j) = 14 Then Label56.BackColor = & HFF &
If field (i, j) = 14 Then Label56.ForeColor = & HFFFFFF
If field (i, j) = 15 Then Label56.Caption = "-10"
If field (i, j) = 15 Then Label56.BackColor = & HBBECF4
If field (i, j) = 15 Then Label56.ForeColor = & H80000008
If field (i, j) = 16 Then Label56.Caption = "-5"
If field (i, j) = 16 Then Label56.BackColor = & HBBECF4
If field (i, j) = 16 Then Label56.ForeColor = & H80000008
If field (i, j) = 17 Then Label56.Caption = "-1"
If field (i, j) = 17 Then Label56.BackColor = & HBBECF4
If field (i, j) = 17 Then Label56.ForeColor = & H80000008
If field (i, j) = 18 Then Label56.Caption = "+1"
If field (i, j) = 18 Then Label56.BackColor = & HBBECF4
If field (i, j) = 18 Then Label56.ForeColor = & H80000008
If field (i, j) = 19 Then Label56.Caption = "+5"
If field (i, j) = 19 Then Label56.BackColor = & HBBECF4
If field (i, j) = 19 Then Label56.ForeColor = & H80000008
'Label7.Caption = Label56.Caption
'Label7.BackColor = Label56.BackColor
'Label7.ForeColor = Label56.ForeColor
'Form1.Caption = field (0, 0)
End Sub
Private Sub Field_Fill ()
'Копіювання номіналів і атрибутів з «черговій» осередки Label56
k = 0 'Лічильник осередків
For j = 0 To 4
For i = 0 To 7
Color_Chars 'Помістити наступне значення з масиву field (i, j) у Label56
'І обчислити кольорові атрибути символу і фону за її номіналу
If k = 0 Then Label7.Caption = Label56.Caption
If k = 0 Then Label7.BackColor = Label56.BackColor
If k = 0 Then Label7.ForeColor = Label56.ForeColor
If k = 1 Then Label8.Caption = Label56.Caption
If k = 1 Then Label8.BackColor = Label56.BackColor
If k = 1 Then Label8.ForeColor = Label56.ForeColor
If k = 2 Then Label9.Caption = Label56.Caption
If k = 2 Then Label9.BackColor = Label56.BackColor
If k = 2 Then Label9.ForeColor = Label56.ForeColor
If k = 3 Then Label10.Caption = Label56.Caption
If k = 3 Then Label10.BackColor = Label56.BackColor
If k = 3 Then Label10.ForeColor = Label56.ForeColor
If k = 4 Then Label11.Caption = Label56.Caption
If k = 4 Then Label11.BackColor = Label56.BackColor
If k = 4 Then Label11.ForeColor = Label56.ForeColor
If k = 5 Then Label12.Caption = Label56.Caption
If k = 5 Then Label12.BackColor = Label56.BackColor
If k = 5 Then Label12.ForeColor = Label56.ForeColor
If k = 6 Then Label13.Caption = Label56.Caption
If k = 6 Then Label13.BackColor = Label56.BackColor
If k = 6 Then Label13.ForeColor = Label56.ForeColor
If k = 7 Then Label14.Caption = Label56.Caption
If k = 7 Then Label14.BackColor = Label56.BackColor
If k = 7 Then Label14.ForeColor = Label56.ForeColor
If k = 8 Then Label15.Caption = Label56.Caption
If k = 8 Then Label15.BackColor = Label56.BackColor
If k = 8 Then Label15.ForeColor = Label56.ForeColor
If k = 9 Then Label16.Caption = Label56.Caption
If k = 9 Then Label16.BackColor = Label56.BackColor
If k = 9 Then Label16.ForeColor = Label56.ForeColor
If k = 10 Then Label17.Caption = Label56.Caption
If k = 10 Then Label17.BackColor = Label56.BackColor
If k = 10 Then Label17.ForeColor = Label56.ForeColor
If k = 11 Then Label18.Caption = Label56.Caption
If k = 11 Then Label18.BackColor = Label56.BackColor
If k = 11 Then Label18.ForeColor = Label56.ForeColor
If k = 12 Then Label19.Caption = Label56.Caption
If k = 12 Then Label19.BackColor = Label56.BackColor
If k = 12 Then Label19.ForeColor = Label56.ForeColor
If k = 13 Then Label20.Caption = Label56.Caption
If k = 13 Then Label20.BackColor = Label56.BackColor
If k = 13 Then Label20.ForeColor = Label56.ForeColor
If k = 14 Then Label21.Caption = Label56.Caption
If k = 14 Then Label21.BackColor = Label56.BackColor
If k = 14 Then Label21.ForeColor = Label56.ForeColor
If k = 15 Then Label22.Caption = Label56.Caption
If k = 15 Then Label22.BackColor = Label56.BackColor
If k = 15 Then Label22.ForeColor = Label56.ForeColor
If k = 16 Then Label23.Caption = Label56.Caption
If k = 16 Then Label23.BackColor = Label56.BackColor
If k = 16 Then Label23.ForeColor = Label56.ForeColor
If k = 17 Then Label24.Caption = Label56.Caption
If k = 17 Then Label24.BackColor = Label56.BackColor
If k = 17 Then Label24.ForeColor = Label56.ForeColor
If k = 18 Then Label25.Caption = Label56.Caption
If k = 18 Then Label25.BackColor = Label56.BackColor
If k = 18 Then Label25.ForeColor = Label56.ForeColor
If k = 19 Then Label26.Caption = Label56.Caption
If k = 19 Then Label26.BackColor = Label56.BackColor
If k = 19 Then Label26.ForeColor = Label56.ForeColor
If k = 20 Then Label27.Caption = Label56.Caption
If k = 20 Then Label27.BackColor = Label56.BackColor
If k = 20 Then Label27.ForeColor = Label56.ForeColor
If k = 21 Then Label28.Caption = Label56.Caption
If k = 21 Then Label28.BackColor = Label56.BackColor
If k = 21 Then Label28.ForeColor = Label56.ForeColor
If k = 22 Then Label29.Caption = Label56.Caption
If k = 22 Then Label29.BackColor = Label56.BackColor
If k = 22 Then Label29.ForeColor = Label56.ForeColor
If k = 23 Then Label30.Caption = Label56.Caption
If k = 23 Then Label30.BackColor = Label56.BackColor
If k = 23 Then Label30.ForeColor = Label56.ForeColor
If k = 24 Then Label31.Caption = Label56.Caption
If k = 24 Then Label31.BackColor = Label56.BackColor
If k = 24 Then Label31.ForeColor = Label56.ForeColor
If k = 25 Then Label32.Caption = Label56.Caption
If k = 25 Then Label32.BackColor = Label56.BackColor
If k = 25 Then Label32.ForeColor = Label56.ForeColor
If k = 26 Then Label33.Caption = Label56.Caption
If k = 26 Then Label33.BackColor = Label56.BackColor
If k = 26 Then Label33.ForeColor = Label56.ForeColor
If k = 27 Then Label34.Caption = Label56.Caption
If k = 27 Then Label34.BackColor = Label56.BackColor
If k = 27 Then Label34.ForeColor = Label56.ForeColor
If k = 28 Then Label35.Caption = Label56.Caption
If k = 28 Then Label35.BackColor = Label56.BackColor
If k = 28 Then Label35.ForeColor = Label56.ForeColor
If k = 29 Then Label36.Caption = Label56.Caption
If k = 29 Then Label36.BackColor = Label56.BackColor
If k = 29 Then Label36.ForeColor = Label56.ForeColor
If k = 30 Then Label37.Caption = Label56.Caption
If k = 30 Then Label37.BackColor = Label56.BackColor
If k = 30 Then Label37.ForeColor = Label56.ForeColor
If k = 31 Then Label38.Caption = Label56.Caption
If k = 31 Then Label38.BackColor = Label56.BackColor
If k = 31 Then Label38.ForeColor = Label56.ForeColor
If k = 32 Then Label39.Caption = Label56.Caption
If k = 32 Then Label39.BackColor = Label56.BackColor
If k = 32 Then Label39.ForeColor = Label56.ForeColor
If k = 33 Then Label40.Caption = Label56.Caption
If k = 33 Then Label40.BackColor = Label56.BackColor
If k = 33 Then Label40.ForeColor = Label56.ForeColor
If k = 34 Then Label41.Caption = Label56.Caption
If k = 34 Then Label41.BackColor = Label56.BackColor
If k = 34 Then Label41.ForeColor = Label56.ForeColor
If k = 35 Then Label42.Caption = Label56.Caption
If k = 35 Then Label42.BackColor = Label56.BackColor
If k = 35 Then Label42.ForeColor = Label56.ForeColor
If k = 36 Then Label43.Caption = Label56.Caption
If k = 36 Then Label43.BackColor = Label56.BackColor
If k = 36 Then Label43.ForeColor = Label56.ForeColor
If k = 37 Then Label44.Caption = Label56.Caption
If k = 37 Then Label44.BackColor = Label56.BackColor
If k = 37 Then Label44.ForeColor = Label56.ForeColor
If k = 38 Then Label45.Caption = Label56.Caption
If k = 38 Then Label45.BackColor = Label56.BackColor
If k = 38 Then Label45.ForeColor = Label56.ForeColor
If k = 39 Then Label46.Caption = Label56.Caption
If k = 39 Then Label46.BackColor = Label56.BackColor
If k = 39 Then Label46.ForeColor = Label56.ForeColor
k = k + 1
Next i
Next j
End Sub
Такий варіант заповнення ігрового поля початкове значення (при старті гри) не можна вважати оптимальним. Проте він дуже наочний для розуміння алгоритму.
Процедура Form_Load () тепер буде виглядати так:
Private Sub Form_Load ()
Set_Nominal
Fdraw
Field_Fill
End Sub
Для того, щоб подивитися, як все працює, додамо ще одну процедуру Form_Click () (на деякий час. Для налагодження):
Private Sub Form_Click ()
Set_Nominal 'Заповнити масив field (i, j)
Fdraw 'Намалювати на ігровому полі значення масиву field (i, j) - для налагодження
Field_Fill 'Намалювати реальні номінали осередків і колірні атрибути
End Sub
- Вона повністю ідентична процедурі Form_Load ()
Тепер, натискаючи мишкою на полі форми Form1 (тільки форми), Ви можете подивитися, що значення номіналів осередків та їх кольорові атрибути змінюються правильно.
Повний VB-проект з цього етапу розробки гри - у файлі vbg2.zip
Процедуру Form_Click () можна видалити.
Розробимо процедуру Num_Move (), переписуються значення та кольорові атрибути осередків ігрового поля порядково, зверху - вниз. А так само - що заповнює верхній ряд ігрового поля новими значеннями (тобто нові значення комірок як би вводяться зверху ігрового поля). Процедура буде містити просто оператори копіювання. Ви можете самі розробити більш оптимальний алгоритм копіювання.
Private Sub Num_Move ()
For j = 0 To 4
For i = 0 To 7
field (i, j) = field (i, j + 1)
Next i
Next j
Field_Fill 'Намалювати нові значення на екран
End Sub
Щоб подивитися, як працює копіювання значень і атрибутів осередків зверху вниз, створимо «тимчасову» процедуру обробки Click-а на рамці Frame1:
Private Sub Frame1_Click ()
Num_Move
End Sub
Повний VB-проект з цього етапу розробки гри - у файлі vbg3.zip
Тепер потрібно додати код Private Sub Up_Str_App () для заповнення верхнього рядка ігрового поля новими значеннями.
Private Sub Up_Str_App ()
TM = Time 'Прочитайте поточний час
TTMS = Len (TM) 'Довжина рядка з часом
TTM = Mid $ (TM, 7, 2) 'Виділити секунди
For i = 0 To TTM 'Повторити цикл стільки разів, скільки секунд
Next i
'------------------------------------------------- -
'Заповнити верхній рядок масиву field (i, 5)
For i = 0 To 7
field (i, 5) = Int ((20 * Rnd) + 1)
Next i
'------------------------------------------------- -
'Заповнити верхній рядок номіналами, копіюючи їх з Label56
Field_Fill 'перемалювати значення на екрані, з новими значеннями верхнього рядка
End Sub
Підключимо виклик процедури в Frame1.Click
Повний VB-проект з цього етапу розробки гри - у файлі vbg4.zip
Покликати мишкою на полі Frame1 і подивіться, як все працює!
Тепер потрібно написати код обробки постановки гравцем ігрового маркера в будь-яку з осередків нижнього рядка ігрового поля.
Процедура для збереження колірних атрибутів всіх осередків нижнього рядка до установки маркера:
Private Sub Save_Color ()
savecolor (0) = Label7.BackColor 'Запам'ятати колір фону Label7
savecolor (1) = Label8.BackColor 'Запам'ятати колір фону Label8
savecolor (2) = Label9.BackColor 'Запам'ятати колір фону Label9
savecolor (3) = Label10.BackColor 'Запам'ятати колір фону Label10
savecolor (4) = Label11.BackColor 'Запам'ятати колір фону Label11
savecolor (5) = Label12.BackColor 'Запам'ятати колір фону Label12
savecolor (6) = Label13.BackColor 'Запам'ятати колір фону Label13
savecolor (7) = Label14.BackColor 'Запам'ятати колір фону Label14
End Sub
Створимо тригер firstset = 0
Тригер = 0, якщо маркер в нижній рядок ще не ставили.
Загальний фрагмент коду, що обробляє установку маркера в нижньому рядку:
Private Sub Label7_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону всіх осередків нижнього рядка
If firstset = 0 Then Label7.BackColor = & HFF0000 'Маркер СИНЬОГО кольору
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 0 'Маркер у клітинці, відповідної savecolor (0)
End Sub
Private Sub Label8_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону всіх осередків нижнього рядка
If firstset = 0 Then Label8.BackColor = & HFF0000 'Маркер СИНЬОГО кольору
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 1 'Маркер у клітинці, відповідної savecolor (1)
End Sub
Private Sub Label9_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону всіх осередків нижнього рядка
If firstset = 0 Then Label9.BackColor = & HFF0000 'Маркер СИНЬОГО кольору
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 2 'Маркер у клітинці, відповідної savecolor (2)
End Sub
Private Sub Label10_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону всіх осередків нижнього рядка
If firstset = 0 Then Label10.BackColor = & HFF0000 'Маркер СИНЬОГО кольору
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 3 'Маркер у клітинці, відповідної savecolor (3)
End Sub
Private Sub Label11_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону всіх осередків нижнього рядка
If firstset = 0 Then Label11.BackColor = & HFF0000 'Маркер СИНЬОГО кольору
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 4 'Маркер у клітинці, відповідної savecolor (4)
End Sub
Private Sub Label12_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону всіх осередків нижнього рядка
If firstset = 0 Then Label12.BackColor = & HFF0000 'Маркер СИНЬОГО кольору
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 5 'Маркер у клітинці, відповідної savecolor (5)
End Sub
Private Sub Label13_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону всіх осередків нижнього рядка
If firstset = 0 Then Label13.BackColor = & HFF0000 'Маркер СИНЬОГО кольору
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 6 'Маркер у клітинці, відповідної savecolor (6)
End Sub
Private Sub Label14_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону всіх осередків нижнього рядка
If firstset = 0 Then Label14.BackColor = & HFF0000 'Маркер СИНЬОГО кольору
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 7 'Маркер у клітинці, відповідної savecolor (7)
End Sub
Private Sub Save_Color ()
savecolor (0) = Label7.BackColor 'Запам'ятати попередній колір фону Label7
savecolor (1) = Label8.BackColor 'Запам'ятати попередній колір фону Label8
savecolor (2) = Label9.BackColor 'Запам'ятати попередній колір фону Label9
savecolor (3) = Label10.BackColor 'Запам'ятати попередній колір фону Label10
savecolor (4) = Label11.BackColor 'Запам'ятати попередній колір фону Label11
savecolor (5) = Label12.BackColor 'Запам'ятати попередній колір фону Label12
savecolor (6) = Label13.BackColor 'Запам'ятати попередній колір фону Label13
savecolor (7) = Label14.BackColor 'Запам'ятати попередній колір фону Label14
End Sub
Процедура Save_Color () буде використовуватися для відновлення кольору осередків при переміщенні маркера по горизонталі (по нижньому рядку ігрового поля).
Створимо змінну markersave в якій будемо запам'ятовувати НОМЕР ЕЛЕМЕНТА масиву savecolor (j), яка відповідає осередку з маркером (у яку поставили маркер).
Можна перевірити, що маркер можливо поставити тільки в одне відділення. Тепер потрібно забезпечити збереження маркера (забарвлення осередки в синій колір) при зрушуванні осередків зверху-вниз.
Процедура відновлення кольору маркера після зсуву клітинок ігрового поля зверху-вниз:
Private Sub Marker_Reset ()
If markersave = 0 Then Label7.BackColor = & HFF0000
If markersave = 1 Then Label8.BackColor = & HFF0000
If markersave = 2 Then Label9.BackColor = & HFF0000
If markersave = 3 Then Label10.BackColor = & HFF0000
If markersave = 4 Then Label11.BackColor = & HFF0000
If markersave = 5 Then Label12.BackColor = & HFF0000
If markersave = 6 Then Label13.BackColor = & HFF0000
If markersave = 7 Then Label14.BackColor = & HFF0000
End Sub
Тепер «підключимо» процедуру Marker_Reset () до роботи в процедурі зсуву вниз. У самий низ процедури Frame1_Click () вставимо наступний код (виділений червоним кольором):
Private Sub Frame1_Click ()
Num_Move 'Перемістити значення всіх рядків на одну вниз
Up_Str_App 'Заповнити верхній рядок новими номіналами
Marker_Reset 'Відновити маркер
End Sub
Повний VB-проект з цього етапу розробки гри - у файлі vbg5.zip
Напишемо процедуру підрахунку очок при установці маркера на початку гри.
Private Sub Set_Marker_Count ()
'Підрахунок очок при постановці маркера
Dim et 'У цю змінну будуть записані результати перерахунку значень масиву field (i, j)
'У номінал осередків
If n = 0 Then
'В яку з осередків поставлений маркер - які клітинки field (i, j) їй відповідають
If markersave = 0 Then et = field (0, 0)
If markersave = 1 Then et = field (1, 0)
If markersave = 2 Then et = field (2, 0)
If markersave = 3 Then et = field (3, 0)
If markersave = 4 Then et = field (4, 0)
If markersave = 5 Then et = field (5, 0)
If markersave = 6 Then et = field (6, 0)
If markersave = 7 Then et = field (7, 0)
'Написати рахунок
If et = 0 Then Label48.Caption = Label48.Caption + 1
If et = 1 Then Label48.Caption = Label48.Caption - 1
If et = 2 Then Label48.Caption = Label48.Caption + 5
If et = 3 Then Label48.Caption = Label48.Caption - 5
If et = 4 Then Label48.Caption = Label48.Caption + 10
If et = 5 Then Label48.Caption = Label48.Caption - 10
If et = 6 Then Label48.Caption = Label48.Caption + 15
If et = 7 Then Label48.Caption = Label48.Caption - 15
If et = 8 Then Label56.Caption = Label48.Caption + 25
If et = 9 Then Label48.Caption = Label48.Caption + 500
If et = 10 Then Label48.Caption = Label48.Caption + 100
If et = 11 Then Label48.Caption = Label48.Caption - 200
If et = 12 Then Label48.Caption = 0
If et = 13 Then Label48.Caption = 0
If et = 14 Then End
If et = 15 Then Label48.Caption = Label48.Caption - 10
If et = 16 Then Label48.Caption = Label48.Caption - 5
If et = 17 Then Label48.Caption = Label48.Caption - 1
If et = 18 Then Label48.Caption = Label48.Caption + 1
If et = 19 Then Label48.Caption = Label48.Caption + 5
If et = 20 Then Label48.Caption = Label48.Caption - 25
n = 1 'Більше не обробляти, тому що маркер вже намальований
End If
End Sub
Тепер «підключимо» процедуру підрахунку очок - в кожну з процедур Click-а для осередків нижній рядки:
Private Sub Label7_Click ()
If firstset = 0 Then Save_Color 'Запам'ятати колір фону
If firstset = 0 Then Label7.BackColor = & HFF0000 'Поставити колір фону маркера (синій)
If firstset = 0 Then firstset = 1 'Більше не обробляти
markersave = 0 'Вказує на клітинку, в яку встановлений маркер
Set_Marker_Count 'Скорегувати рахунок
End Sub
Для решти осередків нижнього рядка - точно так само.
Тепер напишемо процедуру підрахунку очок при зсуві осередків зверху - вниз.
Процедура буде виглядати надзвичайно просто:
Private Sub Dn_Count ()
'Підрахувати окуляри при зсуві зверху - вниз
n = 0 'Тимчасово дозволити роботу процедури Set_Marker_Count
Set_Marker_Count 'Процедура підрахунку очок при постановці маркера
End Sub
Для демонстрації роботи процедури вставимо її виклик в процедуру зсуву рядів осередків зверху - вниз Frame1_Click ():
Private Sub Frame1_Click ()
Num_Move 'Перемістити номінали всіх осередків зверху - вниз
Up_Str_App 'Заповнити верхній рядок ігрового поля новими номіналами
Marker_Reset 'Відновити маркер
Dn_Count 'Підрахувати окуляри при зсуві зверху - вниз
End Sub
Повний VB-проект з цього етапу розробки гри - у файлі vbg6.zip
Створимо процедуру роботи кольорового лінійного індикатора. Додамо на форму таймер Timer1 і відразу «дозволимо» його.
Private Sub Timer1_Timer ()
IndLent = IndLent + 1
If IndLent = 9 Then
IndLent = 0
Timer1.Interval = 500 'Відновимо інтервал таймера
End If
Print_Ind 'Намалюємо індикатор
End Sub
Процедура малювання індикатора:
Private Sub Print_Ind ()
If IndLent = 1 Then Label55.Visible = False 'загасити елемент індикатора
If IndLent = 2 Then Label54.Visible = False 'загасити елемент індикатора
If IndLent = 3 Then Label53.Visible = False 'загасити елемент індикатора
If IndLent = 4 Then Label52.Visible = False 'загасити елемент індикатора
If IndLent = 5 Then Label51.Visible = False 'загасити елемент індикатора
If IndLent = 6 Then Label50.Visible = False 'загасити елемент індикатора
If IndLent = 7 Then Label49.Visible = False 'загасити елемент індикатора
If IndLent = 7 Then Timer1.Interval = 100 'Зменшити інтервал, щоб індикатор
'Відновлювався швидше
If IndLent = 0 Then 'Намалювати індикатор повністю
Label55.Visible = True
Label54.Visible = True
Label53.Visible = True
Label52.Visible = True
Label51.Visible = True
Label50.Visible = True
Label49.Visible = True
End If
End Sub
Можна подивитися, як індикатор працює.
Тепер таймер потрібно «задізейбліть» і вирішувати тільки після того, як маркер буде поставлений в нижній рядок ігрового поля. Дозвіл таймера вставимо в процедуру постановки маркера на нижньому рядку ігрового поля (а точніше - в процедуру підрахунку очок після установки маркера Set_Marker_Count (), тому що вона спільна для всіх осередків нижнього рівня).
В кінці процедури Set_Marker_Count () з'явиться рядок:
Timer1.Enabled = True 'Дозволити таймер, тому що маркер поставлений
Повний VB-проект з цього етапу розробки гри - у файлі vbg7.zip
Коли кольоровий лінійний індикатор повністю зникне, необхідно зрушити всі рядки з комірками ігрового поля зрушити вниз (процедура Frame1_Click ()), на маркер, підрахувати окуляри і заповнити верхній рядок ігрового поля новими значеннями номіналів.
Процедура роботи таймера Timer1 буде виглядати наступним чином:
Private Sub Timer1_Timer ()
IndLent = IndLent + 1
If IndLent = 9 Then
IndLent = 0
Timer1.Interval = 500
Frame1_Click 'Перемістити рівні
End If
Print_Ind 'Намалювати індикатор
End Sub
Тепер потрібно написати обробку натисків клавіш і переміщення маркера вправо-вліво по нижньому рядку осередків ігрового поля.
Розмістимо на формі Form1 ще один таймер Timer2. Поставимо інтервал часу для Timer2 = 50 і помістимо у процедуру роботи принтера код перевірки стану клавіш:
Оголосимо потрібне для роботи процедури:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
І власне код обробки:
Private Sub Timer2_Timer ()
'Обробка натиснення клавіш "стрілка вліво" і "стрілка вправо"
If (GetAsyncKeyState (vbKeyLeft)) Then
'Кнопка вліво
Form1.Caption = "Left"
ElseIf (GetAsyncKeyState (vbKeyRight)) Then
'Кнопка вправо
Form1.Caption = "Right"
End If
End Sub
Написи у заголовку форми "Left" і "Right" виводяться лише для налагодження.
Змінна markersave однозначно показує якою осередку нижнього рядка ігрового поля стоїть маркер. Напишемо процедуру переміщення маркера вправо-вліво по нижньому рядку:
Private Sub Form_KeyDown (KeyCode As Integer, Shift As Integer)
'Обробка натискання клавіш «стрілка вправо» і «стрілка вліво»
If (GetAsyncKeyState (vbKeyLeft)) Then
'Кнопка вліво
Form1.Caption = "Left"
Move_Point_Left 'Перемістити маркер вліво
ElseIf (GetAsyncKeyState (vbKeyRight)) Then
'Кнопка вправо
Form1.Caption = "Right"
Move_Point_Right 'Перемістити маркер праворуч
End If
End Sub
Private Sub Move_Point_Left ()
If markersave = 0 Then 'Якщо сама ліва клітинка нижнього рядка
markersave = 7 'Лівіше самої лівої клітинки - сама ПРАВА (циклічний перехід)
firstset = 0 'Тимчасово дозволити малювання маркера
Label7.BackColor = savecolor (0) 'Відновити колір фону комірки, де БУВ маркер
Label14_Click 'Перемістити маркер (сама права осередок!)
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 1 Then
markersave = 0 'Помістити лівіше
firstset = 0 'Тимчасово дозволити малювання маркера
Label8.BackColor = savecolor (1) 'Відновити колір клітинки, де БУВ маркер
Label7_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 2 Then
markersave = 1 'Помістити лівіше
firstset = 0 'Тимчасово дозволити малювання маркера
Label9.BackColor = savecolor (2) 'Відновити колір клітинки, де БУВ маркер
Label8_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 3 Then
markersave = 2 'Помістити лівіше
firstset = 0 'Тимчасово дозволити малювання маркера
Label10.BackColor = savecolor (3) 'Відновити колір клітинки, де БУВ маркер
Label9_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 4 Then
markersave = 3 'Помістити лівіше
firstset = 0 'Тимчасово дозволити малювання маркера
Label11.BackColor = savecolor (4) 'Відновити колір клітинки, де БУВ маркер
Label10_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 5 Then
markersave = 4 'Помістити лівіше
firstset = 0 'Тимчасово дозволити малювання маркера
Label12.BackColor = savecolor (5) 'Відновити колір клітинки, де БУВ маркер
Label11_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 6 Then
markersave = 5''Помістити лівіше
firstset = 0 'Тимчасово дозволити малювання маркера
Label13.BackColor = savecolor (6) 'Відновити колір клітинки, де БУВ маркер
Label12_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 7 Then
markersave = 6 'Помістити лівіше
firstset = 0 'Тимчасово дозволити малювання маркера
Label14.BackColor = savecolor (7) 'Відновити колір клітинки, де БУВ маркер
Label13_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
markersave = vt
n = 0
Set_Marker_Count
End Sub
Private Sub Move_Point_Right ()
If markersave = 0 Then 'Якщо сама ліва клітинка
markersave = 1 'Перемістити правіше (тому що значення> на 1)
firstset = 0 'Тимчасово дозволити малювання маркера
Label7.BackColor = savecolor (0) 'Відновити колір клітинки, де БУВ маркер
Label8_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 1 Then
markersave = 2 'Перемістити правіше (тому що значення> на 1)
firstset = 0 'Тимчасово дозволити малювання маркера
Label8.BackColor = savecolor (1) 'Відновити колір клітинки, де БУВ маркер
Label9_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 2 Then
markersave = 3 'Перемістити правіше (тому що значення> на 1)
firstset = 0 'Тимчасово дозволити малювання маркера
Label9.BackColor = savecolor (2) 'Відновити колір клітинки, де БУВ маркер
Label10_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 3 Then
markersave = 4 'Перемістити правіше (тому що значення> на 1)
firstset = 0 'Тимчасово дозволити малювання маркера
Label10.BackColor = savecolor (3) 'Відновити колір клітинки, де БУВ маркер
Label11_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 4 Then
markersave = 5 'Перемістити правіше (тому що значення> на 1)
firstset = 0 'Тимчасово дозволити малювання маркера
Label11.BackColor = savecolor (4) 'Відновити колір клітинки, де БУВ маркер
Label12_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 5 Then
markersave = 6 'Перемістити правіше (тому що значення> на 1)
firstset = 0 'Тимчасово дозволити малювання маркера
Label12.BackColor = savecolor (5) 'Відновити колір клітинки, де БУВ маркер
Label13_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 6 Then
markersave = 7 'Перемістити правіше (тому що значення> на 1)
firstset = 0 'Тимчасово дозволити малювання маркера
Label13.BackColor = savecolor (6) 'Відновити колір клітинки, де БУВ маркер
Label14_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
If markersave = 7 Then
markersave = 0 'Перемістити правіше (тому що значення> на 1)
firstset = 0 'Тимчасово дозволити малювання маркера
Label14.BackColor = savecolor (7) 'Відновити колір клітинки, де БУВ маркер
Label7_Click 'Перемістити маркер
vt = markersave
markersave = 10 'Заборонити помилкові спрацьовування (значення 10 не відповідає
'Ніякої клітинці)
End If
markersave = vt
n = 0
Set_Marker_Count
End Sub
Тепер потрібно зробити всього одну процедуру - процедуру зсуву нумерації поточних ігрових рівнів:
Private Sub Level_Count ()
Label6.Caption = Label6.Caption + 1
Label5.Caption = Label6.Caption + 1
Label4.Caption = Label5.Caption + 1
Label3.Caption = Label4.Caption + 1
Label2.Caption = Label3.Caption + 1
End Sub
Підключимо процедуру зсуву шарів до роботи, наприклад так:
Private Sub Dn_Count ()
'Підраховувати окуляри при зсуві зверху вниз
n = 0
Set_Marker_Count
Level_Count 'Перемістити рівні Level
End Sub
Повний VB-проект з цього етапу розробки гри - у файлі vbg8.zip
Показовий момент - написані всі процедури для software-реалізації гри Oflameron. Тобто Ви створили зовсім працездатну ігрову програму на Visual Basic. Представляти її як комерційний продукт рано - ще багато «шорсткостей». Наприклад, якщо Click-нуть на об'єкті Frame, то гра почнеться без установки маркера.
Усуненню таких «шорсткостей», наданню програмі комерційного виду буде присвячена 2-а частина керівництва.
- Частина 2 - доведення ігрової програми
- Частина 3 - розробка версії гри на VB для «наладонних» комп'ютерів
- Частина 4 - розробка версії гри на Delphi
- Частина 5 - розробка версії гри на JAVA для стільникових телефонів
На сайті http://freeproject.narod.ru викладена інша версія програмування гри Oflameron на Visual Basic 6.0
На сайті http://play-man.narod.ru викладена версія гри Oflameron на листочку паперу. Досить просто роздрукувати ігровий бланк з документа MS Word і грати.
Резюме (не повне):
- Асемблер - 8 років
- JAVA - 4 роки
- VB - 6 років
- PHP - 5 років
PS Не вважайте це опис оптимальним. Але це краще керівництво з програмування гри в Рунет-е.