Реферат: Программирование логической игры на visual basic
Напишем процедуру подсчета очков при установке маркера в начале игры.
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 лет
P.S. Не считайте это описание оптимальным. Но это лучшее руководство по программированию игры в РуНет-е.