Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ch01.doc
Скачиваний:
16
Добавлен:
03.09.2019
Размер:
350.72 Кб
Скачать

Динамическое перемещение кнопки

Рассмотрим еще один простой, но эффектный пример.

Задача заключается в том, чтобы разместить на листе кнопку, и эта кнопка, при попытке навести на нее курсор мыши, должна автоматически перемещаться на другое место на рабочем листе. Фактически в этом случае при выходе из режима конструктора невозможно навести на кнопку курсор мыши.

Разберем, что для подобного эффекта необходимо сделать.

Во–первых, на листе новой книги создадим кнопку (рис. 1.41), для ее свойства Name установим в значение Com1.

Далее перейдем в режим конструктора и напишем содержание процедуры Com1_MouseMove(). Сам короткий текст несложной процедуры представлен на листинге 1.25.

Рис. 1.41. Пример “убегающей” кнопки

Как мы уже знаем, эта процедура автоматически выполняется при наведении курсора мыши на кнопку. В приведенном тексте используется внутренняя функция Visual Basic — Rnd, которая при обращении к ней выдает случайное число в интервале от 0 до 1. Координаты кнопки на листе определяются значениями свойств Top и Left. Так как функция Rnd выдает произвольное действительное число от 0 до 1, то после умножения этого значения на 300 координаты кнопки могут принимать любые значения в интервале от 0 до 300.

Теперь после перехода в Microsoft Excel и выхода из режима конструктора можно убедиться в том, что положение кнопки при наведении на нее курсора мыши меняется.

Листинг 1.25. Процедура, выполняемая при наведении мыши на кнопку

Private Sub Com1_Click()

Com1.Left = Rnd * 300

Com1.Top = Rnd * 300

End Sub

Разработка игры

Перейдем к следующему примеру — необходимо разработать несложную игру.

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

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

Нам также потребуется датчик случайных чисел — здесь мы воспользуемся уже знакомой функцией Rnd.

На первом этапе необходимо дать имена объектам в соответствие с табл. 1.2. Назначение элементов достаточно очевидное. Нескольких слов заслуживает элемент надпись Res для отображения результата. В ней вычисляется суммарный результат по итогам серии произведенных бросков. А по кнопке Начать игру снова значение результата обнуляется.

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

Таким образом, вступительная часть перед программированием завершена и поэтому перейдем к описанию программного кода.

Для того чтобы между сеансами работы на компьютере текущий результат сохранялся для него мы отведем ячейку в первой строке на листе — M1. В начале в нее необходимо записать ноль. После каждого броска в эту ячейку программно будет записываться результат. В этом случае при сохранении книги предыдущий результат сохраняется в ячейке M1. Процедура, выполняемая при открытии книги, должна извлечь из ячейки M1 предыдущий результат и тогда пользователь будет иметь возможность продолжить игру.

В качестве первого программного фрагмента оформим процедуру, выполняемую при открытии книги так, как представлено на листинге 1.26. Здесь в надпись для результата подставляется содержимое ячейки M1 с первого листа книги.

Листинг 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.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. Таким образом, можно значения переменных a и b сопоставить с номерами картинок. В результате при совпадении картинок мы увеличиваем сумму выигрыша на 3 балла, а при несовпадении, соответственно, уменьшаем на один.

Если не предпринимать каких–либо действий, то функция Rnd при каждом повторном открытии книги выдает одну и ту же последовательность случайных чисел. Чтобы устранить данный недостаток, мы воспользовались функцией Randomize, которая выполняет перемешивание случайных чисел. В результате при различных сеансах работы последовательность, выдаваемая по кнопке Бросок, каждый раз будет разная.

Другая кнопка на листе (NewGame) позволяет сбросить содержимое ячейки M1 и значение свойства Caption элемента Res в ноль для начала новой игры (листинг 1.28).

Листинг 1.28. Процедура сброса суммы баллов в ноль

Private Sub NewGame_Click()

Symma = 0

Res.Caption = Symma

Range("M1") = Symma

End Sub

Один из вариантов развития игры показан на рис. 1.43.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]