Игры в Excel (змейка, морской бой, вертолет и другие)
У нас появилось свободное время.. значит можно поиграть! В этой рубрике мы будем выкладывать простенькие игры в Excel. Да, в Excel тоже можно писать игры, ведь в нем встроен язык программирования VBA. После того как вы скачаете игру (по ссылкам ниже), необходимо будет только включить макросы (как это сделать описано тут ). Во многих Ирах в Excel (в макросах) есть много интересных находок. Кто знает, может игра в Excel поможет вам не только скоротать время, но и научиться чему-то новому. Играйте в Excel и пишите игры сами!
Игра в Excel «Морской бой»:
Игра в Excel «Змейка»:
Игра в Excel «Вертолет»:
Игра в Excel «Квадрат»
Игра в Excel «Лягушка»
Игра в Excel «Темница»
Если у вас есть чем поделиться — присылайте!
Создание пятнашек в Excel
Разбор создания игры в Excel
При создании игры мы преследовали две цели:
- Продемонстрировать возможности программирования и визуализации в Excel. На примере научить вас некоторым приемам создания пользовательской формы и макросов, которые с ней взаимодействуют.
- Разнообразить досуг после плодотворной работы в Excel. Игра также встроена в нашу надстройку VBA-Excel чтобы она всегда была под рукой.
Разработка игрового поля
Игровое поле пятнашек состоит по сути из 16 фишек, можно также добавить кнопкой перемешать (начать с начала) и отображением количества шагов. В качестве фишек мы будем использовать обычные кнопки CommandButton — 16 штук.
Расположим их в виде поля 4×4. Уберем стандартное название кнопок (а свойство Caption) сделаем их квадратными в форме фишек. Вообще тут можно дать волю фантазии наложить тени, выбрать цвет и так далее, углубляться не будем. На игровое поле мы добавили также кнопку перемешать. Она будет служить для сброса и начала новой игры.

Добавили текстовые поля Label , в которые будем записывать количество потраченных шагов и лучший счет. Что получилось видно на картинке.
Еще один момент, чтобы кнопки не «нажимались» (т.е., чтобы по клику не происходила анимация нажатия на кнопку), установим свойство Locked в положение True.
Механика игры
Управление перемещением фишек будем реализовывать путем нажатия на стрелки вверх, вниз, влево и вправо. При нажатии на стрелки будем менять текст кнопок (свойство Caption) в зависимости от направления. С анимацией не будем мудрить, сами фишки не будем перемещать, будем просто мгновенно менять текст фишки с одного на другой, визуально будет казаться, что фишка переместилась по полю.
Старт игры
Инициализация формы вызываем процедуру создания поля.
Private Sub UserForm_Initialize() Me.Caption = "П Я Т Н А Ш К И" Call Peremeshat End Sub
Случайным образом заполняем игровое поле и проверяем комбинацию на решаемость. Подробно проверку на решаемость описывать не будем, так как не в этом цель. Изучить этот вопрос можно на сайте http://pyatnashki.wmsite.ru/kombinacyi.
Sub Peremeshat() Dim a&(), i&, Max& Dim j As Integer, Num As Integer Dim e As Double 'вычисляет номер ряда пустой клетки Dim isE As Boolean 'проверка на четность Dim mySum As Integer 'сумма количества нужных элементов 'Сбрасываем количество ходов stepC = 0 Me.lbl_stepC.Caption = stepC Randomize ' Включаем генератор случайных чисел NewGame: ' Создаем игровое поле ReDim a(1 To 16) For i = 1 To 16 Do Num = Int(Rnd * 16) + 1 Loop While IsNumeric(Application.Match(Num, a, 0)) a(i) = Num If a(i) = 16 Then Me.Controls("CommandButton" & i).Caption = "" Me.Controls("CommandButton" & i).BackColor = &HA0ADBB Else Me.Controls("CommandButton" & i).Caption = a(i) Me.Controls("CommandButton" & i).BackColor = &H8000000F End If Next 'Проверяем на решаемость On Error Resume Next mySum = 0 For i = 1 To 15 If Me.Controls("CommandButton" & i).Caption = "" Then e = (i + 3) / 4 End If For j = i To 15 If val(Me.Controls("CommandButton" & i).Caption) > val(Me.Controls("CommandButton" & j + 1).Caption) And val(Me.Controls("CommandButton" & j + 1).Caption) > 0 Then mySum = mySum + 1 End If Next j Next i mySum = mySum + Int(e) isE = IsEven(mySum) 'проверяем на четность(решаемость) If isE = False Then GoTo NewGame 'меняем комбинацию если что End Sub
Функция проверки заряженного числа на четность
Function IsEven(Num As Integer) As Boolean IsEven = Fix(Num / 2) = Num / 2 End Function
Создадим процедуры, которые будут перемещать наши фишки. Ниже приведена одна из них, остальные аналогичные, можете найти их в файле.
Sub ToUp() Dim i As Integer For i = 12 To 1 Step -1 If Me.Controls("CommandButton" & i).Caption = "" Then ' Меняем значение фишек Me.Controls("CommandButton" & i).Caption = Me.Controls("CommandButton" & i + 4).Caption Me.Controls("CommandButton" & i + 4).Caption = "" ' меняем цвет фишек Me.Controls("CommandButton" & i).BackColor = &H8000000F Me.Controls("CommandButton" & i + 4).BackColor = &HA0ADBB stepC = stepC + 1 ' Увеличиваем количество ходов Me.lbl_stepC.Caption = stepC End If Next i Call Proverka End Sub
В конце делаем проверку поля и проверяем правильно ли игрок расставил фишки.
Sub Proverka() 'Проверка выигрыша Dim i As Byte, j As Byte For i = 1 To 15 If val(Me.Controls("CommandButton" & i).Caption) = i Then j = j + 1 End If Next i If j < 15 Then Exit Sub ' не выиграли Beep If MsgBox("Начать новую игру?", vbYesNo, "П О Б Е Д А !") = vbYes Then 'даем варианты Call Peremeshat Me.lbl_best.ForeColor = &HEFF8FA Else Unload Me End If End Sub
Осталось "отловить" нажатие стрелок на клавиатуре и запускать нужное движение. Для этого воспользуемся событием формы UserForm_KeyDown.
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode.Value = 40 Then ToDown If KeyCode.Value = 38 Then ToUp If KeyCode.Value = 37 Then ToLeft If KeyCode.Value = 39 Then ToRight End Sub
Как разработать несложную игру средствами VBA Excel
Перейдем к следующему примеру — необходимо разработать несложную игру. На рабочем листе (рис. 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
' Листинг 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
' Листинг 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.28. Процедура сброса суммы баллов в ноль Private Sub NewGame_Click() Symma = О Res.Caption = Symma Range("M1") = Symma End Sub
Один из вариантов развития игры показан на рис. 1.43.

Рис. 1.43. Один из сценариев развития игры
Создание простой игры ClickMe в Excel
Итак приступим. Что же нам необходимо? Какие знания и умения? Сколько времени?
- MS Excel
- VBA
- 30 минут свободного времени
- Фантазия на все это 🙂
Итак, что же мы понапридумывали? . Общая задумка - есть поле 20 на 10. В котором в случайном порядке появляется надпись Click ME! . Мы должны на нее нажать в течении установленных в настройках секунд. Попали? Продолжаем дальше, набивая рекорды! Не попали? Что ж, GAME OVER 🙂

Более детально по пунктам:
- Максимальное количество секунд между кликами. Ставим меньше, чтобы более поразить своих друзей!
- Количество кликов в текущей игре. Чем больше - тем круче!
- Рекорды. Что тут сказать - Вы должны быть на 1 месте и точка.
- Само поле, где будут появляться те самые надписи Click ME!
Итак, нажимаем на PLAY и в поле появляется первый кандидат на клик мышкой:

Кликаем, пока хватит сил - занимаем первое место в рекордах. Если же не успели вовремя кликнуть, либо дрогнула рука - встречайте GAME OVER

В конце концов, потратив немного времени, мы создали простую и забавную игру в Excel!
Файл как обычно в конце блога! Создавайте свои мини-шедевры и будьте душой коллектива;)
