Создаем игру в excel

Развлекая — поучай.
(Гораций)

Если вы уже имели какой-то опыт программирования в прошлой жизни (привет, Basic, Pascal и т.д.), то, скорее всего, уже прошли этап «игрописательства». Однако, тряхнуть стариной и размять мозги вполне можно. Если же вы никогда не программировали игр, то никогда не поздно начать этот весьма увлекательный процесс. Всё, что нам потребуется — это Excel (любой версии) и 15-20 минут времени для начала.

Тренироваться будем на известной в узких кругах программистов игре «Жизнь» (Life). Её придумал британский математик Джон Конвей еще в 1970 году на основе работ легендарного Джона фон Неймана — прадедушки всех современных компьютеров. Если вы не сталкивались с ней раньше — не проблема, правила можно объяснить за полминуты:

  • Игра идет на большом (иногда даже бесконечном) поле в клеточку («вселенной»). Как вы понимаете, Excel для такого подходит идеально :)

  • В один момент времени каждая клетка может быть в двух состояниях — живой (обозначим её каким-нибудь значком или просто единичкой) или же мертвой (пустой). Начальное состояние всех клеток в игре называют первым поколением.

  • Если брать блок клеток 3х3 с текущей клеткой в середине, то вокруг неё оказывается 8 клеток-соседей. Дальнейшая судьба клетки зависит от того, сколько именно живых клеток (N) окажется в этой окружающей области. Вариантов несколько:

  • Правила игры

  • Если клетка была пустая (мертвая), но у нее есть ровно 3 живых соседа, то в ней зарождается жизнь.
  • Если клетка живая, но у неё меньше 2 соседей, то она умирает от одиночества.
  • Если клетка живая, но у неё больше 3 соседей, то она умирает от перенаселения.
  • Если клетка живая и у нее 2-3 соседа, то клетка продолжает жить.

Вот, собственно, и все правила. Можно даже сказать, что всё это неправильно называть игрой, т.к. здесь нет соперников в привычном понимании. Вы расставляете первое поколение, запускаете процесс и затем просто наблюдаете за развитием вашей «колонии» на протяжении нескольких поколений.

Однако, не стоит недооценивать обманчивую простоту этой логики — количество комбинаций, сценариев игры и многообразие фигур в такой игровой вселенной поражает своим разнообразием и поистине бесконечно. В математике подобные модели называют клеточными автоматами. А самое интересное, что реализовать подобную модель можно в любой версии Excel буквально на 20 строчках кода.

Поехали.

Шаг 1. Готовим игровое пространство

Создадим в новой книге три листа:

  • game — это будет основной листы игры, где мы будем наблюдать за развитием нашей «колонии»
  • next — этот лист будет формировать следующее поколение, которое затем придет на смену текущему
  • start — на этом листе мы будем задавать начальную конфигурацию, т.е. первое поколение в нашей игре

На каждом листе (можно выделить их заранее, удерживая клавишу Shift или Ctrl, чтобы не повторять трижды одни и те же действия), разметим игровое поле размером, допустим, 30 на 30 ячеек. Впоследствии размер поля можно будет подправить в соответствии с вашими аппетитами и мощью вашего ПК:

Игровое пространство

На листе start разметим с помощью единичек первое поколение любым желаемым образом:

Первое поколение

Шаг 2. Пишем макрос

Теперь пришла пора расчехлить наш VBA и написать макрос, который и будет делать всю работу, а именно:

  1. Копировать первое поколение с листа start на лист game.
  2. Проходить по ячейкам игрового поля на листе game и проверять окружающих соседей (блок 3х3) для каждой из них.
  3. В зависимости от результатов проверки помечать на листе следующего поколения next ту же ячейку как живую (1) или мертвую (пусто).
  4. Копировать получившееся новое поколение с листа next вместо текущего на листы игры game.
  5. Повторять пункты 2-4 несколько раз, сменяя одно поколение другим и отображая на экране изменения в нашей «колонии».

Для начала откроем редактор Visual Basic на вкладке Разработчик (Developer). Если такой вкладки не видно, то её нужно будет сначала отобразить через Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon), включив соответствующий флажок.

В открывшемся окне редактора создадим новый модуль с помощью команды меню Insert — Module, а затем скопируем и вставим туда код нашего макроса:

Sub Life()
    Dim cell As Range, n As Integer, i As Integer
    
    Set rGame = Worksheets("Game").Range("B2:AE31")
    Set rStart = Worksheets("Start").Range("B2:AE31")
    Set rNext = Worksheets("Next").Range("B2:AE31")
    Set wNext = Worksheets("Next")

    rStart.Copy Destination:=rGame
    
    For i = 1 To 50
        rNext.ClearContents
        For Each cell In rGame.Cells
            n = WorksheetFunction.CountA(cell.Offset(-1, -1).Resize(3, 3)) - cell.value
            If cell = "" And n = 3 Then wNext.Cells(cell.Row, cell.Column) = 1
            If cell = 1 And (n = 2 Or n = 3) Then wNext.Cells(cell.Row, cell.Column) = 1
            If cell = 1 And (n < 2 Or n > 3) Then wNext.Cells(cell.Row, cell.Column) = ""
        Next cell
        rNext.Copy Destination:=rGame
    Next i
End Sub

Теперь давайте разберем его построчно для понятности:

Поскольку в коде нам придется несколько раз ссылаться и много раз работать с диапазонами игрового пространства (B2:AE31) на каждом из трёх листов книги, то имеет смысл сразу оформить их как переменные. Это делается в блоке:

Set rGame = Worksheets("Game").Range("B2:AE31")
Set rStart = Worksheets("Start").Range("B2:AE31")
Set rNext = Worksheets("Next").Range("B2:AE31")

Заодно мы создаем ещё и переменную wNext, которая ссылается на весь лист next целиком — это нам тоже пригодится в будущем:

Set wNext = Worksheets("Next")

Затем, перед началом игры, мы должны перенести первое поколение с листа start на лист game. Это выполяется командой прямого копирования с использованием уже созданных переменных:

rStart.Copy Destination:=rGame

Поскольку мы хотим прокрутить в нашей игре не одно, а несколько (например, 50 для начала) поколений, то дальнейшие действия заключены в цикл:

For i = 1 to 50
...
Next i

А внутри этого цикла мы, во-первых, сначала очищаем рабочее пространство на листе next для формирования следующего поколения:

rNext.ClearContents

А, во-вторых, запускаем вложенный цикл прохода по всем ячейкам игровой вселенной на листе game, чтобы проверить каждую из них — это реализовано циклом прохода по коллекции:

For Each cell in rGame.Cells
...
Next cell

Ссылка на очередную проверяемую ячейку будет храниться в переменной cell. Для этой ячейки нам нужно сначала построить окрестность 3х3 с ней в середине. Это выполняется с помощью конструкции:

cell.Offset(-1, -1).Resize(3, 3)

Здесь метод Offset(-1,-1) виртуально сдвигает текущую проверяемую ячейку на одну строку вверх и на один столбец влево, а потом метод Resize(3,3) опять же виртуально растягивает эту одну ячейку до новых размеров 3 на 3:

Offset и Resize

Чтобы посчитать количество заполненных ячеек в полученной окрестности применяется функция рабочего листа СЧЁТЗ (COUNTA), которую в VBA можно вызвать с помощью объекта WorksheetFunction. Таким образом количество живых соседей в окружающей текущую ячейку области 3 на 3 мы получаем выражением (не забыв вычесть из полученного количества текущую ячейку):

n = WorksheetFunction.CountA(cell.Offset(-1, -1).Resize(3, 3)) - WorksheetFunction.CountA(cell)

Дальше нам нужно проверить полученное количество соседей и пометить на листе следующего поколения текущую ячейку как живую или мертвую, согласно правилам игры. Это выполняет блок из трёх проверок:

If cell = "" And n = 3 Then wNext.Cells(cell.Row, cell.Column) = 1
If cell = 1 And (n = 2 Or n = 3) Then wNext.Cells(cell.Row, cell.Column) = 1
If cell = 1 And (n < 2 Or n > 3) Then wNext.Cells(cell.Row, cell.Column) = ""

Когда цикл прохода по ячейкам будет завершен, то сформированное следующее поколение с листа next нужно скопировать на место текущего на листе game — делаем это уже знакомой конструкцией:

rNext.Copy Destination:=rGame

Вот, собственно, и вся логика.

Осталось вернуться в Excel на лист game, запустить нашу игру через вкладку Разработчик — Макросы (Developer — Macro) и насладиться процессом развития нашей колонии:

Игра Жизнь Life

Ссылки по теме

  • Что такое макросы и как их программировать в Microsoft Excel
  • Справочник по игре «Жизнь» — сайт LifeWiki

Вам бывает скучно на работе? Часто сидите два-три дня без единого намёка на трудовую деятельность и пытаетесь ее имитировать, а руководство так и ждет ошибки с вашей стороны?

Теперь этого можно будет избежать, ведь в разработке находится пошаговая RPG в стиле Dragon Quest на NES для офисного приложения Excel.

Конечно, идея не нова. В Excel и раньше делали разнообразные игры (даже полноценный шутер). Но если вы читали мои предыдущие статьи, то поймёте, что создавать троллейбусы из батонов белого (или чёрного) хлеба — мое небольшое хобби.

Перейдём же к делу

На данный момент готова альфа-версия графического движка и редактор карт. С вероятностью в 99% они будут дорабатываться в процессе разработки.

Сперва немного расскажу о некоторых технических характеристиках.

1. Скорее всего в игре будет использоваться событийная модель, а не циклическая, ведь для пошаговой стратегии цикл не так уж и важен. Это будет зависеть от того, как быстро Excel справится с рендером одного кадра. Минус такого подхода заключается в том, что написать какой-нибудь платформер на этой основе не получится. В любом случае я попробую оба варианта.

2. Все текстуры имеют размер 16*16 пикселей. Палитра состоит всего из 56 цветов (стандартный размер палитры Excel). В качестве основы я взял палитру NES.

3. Текстуры я рисую в программе Aseprite, а в Excel из. bmp перевожу с помощью небольшого, написанного на VBA софта, который нашел в интернете.

4. Бэкграунд состоит из тайлов, спрайты же привязаны к системе координат.

Графический движок

Карта уровня представляет собой двумерный массив с кодовым обозначением тайла в формате «XXXY», где XXX — номер текстуры по порядку, Y — значение, указывающее на то, можно ли пройти сквозь тайл. Вторая функция пока что не реализована.

Спрайты хранятся в отдельном массиве в формате: координата X, координата Y, порядковый номер спрайта, тип спрайта и тэг. Два последних значения пока не используются.

Для создания графического движка сперва необходимо инициализировать различные переменные. Часть из них хранится на отдельном листе, а в коде я сделал их публичными (знаю, что так нельзя):

— высота и ширина игрового экрана;

— диапазон игрового экрана;

— массив игрового экрана для рендеринга;

— размер одной текстуры;

— координаты камеры;

— координаты игрока;

— номер уровня;

— карта тайлов и координаты спрайтов;

— массив спрайтов, тайлов и спрайтов игрока.

Все текстуры хранятся на отдельном листе с отображением индексов цветов палитры.

Так как это только первая версия движка, нажатие на «Новую игру» тут же запускает метод fillWithTextures (процесс создания массива цифровых значений цвета).

‘##########ЯДРО ГРАФИЧЕСКОГО ДВИЖКА##########
Sub fillWithTextures()

Dim cntRow As Integer, cntCol As Integer, pixOffsetX As Double, pixOffsetY As Double, _
mapBlockX As Integer, mapBlockY As Integer, texXOffset As Integer, texYOffset As Integer, _
texNumber As Integer, arrBlockTex() As Variant

Dim cntSprites As Integer, spriteOffsetX As Integer, spriteOffsetY As Integer, _
spriteNumber As Integer

ReDim arrRender(main.screenH, main.screenW)

For cntRow = 1 To main.screenH

For cntCol = 1 To main.screenW

‘Считаем смещение пикселя экрана относительно координат камеры
pixOffsetX = main.cameraX + cntCol
pixOffsetY = main.cameraY + cntRow

‘считаем спрайты
For cntSprites = 1 To UBound(arrMapSprites(), 1)

‘считаем смещение спрайта относительно пикселя
spriteOffsetX = pixOffsetX — arrMapSprites(cntSprites, 1)
spriteOffsetY = pixOffsetY — arrMapSprites(cntSprites, 2)

‘если пиксель содержит спрайт
If spriteOffsetX >= 0 And spriteOffsetY >= 0 And spriteOffsetX + pixOffsetX < pixOffsetX + main.blockSize _
And spriteOffsetY + pixOffsetY < pixOffsetY + main.blockSize Then

‘если элемент спрайта не пуст
If arrSprites((spriteOffsetY + blockSize * arrMapSprites(cntSprites, 3)) + 1, spriteOffsetX + 1) <> 0 Then

arrRender(cntRow, cntCol) = arrSprites((spriteOffsetY + blockSize * arrMapSprites(cntSprites, 3)) + 1, spriteOffsetX + 1)

End If

End If

Next

‘рисуем тайлы
If (pixOffsetX > 0 And pixOffsetX < main.mapWidth) And _
(pixOffsetY > 0 And pixOffsetY < main.mapHeight) Then

‘расчет тайла, в который входит пиксель
mapBlockX = WorksheetFunction.RoundUp(pixOffsetX / main.blockSize, 0)
mapBlockY = WorksheetFunction.RoundUp(pixOffsetY / main.blockSize, 0)

‘определяем номер текстуры
texNumber = arrMapTiles(mapBlockY, mapBlockX)

‘Определение цвета текстуры для пикселя
texXOffset = getTexOffset(pixOffsetX) + 1
texYOffset = getTexOffset(pixOffsetY) + 1

If arrMapTiles(mapBlockY, mapBlockX) <> «» And arrTiles(texNumber * _
main.blockSize + texYOffset, texXOffset) <> «» And arrRender(cntRow, cntCol) = «» Then

arrRender(cntRow, cntCol) = arrTiles(texNumber * main.blockSize + texYOffset, texXOffset)

End If

End If

Next

Next

End Sub

Первым делом происходит поиск спрайтов, которые нужно отрисовать. Для этого программа проверяет каждый «пиксель» игрового экрана, считает смещение этого пикселя относительно стартовых координат камеры, а также смещение относительно всех спрайтов на уровне. Если смещение «пикселя» относительно спрайта по каждой оси равно от 0 до 15 (так как размер текстуры 16*16), берётся индекс нужного цвета из массива спрайтов.

Вторым пунктом программа на основе смещения относительно координат камеры высчитывает позицию «пикселей» на карте тайлов. Когда нужный тайл найден, программа с помощью функции getTextOffset возвращает индекс цвета пикселя из массива тайлов.

‘Возвращает координату текстуры
Function getTexOffset(dCoordinate As Double) As Integer

getTexOffset = (dCoordinate — 1) Mod main.blockSize

End Function

Почему сперва происходит проверка спрайтов, а затем тайлов?

Все просто. Программа просто не трогает те «пиксели», которые уже закрашены спрайтами, что влияет на производительность в лучшую строну.

P.S. На следующий день я понял, что проверка условия «закрашенности» спрайтами должна производиться в начале. Тогда это повлияет на производительность. Привет, оптимизация.

Вторая проблема — это проверка спрайтов для каждого пикселя экрана. Предположим, что на уровне находится 40 спрайтов. При размере экрана 96*64 = 6144 пикселей количество итераций цикла достигает 6144 * 40 = 245760. Если пойти другим путём и проверять спрайты не для каждого пикселя, а по условию нахождения в поле зрения камеры, то количество итераций не превысит 40*16*16 = 10240. Эта проблема решается быстро.

Создание игрока и рендеринг изображения

Для того, чтобы поместить спрайт игрока в рендер-массив нужно посчитать смещение спрайта относительно координат камеры.

Sub renderPlayer(imagePose As Integer)

Dim offsetX As Double, offsetY As Double, cntRow As Integer, _
cntCol As Integer

‘Считаем смещение относительно координат камеры
offsetX = main.playerX — main.cameraX
offsetY = main.playerY — main.cameraY

‘Если игрок не находится за пределами камеры
If offsetX >= 0 And offsetY >= 0 And _
offsetX < main.cameraX + main.screenW And _
offsetY < main.cameraY + main.screenH Then

For cntRow = 0 To main.blockSize — 1

For cntCol = 0 To main.blockSize — 1
‘Если пиксель текстуры заполнен
If main.arrPlayerSpr((cntRow + 1) + (imagePose * main.blockSize), cntCol + 1) <> 0 Then

‘Если пиксель не заходит за пределы камеры
If cntRow + main.playerY <= main.screenH + main.cameraY And cntCol + main.playerX <= main.screenW + main.cameraX Then

arrRender(offsetY + cntRow, offsetX + cntCol) = main.arrPlayerSpr((cntRow + 1) + (imagePose * main.blockSize), cntCol + 1)

End If

End If

Next

Next

End If

End Sub

Аргумент imagePose будет использоваться для имитации поворота игрока при движении.

В конце-концов рендер-массив готов, поэтому вызываем последнюю процедуру, которая рисует сформированный кадр на игровом поле. Ее я показывать не буду, потому что она очень сырая и будет дорабатываться.

Будут дорабатываться и текущие процедуры, потому что на данный момент быстродействие немного хромает и реализовать упомянутую циклическую модель в данный момент проблематично.

Вот, что получается в итоге:

На этом можно пока закончить. Надеюсь, что из ваших глаз не пошла кровь от «лучшего в мире» языка программирования и попыток написать что-то осмысленное.

В любом случае жду критику и советы. Всегда интересно послушать, что скажут люди.

Немного саморекламы

Я создал паблик ВКонтакте, куда буду выкладывать свои мысли, алгоритмы, код, ссылки на эти статьи и конечно мемасики:) Если вам интересно наблюдать за разработкой игр и разных странных вещей, добро пожаловать.

Время на прочтение
1 мин

Количество просмотров 190K

Бухгалтер из Торонто по имени Кэри Уолкин (Cary Walkin) никогда не занимался разработкой компьютерных игр, но в совершенстве освоил Excel. Этого оказалось достаточно для создания RPG-игры, которая работает на макросах VBA, встроенного языка программирования Excel.

Игру Arena.Xlsm версии 1.0 можно скачать здесь:

v1-0-arena.xlsm (работает в Excel 2007 и Excel 2010 под Windows)

Ключевые особенности:

  • Увлекательный сюжет с четырьмя различными концовками, в зависимости от прохождения игры
  • Более 2000 врагов с различным уровнем ИИ
  • 39 модификаторов вещей означает более 1000 возможных комбинаций и свойств предметов
  • 8 схваток с боссами, для победы над каждым из них нужна особая тактика
  • 4 предварительно подготовленных игровых пространства
  • 31 заклинание, есть много разных стратегий для успеха
  • 15 уникальных артефактов
  • 36 наград (достижений)
  • Вся игра от начала до конца проходит внутри рабочей книги Excel

Официальная wiki-страница для помощи по игре, там же информация о базовых стратегиях.

Так что если увидите бухгалтера в офисе, который целыми сутками сидит в программе Excel, присмотритесь к нему повнимательнее. Кто знает, какие заклинания он сейчас подбирает для босса на шестом уровне.

Теги:

  • Arena.Xlsm
  • Excel
  • RPG
  • рабочая книга Excel
  • макрос
  • VBA

Хабы:

  • Ненормальное программирование
  • Разработка игр
  • Visual Basic for Applications

У нас появилось свободное время.. значит можно поиграть! В этой рубрике мы будем выкладывать простенькие игры в Excel. Да, в Excel тоже можно писать игры, ведь в нем встроен язык программирования VBA. После того как вы скачаете игру (по ссылкам ниже), необходимо будет только включить макросы (как это сделать описано тут). Во многих Ирах в Excel (в макросах) есть много интересных находок. Кто знает, может игра в Excel поможет вам не только скоротать время, но и научиться чему-то новому. Играйте в Excel и пишите игры сами!

Игра в Excel «Морской бой»:

Battleships

Игра в Excel «Змейка»:

snaked

Игра в Excel «Вертолет»:

gmexcopter

Игра в Excel «Квадрат»

Squares

Игра в Excel «Лягушка»

frog_leap

Игра в Excel «Темница»

dungeon

Если у вас есть чем поделиться — присылайте!

Спасибо за внимание.

Создание логических игр на языке VBA в среде Microsoft Excel

Содержание

Введение

§1. Жанры компьютерных игр

§2. Примеры компьютерных логических игр

§3. Создание логических игр на языке VBA

3.1 Игра «Быки и коровы»

3.2 Игра «Угадай число»

3.3 Игра «Пятнашки»

Заключение

Литература

3

4

9

10

11

15

16

21

22

Введение

Научно-технический прогресс, набравший к концу XX века головокружительную скорость, послужил причиной появления такого чуда современности как компьютер и компьютерные технологии. Вместе с появлением компьютеров появились компьютерные игры, которые сразу же нашли массу поклонников. С совершенствованием компьютеров совершенствовались и игры, привлекая всё больше и больше людей.

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

Цель данного исследования – разработать и создать логические игры на языке VBA в среде Microsoft Excel.

Объект исследования – язык VBA в среде Microsoft Excel.

Предмет исследования – программирование логических игр.

Гипотеза исследования: язык VBA является удобной средой для создания логических игр в среде Microsoft Excel.

§1. Жанры компьютерных игр

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

Известный французский ученый Луи де Броль утверждал, что все игры (даже самые простые) имеют много общего с работой ученого. В игре привлекает поставленная задача и трудность, которую можно преодолеть, а затем радость открытия и ощущение преодоленного препятствия.

Как правило, в компьютерных играх от игрока требуется:

• владение средствами управления, быстрота и точность манипуляций;

• быстрая и правильная реакция на происходящие события;

• чувство времени, умение выдерживать заданные временные интервалы;

• способность следить за несколькими объектами одновременно;

• знание географии игрового поля, законов игрового мира;

• знание конкретной предметной области, которая моделируется в игре;

• умение искать закономерности;

• умение предугадывать действия противника;

• знание алгоритма и стратегии выигрыша;

• способность к быстрому и максимально полному перебору основных вариантов;

• память на текущие события;

• использование прошлого опыта, что происходило в предыдущих сеансах игры;

• способность интенсивно работать в течение всего сеанса игры.

Компьютерные игры, как и любые другие можно разделить на несколько жанров, в зависимости от их содержания.

Аркадные

Arcade – это крытая галерея магазинов, где традиционно размещали игровые автоматы, которые назывались аркадными. Если компьютерная игра схожа по концепции с играми для автоматов – она называется «аркадой». Аркадные игры представляют собой различные виды единоборств с оружием или без него. В этих играх все сделано так, чтобы не дать игроку расслабиться ни на секунду. Он должен уметь все делать быстро, точно и расчетливо. «Аркада» всегда имеет развитую системой бонусов — это начисление очков, открываемые различные элементы и пр. В последние годы с развитием компьютерной техники появились новые направления аркадных игр: боевые единоборства, варианты компьютерных бильярдов (пинболы), трехмерные боевики (3D Action).


Адвентюрные

Приключенческие игры. Эти игры представляют собой некое путешествие, в которое предлагается вступить играющему, где ему придется решать различные задачи и препятствия. Игры построены на сюжетах сказок, мифов, литературных произведений или известных мультфильмов. Как правило, в каждом эпизоде герою необходимо добыть какой-либо полезный предмет (волшебное средство), который пригодится ему на каком-либо последующем этапе. Целью игры являются различные варианты борьбы против злых сил, выполнение королевского поручения, освобождение принцессы, освобождение от зла какого-либо города).

Ролевые

Специфика ролевых игр заключается в овладении той роли, которую вы выбрали для себя, умелом управлении ролями персонажей вашего отряда, в улучшении личностных качеств персонажей своего отряда.

Стратегические

В стратегических играх от играющего требуется не только оперативная реакция на изменение окружающей обстановки, но и долговременное планирование. В качестве принимаемой роли здесь можно почувствовать себя генералом победоносной армии, руководителем процветающего государства или вождем межзвездной империи. Стратегические игры бывают пошаговые, где игроки поочерёдно делают ходы и каждому игроку отводится неограниченное или ограниченное время на свой ход и в реальном времени, в которых все игроки выполняют свои действия одновременно и ход времени не прерывается.

Игры-симуляторы

Например, симулятор поезда — это жанр компьютерных игр, в котором игроку предоставлена возможность управления железнодорожным составом. Эти игры имеют хорошую физическую модель и неплохую графику. Симулятор свиданий — это жанр компьютерных игр, который тесно связан с романтическими аниме. Сюжет и цель в играх этого жанра — добиться успеха в романтических отношениях с противоположным полом. Игроку предоставляется для выбора большой круг лиц противоположного пола, с которыми можно завязать отношения. Гоночные симуляторы ( Need for Speed). Спортивные имитаторы — от футбола или хоккея до баскетбола и бейсбола.

Логические

Логическая игра — это игра, имеющая четко определенные правила, суть которой состоит в достижении победы путем выполнения последовательности действий, основанных лишь на логических умозаключениях игрока и не зависящая от других его способностей. Логические игры возникли в числе первых. Реализованные в пошаговом режиме, они не требовали особых аппаратных ресурсов и под них использовали даже самые слабые ПК. Ну а то, что, пока компьютер «думал» над очередным ходом, люди успевали выкурить сигарету, считалось нормой. Позже, с появлением графических мониторов, был придуман знаменитый TETRIS, ознаменовав собой возникновение игр-головоломок, или, как их еще называют за рубежом, Puzzle game.

Традиционные

Компьютерные реализации традиционных и настольных игр.

Вывод

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

§2. Примеры компьютерных логических игр

Предтечею жанра являлись настольные, графические и механические головоломки — от кроссвордов до кубика Рубика, увидевшего свет в середине 1970-х. Эти головоломки требовали от игрока логики и ловкости в решении, которые также стали играть важную роль в прототипах жанра как Q*bert, Boulder Dash и Marble Madness. Эталоном же жанра стала игра Тетрис, появившаяся в 1985 году и сочетавшая в себе простой и захватывающий игровой процесс.

В начале 1990-х годов такие игры как Lemmings и The Lost Vikings оживили жанр головоломок.

Появление трёхмерной графики поспособствовало развитию головоломок на игровых приставках. Относительно дешёвые для производства игры нашли свою нишу на портативных игровых системах.

В 2000 году игры Pikmin, Meteos, Polarium, LocoRoco и Lumines вновь возродили принципы жанра. В Японии серия игр Brain Training (развивающие логические игры) — один из наиболее крупных успехов индустрии компьютерных игр за 2005 год.

§3. Создание логических игр на языке VBA

VBA (Visual Basic for Applications — Visual Basic для приложений) — немного упрощённая реализация языка программирования Visual Basic, встроенная в линейку продуктов Microsoft Office (включая версии для Mac OS), а также во многие другие программные пакеты, такие как AutoCAD, SolidWorks, CorelDRAW, WordPerfect и ESRI ArcGIS. VBA покрывает и расширяет функциональность ранее использовавшихся специализированных макро-языков, таких как WordBasic.

К достоинствам языка можно отнести сравнительную лёгкость освоения, благодаря которой приложения могут создавать даже пользователи, не программирующие профессионально.

3.1 Игра «Быки и коровы»

Быки и коровы — логическая игра для двоих игроков. Для игры достаточно иметь бумагу, ручку и уметь считать. Также игра может называться «Цифры».

Правила игры

Играют двое. Каждый задумывает и записывает тайное 4-хзначное число с неповторяющимися цифрами. Игрок, который начинает игру по жребию, делает попытку отгадать число. Попытка — это 4-хзначное число с неповторяющимися цифрами, сообщаемое противнику. Противник сообщает в ответ, сколько цифр угадано без совпадения с их позициями в тайном числе и сколько угадано вплоть до позиции в тайном числе. Например:

Задумано тайное число «3219».

Попытка: «2310».

Результат две «коровы» (две цифры: 2 и 3 — угаданы на неверных позициях) и один «бык» (одна цифра 1 угадана вплоть до позиции).

Игроки делают попытки угадать по очереди. Побеждает тот, кто угадает первым.

Вариации игры

В упрощенном английском варианте игры Mastermind (приблизительный перевод гениальный отгадчик) задумываются цифры от 1 до 6, причём цифры могут повторяться.

В усложнённом варианте может использоваться 5-, 6- и более- значное число. В настольном варианте игры вместо чисел загадывается один из шести цветов или шести предметов.

Существует вариант игры со словами. То есть игрок загадывает слово, обычно из 5 букв (в именительном падеже единственном числе по правилам игры балда) и задача противника угадать его используя в качестве попыток такие же корректные слова из словаря русского языка. Известное слово из 4 букв для «подлавливания» новичков — «эльф»; в нём три буквы из четырёх крайне редкие, и неопытный игрок может сделать много ходов, прежде чем добьётся хотя бы «коровы».

Алгоритм

В общем случае количество вариантов для k-значного числа в N-ричной системе счисления без повторений, будет равно числу размещений

В случае варианта с повторениями количество вариантов будет равно Nk.

Большинство известных алгоритмов суть вариации алгоритма полного перебора с определённой эвристикой. В связи с тем что количество вариантов не столь велико и схема прямого перебора элементарно реализуется компьютер играет в «быки и коровы» намного сильнее человека. Чем больше знаков в числе тем больше разница в силе игры человека и компьютера.

Как показал Дональд Кнут для игры Mastermind (64 вариантов) при предложенной им стратегии нужно не более 5 попыток чтобы отгадать любую комбинацию и в среднем 4.34 попыток для отгадывания.

Существует множество вариантов компьютерной реализации. В настоящее время существует большое количество программ играющих в различные вариации в том числе и для мобильных телефонов и мобильных компьютеров.

Создадим игру Быки-Коровы на языке VBA в среде Microsoft Excel

Создадим в Microsoft Excel кнопку «Новая игра», запишем для неё следующий командный код

Option Explicit

Dim comp(1 To 4), n, com As Integer

Dim a, b, c, d As Byte

Dim ot(1 To 4), otv, bik, kor, i, j As Integer

Private Sub CommandButton1_Click()

TextBox1.Text = «»

Cells(11, 5) = «»

Randomize

Do

com = 1000 + Rnd * 8999

comp(1) = com 1000

comp(2) = (com 100) Mod 10

comp(3) = (com 10) Mod 10

comp(4) = com Mod 10

Loop Until comp(1) comp(2) And comp(1) comp(3) And comp(1) comp(4) And comp(2) comp(3) And comp(2) comp(4) And comp(3) comp(4)

n = 0

End Sub

Запись Option Explicit предусматривает, что все использованные переменные величины должны быть объявлены (описаны) перед их использованием.

Функция STR$ используется для преобразования числового значения в строковую величину.

Символ означает целочисленное деление, т.е. остаток при делении одного целого числа на другое отбрасывается. Например, 70 20 = 3.

Mod дает остаток от деления одного целого числа на другое,

Для текстового окна выберите Key Down, чтобы при нажатии клавиши Enter выполнялся программный код:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = vbKeyReturn Then

n = n + 1

otv = Val(TextBox1.Text)

If otv = com Then

MsgBox («Правильно! Число попыток = » & Str$(n))

Else

If otv = 0 Then

MsgBox («Вы сдались!»)

Else

ot(1) = otv 1000

ot(2) = (otv 100) Mod 10

ot(3) = (otv 10) Mod 10

ot(4) = otv Mod 10

For i = 1 To 4

If ot(i) = comp(i) Then

bik = bik + 1

End If

Next i

For i = 1 To 4

For j = 1 To 4

If ot(i) = comp(j) And i j Then

kor = kor + 1

End If

Next j

Next i

MsgBox («Число быков = » & Str$(bik) & » Число коров = » & Str$(kor))

End If

End If

kor = 0

bik = 0

TextBox1.Text = «»

Cells(11, 5) = n

End If

End Sub

После этого в ячейке D9 напишем текст «Введите число», а в ячейке D13 «Количество попыток» и оформим остальную часть по своему желанию, например, выбрав единый цвет заливки оставшихся ячеек и скрыв границы.

В конце концов мы должны прийти к такому результату:

Чтобы запустить игру, необходимо нажать на кнопку «Новая игра».

3.2 Игра «Угадай число»

Оформим область игры следующим образом:

Для кнопки Старт необходимо написать следующий программный код:

Dim comp As Integer

Dim n As Integer

Dim a As Integer

Private Sub CommandButton1_Click()

Randomize

comp = Fix(Rnd * 100)

n = 0

TextBox1.Text = «»

End Sub

Для текстового окна программный код выглядит так:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

a = Val(TextBox1.Text)

n = n + 1

If KeyCode = vbKeyReturn Then

If a = comp Then

MsgBox «Угадано за » & n & » раз !»

End If

If a

MsgBox «Больше

TextBox1.Text = «»

End If

If a comp Then

MsgBox «Меньше

TextBox1.Text = «»

End If

End If

End Sub

Для запуска новой игры необходимо нажать кнопку Старт.

3.3 Игра «Пятнашки»

Пятна́шки — популярная головоломка, придуманная в 1878 году Ноем Чепмэном. Представляет собой набор одинаковых квадратных костяшек с нанесёнными числами, заключённых в квадратную коробку. Длина стороны коробки в четыре раза больше длины стороны костяшек для набора из 15 элементов (и в три раза больше для набора в 8 элементов), соответственно в коробке остаётся незаполненным одно квадратное поле. Цель игры — перемещая костяшки по коробке добиться упорядочивания их по номерам, желательно сделав как можно меньше перемещений.

История создания

С 1891 года до самой смерти Сэмюэл Лойд считал, что изобрёл головоломку именно он. Однако существуют доказательства того, что он был непричастен к созданию «пятнашек». Настоящим изобретателем был Ной Палмер Чепмэн, почтмейстер из Канастоты, который ещё в 1874 году показывал друзьям головоломку, состоящую из шестнадцати пронумерованных квадратиков, которые надо было сложить в ряды по четыре штуки так, чтобы сумма чисел в каждом ряду была равна 34. Затем сын Ноя Чепмэна, Фрэнк Чепмэн привёз доработанные головоломки в Сиракузы (штат Нью-Йорк), а затем в Хартфорд (Коннектикут), где слушатели Американской школы для слабослышащих начали производство головоломки. К 1879 году она уже продавалась не только в Хартфорде, но и в Бостоне. Тогда о «пятнашках» узнал художник по дереву Маттиас Райс. В декабре 1879 года он начал бизнес по производству новой головоломки под названием «Драгоценная головоломка» (англ. Gem Puzzle). В начале 1880 года некий Чарльз Певи, дантист из Вустера, привлёк внимание общественности, предложил денежное вознаграждение за решение задачи собирания головоломки, что добавило популярности новой забаве. Весной того же года игра достигла Европы. 21 февраля 1880 года Ной Чепмэн попытался оформить патент на своё изобретение (патент назывался «Головоломка из бриллиантовых блоков», «Block Solitaire Puzzle»), однако заявка на патент была отклонена, так как мало отличалась от уже оформленного тремя годами ранее патента «Хитрые блоки», «Puzzle-Blocks».

Математическое описание

Пятнашки представляют собой классическую задачу для моделирования эвристических алгоритмов. Обычно задачу решают через количество перемещений и поиск манхеттенского расстояния между каждой костяшкой и её позицией в собранной головоломке. Для решения используются алгоритмы наподобие алгоритма A*.

Нерешаемая комбинация, предложенная Ноем Чепменом

Можно показать, что ровно половину из всех возможных 1 307 674 368 000 (=15!) начальных положений пятнашек невозможно привести к собранному виду: пусть квадратик с числом i расположен до (если считать слева направо и сверху вниз) k квадратиков с числами меньшими i. Будем считать ni = k, то есть если после костяшки с i-м числом нет чисел, меньших i, то k = 0. Также введем число e — номер ряда пустой клетки (считая с 1). Если сумма является нечётной, то решения головоломки не существует.

Для обобщённых пятнашек (с бо́льшим, чем 15, количеством костяшек) задача поиска кратчайшего решения является NP-полной.

Если допустить поворот коробки на 90 градусов, при котором изображения цифр окажутся лежащими на боку, то можно перевести неразрешимые комбинации в разрешимые (и наоборот). Таким образом, если вместо цифр на костяшки нанести точки и не фиксировать положение коробки, то неразрешимых комбинаций вообще не окажется.

Создадим программу на языке VBA. Для начала откроем Excel и запустим Visual Basic.

Создадим кнопку «Сначала», для которой напишем следующий программный код:

Private Sub CommandButton1_Click()

Randomize

For x = 0 To 3: For y = 0 To 3

Cells(y + 8, x + 6) = «»

Next y, x

For i = 1 To 15

x = Int(Rnd * 4): y = Int(Rnd * 4)

While Cells(y + 8, x + 6) «»: x = Int(Rnd * 4): y = Int(Rnd * 4): Wend

Cells(y + 8, x + 6) = i

Next i

End Sub

Эта процедура расставляет числа в случайном порядке, используя команду Rnd.

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

После процедуры CommandButton1_Click() вставляем следующий код:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

x = ActiveCell.Column: y = ActiveCell.Row

If x = 6 And x = 8 And y

If x 6 And Cells(y, x — 1) = «» Then

Cells(y, x — 1) = Cells(y, x): Cells(y, x) = «»

ElseIf x

Cells(y, x + 1) = Cells(y, x): Cells(y, x) = «»

ElseIf y 8 And Cells(y — 1, x) = «» Then

Cells(y — 1, x) = Cells(y, x): Cells(y, x) = «»

ElseIf y

Cells(y + 1, x) = Cells(y, x): Cells(y, x) = «»

End If

If test Then MsgBox («Победа!»)

End If

End Sub

Обратите внимание, что в конце имеется строчка выводящая сообщение «Победа» при выполнении условия test. Использование функции предполагает ее объявление в начале программы. Значит, следует добавить ее следующий текст в самое начало кода:

Function test()

c = 0

For x = 0 To 3: For y = 0 To 3

If Cells(y + 8, x + 6) = Cells(x + 3, x + 1) Then c = c + 1

Next y, x

If c = 16 Then test = True Else test = False

End Function

Private Sub CommandButton1_Click()

Randomize

For x = 0 To 3: For y = 0 To 3

Cells(y + 8, x + 6) = «»

Next y, x

For i = 1 To 15

x = Int(Rnd * 4): y = Int(Rnd * 4)

While Cells(y + 8, x + 6) «»: x = Int(Rnd * 4): y = Int(Rnd * 4): Wend

Cells(y + 8, x + 6) = i

Next i

End Sub

Данная функция просто сравнивает сумму столбцов и рядов игрока с той, которая должна получиться при правильной расстановке всех ячеек.

Теперь можно попробовать решить знаменитую головоломку.

Заключение

За последних шестьдесят пять лет область компьютерных игр успела не просто родиться, но и получить всемирную популярность. Компьютерные игры так прочно вошли в нашу жизнь, что теперь практически невозможно представить персональный компьютер, на котором не было бы хоть одной из них. С компьютерными играми приятно проводить время, отдыхать после трудового дня. Любители игр давно пользуются возможностью скачать игры из Интернета. Но как приятно самому создать компьютерную игру, продумать дизайн, написать программу, похвастаться перед друзьями!

В процессе выполнения исследования по теме «Создание логических игр на языке VBA в среде Microsoft Excel» была проанализирована литература и интернет-источники по данному вопросу, в среде Microsoft Excel на языке VBA написаны 3 логических игры: «Быки и коровы», «Угадай число», «Пятнашки».

В дальнейшем хотелось бы продолжить работу по созданию игр на других языках программирования.

Литература

  1. Ананьев А., Федоров А. Самоучитель Visual Basic 6.0. — С.-Петербург, Дюссельдороф, Киев, Москва, «Cbhv», 2002. -624с.

  2. Волчёнков Н.Г. Программирование на Visual Basic 6. Часть 1. — М.: «ИНФРА-М», 2000. — 288с.

  3. Информационная культура: Учебное пособие для средней школы. Часть 1/ Т.А.Матвеева, А.Г.Гейн, В.В. Мачульский, т.В.Шпота, В.И.Кадочникова, В.И.Жильцова, А.С.Щербинин — Екатеринбург: Центр «Учебная книга»; Смоленск: Издательство «Ассоциация XXI век», 2006.-392 с.

  4. Могилёв, А.В. Информатика [Текст] // А.В.Могилев, Н.И.Пак, Е.К.Хённер. -М.,ACADEMA, 2007.

  5. Моделирование простейших игр в Microsoft Excel. / «Информатика» № 20, 2005.

  6. Симонович С.В., Евсеев Г.А. Занимательный компьютер. Книга для детей, учителей и родителей. – М.: АСТ-ПРЕСС КНИГА, Инфорком-Пресс, 2002.

  7. http://www.games.ru

  8. http://images.yandex.ru/

  9. http://ru.wikipedia.org/wiki/Жанры_видеоигр

0

Like this post? Please share to your friends:
  • Создавать в excel таблицу умножения
  • Создаем графику в word
  • Создаваемый в excel документ называют
  • Создаем график работы на месяц excel
  • Соединить ячейки в excel с текстом формула