Перейдем к следующему примеру — необходимо разработать несложную игру. На рабочем листе (рис. 1.42) следует разместить пять окон для изображений (элементы управления типа «Изображение»). При этом два окна будут основными — расположены слева и большие по размеру. Другие три окна имеют меньшие размеры и расположены в правой части рабочего листа (они будут содержать эталонные изображения). Также на рис. 1.42 расположены две кнопки и две надписи, при этом надпись Результат является просто поясняющей, и далее мы ее упоминать не будем.
Теперь смысл игры. Предварительно в три маленьких окна в правой части листа выводятся три различные картинки (условно их можно называть эталонными). При щелчке на кнопке Бросок в каждое из двух основных окон для изображений должна попадать (случайным образом) одна из трех возможных картинок (из набора эталонных, которые видны на экране). Если в результате такого случайного выбора картинки в обоих основных окнах совпадают, то в элемент управления «Надпись» для результата добавляется 3 балла, а если нет, то вычитается 1 балл.
Рис. 1.42. Интерфейс разрабатываемой игры
Нам также потребуется датчик случайных чисел — здесь мы воспользуемся уже знакомой функцией Rnd. На первом этапе необходимо дать имена объектам в соответствии с табл. 1.2. Назначение элементов достаточно очевидно. Нескольких слов заслуживает элемент «Надпись» Res для отображения результата. В ней вычисляется суммарный результат по итогам серии произведенных бросков. А по щелчку на кнопке Начать игру снова значение результата обнуляется. Таким образом, вступительная часть перед программированием завершена, и поэтому перейдем к описанию программного кода.
Для того чтобы между сеансами работы на компьютере текущий результат сохранялся, отведем для него ячейку в первой строке на листе — М1. В начале в нее необходимо записать ноль. После каждого броска в эту ячейку программно будет записываться результат. В этом случае при сохранении книги предыдущий результат сохраняется в ячейке М1. Процедура, выполняемая при открытии книги, должна извлечь из ячейки М1 предыдущий результат, и тогда пользователь будет иметь возможность продолжить игру.
В качестве первого программного фрагмента оформим процедуру, выполняемую при открытии книги, так, как представлено в листинге 1.26. Здесь в надпись для результата подставляется содержимое ячейки М1 с первого листа книги.
1 2 3 4 | ' Листинг 1.26. Процедура, выполняемая при открытии книги Private Sub Workbook_Open() Worksheets(1).Res.Caption = Worksheets(1).Range("M1").Value End Sub |
Свойство Name | Тип объекта | Комментарий |
---|---|---|
Image1 | Изображение | Левое основное окно для изображения |
Image2 | Изображение | Правое основное окно для изображения |
ImageEtalon1 | Изображение | Левое окно для образца |
ImageEtalon2 | Изображение | Среднее окно для образца |
ImageEtalon3 | Изображение | Правое окно для образца |
Label1 | Надпись | Подпись «Результат» |
Res | Надпись | Для отображения результата |
Brosok | Надпись | Для выполнения броска |
NewGame | Надпись | Начать игру снова |
В листинге 1.27 приведена основная процедура, выполняемая по щелчку на кнопке с надписью Бросок.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | ' Листинг 1.27. Обработка щелчка на кнопке Бросок Private Sub Brosok_Click() Symma = Range("M1") Randomize ' Формирование случайных чисел a = CInt(Rnd * 3 + 0.5) b = CInt(Rnd * 3 + 0.5) ' Отображение картинки в первом окне If a = 1 Then Image1.Picture = ImageEtalon1.Picture ElseIf a = 2 Then Image1.Picture = ImageEtalon2.Picture Else Image1.Picture = ImageEtalon3.Picture End If ' Отображение картинки во втором окне If b = 1 Then Image2.Picture = ImageEtalon1.Picture ElseIf b = 2 Then Image2.Picture = ImageEtalon2.Picture Else Image2.Picture = ImageEtalon3.Picture End If ' Формирование результата If a = b Then Symma = Symma + 3 Else Symma = Symma - 1 End If ' Фиксирование результата в надписи и в ячейке на листе Res.Caption = Symma Range("M1").Value = Symma End Sub |
В тексте процедуры используется функция Rnd, которая нам уже встречалась. Преобразование CInt (Rnd * 3 + 0.5)
позволяет сформировать случайное целое число, которое может принимать одно из трех возможных значений: 1, 2 или 3. Таким образом, можно значения переменных а и b сопоставить с номерами картинок. В результате при совпадении картинок мы увеличиваем сумму выигрыша на 3 балла, а при несовпадении, соответственно, уменьшаем на один.
Если не предпринимать каких-либо действий, то функция Rnd при каждом повторном открытии книги выдает одну и ту же последовательность случайных чисел. Чтобы устранить данный недостаток, мы воспользовались функцией Randomize, которая выполняет перемешивание случайных чисел. В результате при различных сеансах работы последовательность, выдаваемая по нажатию кнопки Бросок, каждый раз будет разная.
Другая кнопка на листе (NewGame) позволяет сбросить содержимое ячейки М1 и значение свойства Caption элемента Res в ноль для начала новой игры (листинг 1.28).
1 2 3 4 5 6 | ' Листинг 1.28. Процедура сброса суммы баллов в ноль Private Sub NewGame_Click() Symma = О Res.Caption = Symma Range("M1") = Symma End Sub |
Один из вариантов развития игры показан на рис. 1.43.
Рис. 1.43. Один из сценариев развития игры