Microsoft Excel

трюкиприёмырешения

Как разработать несложную игру средствами VBA Excel

Перейдем к следующему примеру — необходимо разработать несложную игру. На рабочем листе (рис. 1.42) следует разместить пять окон для изображений (элементы управления типа «Изображение»). При этом два окна будут основными — расположены слева и большие по размеру. Другие три окна имеют меньшие размеры и расположены в правой части рабочего листа (они будут содержать эталонные изображения). Также на рис. 1.42 расположены две кнопки и две надписи, при этом надпись Результат является просто поясняющей, и далее мы ее упоминать не будем.

Теперь смысл игры. Предварительно в три маленьких окна в правой части листа выводятся три различные картинки (условно их можно называть эталонными). При щелчке на кнопке Бросок в каждое из двух основных окон для изображений должна попадать (случайным образом) одна из трех возможных картинок (из набора эталонных, которые видны на экране). Если в результате такого случайного выбора картинки в обоих основных окнах совпадают, то в элемент управления «Надпись» для результата добавляется 3 балла, а если нет, то вычитается 1 балл.

Рис. 1.42. Интерфейс разрабатываемой игры

Рис. 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

Таблица 1.2. Имена объектов на рис. 1.42

Свойство 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. Один из сценариев развития игры

Рис. 1.43. Один из сценариев развития игры

Top