Тетрис в эксель как сделать
Все мы знакомы с Excel. Вот и я, душный банковский служащий, что-то да слышал об этом инструменте.
Одни люди умеют лишь форматировать ячейки, другие создают клоны Doom, используя встроенный в Microsoft Office язык программирования.
Я не претендую на второй тип, но и к первым себя не отношу. Для меня Visual Basic for Applications, или VBA, стал тем первым ЯП, который заинтересовал и позволил уверовать в свои силы. Путешествие в этот интересный мир началось с автоматической записи макросов и разбора созданного программой кода.
Как начинающему программисту-самоучке, мне приходилось активно шерстить интернет в поисках решения возникающих проблем. Огромное коммьюнити, большое количество тематических сайтов и, на крайний случай, справка Microsoft помогали в решении практически любой проблемы.
Однако наступил такой момент, когда все рабочие задачи оказались решены и автоматизированы, а внутреннему программисту (ха-ха) все ещё хотелось чего-то большего.
Тогда меня осенило! В Excel ведь можно делать игры. Первая же найденная статья от программиста, который в армии клепал на основе VBA разные вещи, подтвердила мою теорию.
Эта серия статей не была задумана как обучающая (ведь я сам ещё учусь), но если что-нибудь изложенное будет полезно начинающим программистам, которые только погружаются в мир Visual Basic, то считайте, что я пополнил интернет одной полезной ссылкой.
Вторая цель создания цикла заключается в самообразовании и развитии навыков. Я буду ставить себе определенную цель, а потом исполнять ее наиболее приближенной к задумке.
К тому же где, как не в комментариях, мне доходчиво и культурным языком укажут на допущенные ошибки?
Я постараюсь объяснять все подробно, но без углубления в простейшие истины. Не буду рассказывать, что такое переменные, циклы или массивы. Всю эту информацию, изложенную доступным языком, можно найти в интернете.
В этих статьях я буду описывать процесс создания игр в Excel, начиная с простейших пятнашек и заканчивая глобальной RPG. Это позволит мне больше углубиться в тему, а вам поглумиться над неумехой-программистом. Или, в лучшем случае, забрать готовое решение на работу и скрывать безделье за мнимой подготовкой отчета. Ссылки на все исходные материалы будут в свободном доступе.
Темы первых статей цикла уже определены. В этой статье я расскажу, как сделать пятнашки в Excel. В следующий раз разберу создание игры в стиле Toon Blast.
Если вам, к моему удивлению, будет интересен такой формат, то пишите в комментариях, какого типа игры вы бы хотели, чтобы я реализовал на базе Excel.
Необходимо определиться с игровым полем. В данном случае все просто. Что есть пятнашки? Диапазон размером 4 на 4 ячейки, что в сумме даёт 16 ячеек. Переименовываем первый лист (по желанию), приводим нужные ячейки к квадратной форме и декорируем, как душе угодно. Получается примерно следующее:
На этом этапе необходимо в случайном порядке расположить числа от 1 до 15, а также пустое поле на выбранном диапазоне. Для этого открываем окно редактирования кода (Alt + F11), добавляем простой модуль (при желании и его можно переименовать для красоты).
Создаем публичную переменную rngPlayField, которая будет хранить координаты нашего игрового поля, и в методе initializeField() пишем следующий код:
Public rngPlayField As Range Sub initializeField() Dim collNumbers As New Collection, countNumbers As Byte, rndNumber As Byte, fndCells As Range Set rngPlayField = Sheets("MAIN").Range("B2:E5") 'игровой диапазон For countNumbers = 1 To 16 'формируем коллекцию чисел collNumbers.Add countNumbers Next For Each fndCells In rngPlayField.Cells 'цикл для каждого элемента на игровом поле rndNumber = Application.WorksheetFunction.RandBetween(1, collNumbers.Count) 'случайное число от 1 до количества элементов в коллекции fndCells.Value = collNumbers.Item(rndNumber) 'значение ячейки = случайное число из коллекции collNumbers.Remove rndNumber 'удаляем использованное число из коллекции Next Call decorateField 'вызываем декорирование поля End SubСперва метод создаёт коллекцию чисел от 1 до 16.
Я заметил особенность, что в VBA в большинстве случаев удобнее пользоваться коллекциями элементов, чем одномерными массивами. В моей практике были и такие случаи, когда приходилось использовать коллекции массивов (возможно, из-за моей некомпетентности).
InitializeField() запускает цикл For Each, который распространяется на каждую ячейку нашего диапазона. На первом этапе цикла программа рассчитывает случайное число от 1 до значения размера нашей коллекции (в настоящий момент 16) и помещает в первую ячейку диапазона число, хранящееся в коллекции под полученным случайным индексом.
Далее цикл удаляет из коллекции использованное число и переходит к следующей ячейке.
На последующих этапах происходит то же самое, за тем исключением, что размер коллекции постепенно уменьшается, пока в ней не останется ни одного числа, а все ячейки окажутся заполненными.
UPD. Уже в процессе написания статьи я выяснил, что не все комбинации, полученные таким образом, изначально решаемы. Тогда мной в ускоренном темпе был написан код, который сперва формирует правильное поле от 1 до 16, а затем в стиле песков времени разбирает пятнашки в течении 300 ходов (что мы собственно и делаем в реальной жизни, когда хотим "рестартнуть" игру). Направление движения "костяшки" рассчитывается случайным образом.
Sub createRightField() Dim countNumbers As Byte, fndCells As Range, countMoves As Integer, byteRndDir As Byte, fndRndRange As Range countNumbers = 1 For Each fndCells In rngPlayField.Cells 'заполняем поле значениями от 1 до 16 fndCells.Value = countNumbers countNumbers = countNumbers + 1 Next While countMoves < 300 byteRndDir = 3 * Rnd() + 1 ' 1 - up, 2 - down, 3 - left, 4 - right For Each fndRndRange In rngPlayField.Cells If fndRndRange.Value = 16 Then Select Case byteRndDir 'выбор направления Case 1 If fndRndRange.Offset(-1, 0) <> "" Then fndRndRange.Value = fndRndRange.Offset(-1, 0) fndRndRange.Offset(-1, 0) = 16 countMoves = countMoves + 1 End If Case 2 If fndRndRange.Offset(1, 0) <> "" Then fndRndRange.Value = fndRndRange.Offset(1, 0) fndRndRange.Offset(1, 0) = 16 countMoves = countMoves + 1 End If Case 3 If fndRndRange.Offset(0, -1) <> "" Then fndRndRange.Value = fndRndRange.Offset(0, -1) fndRndRange.Offset(0, -1) = 16 countMoves = countMoves + 1 End If Case 4 If fndRndRange.Offset(0, 1) <> "" Then fndRndRange.Value = fndRndRange.Offset(0, 1) fndRndRange.Offset(0, 1) = 16 countMoves = countMoves + 1 End If End Select End If Next Wend Call decorateField End SubСперва создаём обработчик события нажатия на определенную ячейку. Для этого в модуле листа, на котором расположено игровое поле, формируем метод Worksheet_SelectionChange и пишем в нем следующий код. Переменная Target при этом содержит адрес выбранной ячейки.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set rngPlayField = Sheets("MAIN").Range("B2:E5") If Target.Cells.Count > 1 Then Exit Sub ElseIf Not Application.Intersect(rngPlayField, Target) Is Nothing Then 'считывает вхождение нажатой ячейки в игровое поле Call moveCells(Target) End If End SubПри выборе диапазона ячеек (больше одной), а также если выбранная ячейка не относится к игровому полю, программа завершает работу.
В ином случае запускается метод имитации движения цифр, принимающий адрес выбранной ячейки в качестве аргумента.
В основном модуле в методе moveCells(byVal rngCell as range) пишем следующее:
Sub moveCells(ByVal rngCell As Range) 'процедура нажатия на ячейку с числом Dim checkCells As Integer For checkCells = -1 To 1 Step 2 'цикл для проверки ячеек слева/справа и сверху/снизу от выбранной ячейки If rngCell.Offset(checkCells, 0).Value = 16 And Not Application.Intersect(rngPlayField, rngCell.Offset(checkCells, 0)) Is Nothing Then 'проверка сверху/снизу rngCell.Offset(checkCells, 0).Value = rngCell.Value rngCell.Value = 16 ElseIf rngCell.Offset(0, checkCells).Value = 16 And Not Application.Intersect(rngPlayField, rngCell.Offset(0, checkCells)) Is Nothing Then 'проверка слева/справа rngCell.Offset(0, checkCells).Value = rngCell.Value rngCell.Value = 16 End If Next Call decorateField ' вызываем декорирование поляЦикл проверяет, есть ли слева, справа, снизу или сверху от нажатой ячейки пустое поле (его имитирует число 16) и считывает вхождение смещенной ячейки в диапазон игрового поля. Если условия выполнены, то программа просто меняет числа местами.
Декорирование игрового поля и проверка победы в методе decorateField()Создаём в рабочей книге второй лист и размещаем на нем победный вариант. Пример:
Далее пишем следующий код:
Sub decorateField() 'декорирует и проверяет на победу Dim fndZero As Range, rngRightData As Range, countRows As Byte, countColumns As Byte, countRight As Integer Set rngRightData = Sheets("DATA").Range("A1:D4") 'диапазон с правильными значениями For countRows = 1 To 4 For countColumns = 1 To 4 If rngPlayField.Cells(countRows, countColumns) = rngRightData.Cells(countRows, countColumns) rngPlayField.Cells(countRows, countColumns) <> 16 Then 'декорирование правильной позиции With rngPlayField.Cells(countRows, countColumns) .Interior.Color = RGB(0, 150, 0) 'vbGreen показался мне слишком ярким .Font.Color = vbWhite End With countRight = countRight + 1 Else With rngPlayField.Cells(countRows, countColumns) .Interior.Color = xlNone .Font.Color = vbBlack End With End If Next Next For Each fndZero In rngPlayField 'цвет шрифта для нуля If fndZero = 16 Then fndZero.Font.Color = vbWhite End If Next If countRight = 15 Then 'проверка победы MsgBox "Победа!", vbExclamation, "Победа" End If End SubДанная программа с помощью цикла проверяет значение каждой ячейки игрового поля на соответствие аналогичной ячейке поля с победной расстановкой значений и закрашивает правильные варианты в зелёный цвет. И наоборот. Далее метод проверяет поле на наличие числа 16 (которое имитирует пустую "костяшку", не забываем) и устанавливает для шрифта белый цвет. Последний момент: проверка победы. При каждом совпадении каких-либо чисел с правильной позицией увеличивается переменная countRight, и когда ее значение станет равно 15, игра сообщит о победе.
В итоге должно получиться примерно следующее:
Вот таким нехитрым образом можно создать себе развлечение на случай скучных рабочих дней. А тем временем на ум приходит следующая картинка:
При желании в игру можно добавить подсчет ходов, рейтинговую таблицу или график динамики побед.
Сейчас же я считаю, что на этом можно остановиться.
Следующая статья выйдет When it's done. Скорее всего в течение недели.
Использование стандартных фильтров в Excel не всегда удобно и ограничено одной таблицей. Для увеличения продуктивности в Excel существуют удобные инструменты, как Временна шкала и Срез . Они позволяют быстро выбирать данные по заданным параметрам, в том числе для нескольких таблиц сразу.
Срезы можно использовать для "Умных" и Сводных таблиц, Временную шкалу только для Сводных.
Сводная таблица является по сути конструктором используя который можно быстро собрать нужные показатели по заданным критериям. Такие таблицы удобно применять для построения различных отчетов. Подробнее о Сводных таблицах смотрите статью: Сводные таблицы в Excel: как создать?
Срез представляет собой фильтр, вынесенный в отдельный графический элемент. Добавить один или несколько Срезов, для "Умной" или Сводной таблицы, можно на вкладке Анализ ► Вставить срез :
Добавление Среза на вкладке Анализ. Для появления вкладки щелкните в любом месте "Умной" или Сводной таблицы, для которой хотите создать срез. Добавление Среза на вкладке Анализ. Для появления вкладки щелкните в любом месте "Умной" или Сводной таблицы, для которой хотите создать срез.В появившемся окне выберите столбец или несколько столбцов по которым будем построен фильтр:
Либо, на закладке Вставка ► Срез .
Временная шкала
Временная шкала параметр динамического фильтра, позволяющий легко фильтровать данные по периоду времени на одном из четырех уровней годы , кварталы , месяцы или дни .
Чтобы добавить шкалу на лист, выберите на вкладке Анализ ► Вставить временную шкалу:
Добавление Временной шкалы на вкладке Анализ. Исходные данные должны содержать столбец с датами. Добавление Временной шкалы на вкладке Анализ. Исходные данные должны содержать столбец с датами.Так же можно добавить через вкладку Вставка ► Временная шкала .
В открывшемся окне установите галку на против Дата ► ОK:
Чтобы производить фильтрацию Временной шкалой:
- Нажмите на стрелку рядом с отображаемым временным уровнем и выберите нужный вариант ( год , квартал , месяц или день ):
- Перетащите полосу прокрутки временной шкалы к периоду времени, который вы хотите выбрать;
- В элементе управления отрезком времени нажмите левой кнопкой на плитку периода времени и зажав перетащите ее, будет выбран период.
Чтобы очистить Временную шкалу или Срез, нажмите на шкале в правом верхнем углу кнопку Очистить фильтр .
Как и Cрез для фильтрации данных, Временную шкалу можно добавить один раз и затем использовать в любой момент для изменения диапазона времени Сводной таблицы.
Настройка вида Временной шкалы и Среза
Временную шкалу или Срез можно переместить расположив в более удобном месте, изменить их размер или стиль.
- Чтобы переместить фигуру, просто перетащите ее в нужное место на листе.
- Чтобы изменить размер, нажмите на фигуру, затем выберите нужный размер, перетаскивая маркеры размера или задав его на вкладке Параметры .
- Чтобы изменить стиль, нажмите на фигуру, отобразится меню Инструменты временной шкалы , выберите нужный стиль на вкладке Параметры .
Ис пользование Временной шкалы и Срезов для нескольких Сводных таблиц
Если ваши Сводные таблицы имеют один источник данных, вы можете использовать одну Временную шкалу и несколько Срезов для фильтрации для нескольких таблица.
Щелкните на Временную шкалу или Срез, а затем выберите на вкладке Параметры ► Подключения к отчетам . В открывшемся окне выберите Сводные таблицы, которые вы хотите добавить:
Для использования Временной шкалы для "Умной" таблицы преобразуйте её в Сводную, на вкладке Конструктор ► Сводная таблица или Вставка ► Сводная таблица . Это очень удобно и даёт больше вариантов для маневра.
Подробнее о Временной шкале и Срезах смотрите в видео ⬇⬇⬇
Если вы уже имели какой-то опыт программирования в прошлой жизни (привет, Basic, Pascal и т.д.), то, скорее всего, уже прошли этап "игрописательства". Однако, тряхнуть стариной и размять мозги вполне можно. Если же вы никогда не программировали игр, то никогда не поздно начать этот весьма увлекательный процесс. Всё, что нам потребуется - это Excel (любой версии) и 15-20 минут времени для начала.
Тренироваться будем на известной в узких кругах программистов игре "Жизнь" (Life). Её придумал британский математик Джон Конвей еще в 1970 году на основе работ легендарного Джона фон Неймана - прадедушки всех современных компьютеров. Если вы не сталкивались с ней раньше - не проблема, правила можно объяснить за полминуты:
Игра идет на большом (иногда даже бесконечном) поле в клеточку ("вселенной"). Как вы понимаете, Excel для такого подходит идеально :)
В один момент времени каждая клетка может быть в двух состояниях - живой (обозначим её каким-нибудь значком или просто единичкой) или же мертвой (пустой). Начальное состояние всех клеток в игре называют первым поколением.
Если брать блок клеток 3х3 с текущей клеткой в середине, то вокруг неё оказывается 8 клеток-соседей. Дальнейшая судьба клетки зависит от того, сколько именно живых клеток (N) окажется в этой окружающей области. Вариантов несколько:
- Если клетка была пустая (мертвая), но у нее есть ровно 3 живых соседа, то в ней зарождается жизнь.
- Если клетка живая, но у неё меньше 2 соседей, то она умирает от одиночества.
- Если клетка живая, но у неё больше 3 соседей, то она умирает от перенаселения.
- Если клетка живая и у нее 2-3 соседа, то клетка продолжает жить.
Вот, собственно, и все правила. Можно даже сказать, что всё это неправильно называть игрой, т.к. здесь нет соперников в привычном понимании. Вы расставляете первое поколение, запускаете процесс и затем просто наблюдаете за развитием вашей "колонии" на протяжении нескольких поколений.
Однако, не стоит недооценивать обманчивую простоту этой логики - количество комбинаций, сценариев игры и многообразие фигур в такой игровой вселенной поражает своим разнообразием и поистине бесконечно. В математике подобные модели называют клеточными автоматами. А самое интересное, что реализовать подобную модель можно в любой версии Excel буквально на 20 строчках кода.
Шаг 1. Готовим игровое пространство
Создадим в новой книге три листа:
- game - это будет основной листы игры, где мы будем наблюдать за развитием нашей "колонии"
- next - этот лист будет формировать следующее поколение, которое затем придет на смену текущему
- start - на этом листе мы будем задавать начальную конфигурацию, т.е. первое поколение в нашей игре
На листе start разметим с помощью единичек первое поколение любым желаемым образом:
Шаг 2. Пишем макрос
Теперь пришла пора расчехлить наш VBA и написать макрос, который и будет делать всю работу, а именно:
- Копировать первое поколение с листа start на лист game.
- Проходить по ячейкам игрового поля на листе game и проверять окружающих соседей (блок 3х3) для каждой из них.
- В зависимости от результатов проверки помечать на листе следующего поколения next ту же ячейку как живую (1) или мертвую (пусто).
- Копировать получившееся новое поколение с листа next вместо текущего на листы игры game.
- Повторять пункты 2-4 несколько раз, сменяя одно поколение другим и отображая на экране изменения в нашей "колонии".
Для начала откроем редактор Visual Basic на вкладке Разработчик (Developer) . Если такой вкладки не видно, то её нужно будет сначала отобразить через Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) , включив соответствующий флажок.
В открывшемся окне редактора создадим новый модуль с помощью команды меню Insert - Module, а затем скопируем и вставим туда код нашего макроса:
Теперь давайте разберем его построчно для понятности:
Поскольку в коде нам придется несколько раз ссылаться и много раз работать с диапазонами игрового пространства (B2:AE31) на каждом из трёх листов книги, то имеет смысл сразу оформить их как переменные. Это делается в блоке:
Заодно мы создаем ещё и переменную wNext, которая ссылается на весь лист next целиком - это нам тоже пригодится в будущем:
Затем, перед началом игры, мы должны перенести первое поколение с листа start на лист game. Это выполяется командой прямого копирования с использованием уже созданных переменных:
Поскольку мы хотим прокрутить в нашей игре не одно, а несколько (например, 50 для начала) поколений, то дальнейшие действия заключены в цикл:
А внутри этого цикла мы, во-первых, сначала очищаем рабочее пространство на листе next для формирования следующего поколения:
А, во-вторых, запускаем вложенный цикл прохода по всем ячейкам игровой вселенной на листе game, чтобы проверить каждую из них - это реализовано циклом прохода по коллекции:
Ссылка на очередную проверяемую ячейку будет храниться в переменной cell. Для этой ячейки нам нужно сначала построить окрестность 3х3 с ней в середине. Это выполняется с помощью конструкции:
Здесь метод Offset(-1,-1) виртуально сдвигает текущую проверяемую ячейку на одну строку вверх и на один столбец влево, а потом метод Resize(3,3) опять же виртуально растягивает эту одну ячейку до новых размеров 3 на 3:
Чтобы посчитать количество заполненных ячеек в полученной окрестности применяется функция рабочего листа СЧЁТЗ (COUNTA) , которую в VBA можно вызвать с помощью объекта WorksheetFunction . Таким образом количество живых соседей в окружающей текущую ячейку области 3 на 3 мы получаем выражением (не забыв вычесть из полученного количества текущую ячейку):
Дальше нам нужно проверить полученное количество соседей и пометить на листе следующего поколения текущую ячейку как живую или мертвую, согласно правилам игры. Это выполняет блок из трёх проверок:
Когда цикл прохода по ячейкам будет завершен, то сформированное следующее поколение с листа next нужно скопировать на место текущего на листе game - делаем это уже знакомой конструкцией:
Вот, собственно, и вся логика.
Осталось вернуться в Excel на лист game, запустить нашу игру через вкладку Разработчик - Макросы (Developer - Macro) и насладиться процессом развития нашей колонии:
Программа Microsoft Excel может пригодиться во многих ситуациях. Формулы, функции, справочники и учебные пособия, обработка бизнес-информации — всё это может делать Excel. Однако, что если вы хотите просто расслабиться? Excel может помочь и в этом.
В этой статье мы рассмотрим 8 игр, которые запускаются в Microsoft Excel.
Однопользовательская головоломка популярна на Android и iOS. Данная игра создана на основе предыдущих, таких как Threes и 1024. Всего за одну неделю её создал 19-летний Габриэль Сирулли. Не желая зарабатывать на том, что он не изобретал, Сирулли загрузил бесплатные версии игры 2048 на Android и iOS.
Есть версия игры для Excel, позволяющая играть в таблицах. Предлагается режим просмотра 2D и 3D, звуковые эффекты, отслеживание движений и история, некоторые другие трюки.
2048 Stealth Mode в Excel
Если нежелательно, чтобы на работе вас увидели играющим, можно запустить незаметную версию с продвинутым механизмом сокрытия. Со стороны будет казаться, что вы работаете с таблицами.
Scrabble
Продолжая разговор о головоломках, поговорим о Scrabble. Tom_Jobim с Reddit создал игру, которая открывает отдельное окно в Excel, так что она не совсем в таблице. Применяется язык VBA.
Реализация игры на высоком уровне. Вы противостоите искусственному интеллекту с различными уровнями навыка, от 1 до 100. Имеется инструмент анаграмм, встроенный словарь, разные тематические планы, таймеры и многое другое.
Arena.Xlsm
Не хотите головоломки? Arena.Xlsm даст вам возможность противостоять более 2000 потенциальных противников с искусственным интеллектом. Когда они появляются на экране, вы должны сразить их.
Имеется 8 боссов, 12 запрограммированных боевых арен, более 30 заклинаний, 20 уникальных предметов и даже системы достижений.
Arena.Xlsm также доступна на Itch.io, если вы предпочитаете отслеживать игры на определённых платформах.
Candy Crunch Number Saga
Candy Number Crunch Saga предлагает более 35 новостных событий, которые влияют на стоимость акций. Отображается курс акций в реальном времени. Игра стала результатом четырёх дней работы канадского бухгалтера Кари Уолкина. Он же является автором Arena.Xlsm. Игра также доступна на Itch.io.
Championship Manager For Microsoft Excel
Одна из наиболее сильно вызывающих привыкание игр есть и на Excel. Это неудивительно, поскольку серия футбольных менеджеров больше других игр похожа на таблицы.
Читайте также: