Как составить свою игру таблицу

image

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

Зачем это надо

Допустим, вы проводите игру, в которой участвует одновременно 50-60 человек. У каждого игрока есть набор личных параметров (например, опыт, деньги, здоровье, репутация), которые меняются в зависимости от совершенных им действий. Также есть ряд общеигровых показателей (например, экология, бюджет страны или рейтинг правительства), которые также колеблются в соответствии с действиями и решениями игроков. А еще есть игровые события, которые происходят при определенной комбинации внешних факторов.

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

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

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

Денежный поток

Все началось с игры «Денежный поток». Знакомые пригласили меня поиграть в знаменитую настолку Роберта Кийосаки, и она меня очень зацепила. Единственное, что раздражало в игре, — это необходимость постоянно производить расчеты в столбик, стирать ластиком устаревшие данные и вносить новые. Из-за того, что все участники, боясь ошибиться, были постоянно сконцентрированы на собственных расчетах, игра сильно теряла в динамике и затягивалась на долгие часы.

Я решил оптимизировать игровой процесс, переведя все калькуляции в Гугл-таблицу.

image

Чтобы протестировать этот «калькулятор», я провел несколько игр для друзей. Эффект был потрясающий! Вместо того, чтобы корпеть над вычислениями, игроки активно вовлекались в игровой процесс, вели переговоры, придумывали сложные финансовые схемы и махинации. Скорость самой игры возросла почти в два раза. Нам впервые удалось довести ее до конца, когда все игроки покинули дорожку крысиных бегов и достигли своих целей. Для сравнения, в «ручной» версии участникам едва хватало терпения доиграть до того момента, когда хотя бы кому-то одному удавалось выйти на большой круг.

«Офигеть! — воскликнул мой товарищ Рубен во время одной из игр. — Восемь взрослых мужиков собрались, чтобы весь вечер пялиться на экран с гугл-табличкой. Но это реально интереснее любого кино!»

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

Зомби, президенты и ассасины

Немного позже я наткнулся на сценарий кабинетной ролевой игры «All The President’s Zombies» американского геймдизайнера Майка Янга. По сюжету, в стране происходит зомби-апокалипсис, и группа высших чиновников собирается в кабинете президента, чтобы выработать план по решению этой проблемы.

image

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

image

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

Проведя пару десятков «Экстренных совещаний» для друзей и знакомых, я понял, что это перспективный формат для всякого рода тимбилдингов и корпоративных историй. Мешало только ограничение на максимальное число участников в 12 человек. И я стал придумывать новые игры, в которые можно было бы играть большим коллективом. При этом управлять игровой экосистемой должен был по-прежнему один ведущий. Так появились игры «Чумовая Венеция» по мотивам франшизы Assassin’s Creed, «Мировое господство» о противостоянии сверхдержав на мировой арене, «День выборов» о честных и не очень политических технологиях и еще несколько игр, решающих специфические задачи конкретных заказчиков.

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

Проблема — решение

В основе любого игрового движка лежит следующая последовательность действий: 1) сбор информации о решениях, принятых игроками, 2) ввод этой информации в систему, 3) проверка условий и вычисление системой новых данных, 4) выдача игрокам новых данных. В зависимости от сюжета игры, этот цикл может повторяться от одного до условно бесконечного числа раз. При этом вся коммуникация игроков, предшествующая принятию окончательных решений, остается «за кадром», и игровой системой никак не учитывается. Так что в целом процесс не производит ощущения компьютерной игры, оставляя простор для живого эмоционального взаимодействия.

Эмуляция циклов

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

Допустим, отсутствующие кнопки можно заменить ячейкой со значением «чекбокс» — в какой-то отдельной ячейке тогда будет формула, проверяющая состояние чекбокса и вычисляющая в зависимости от этого значение целевой ячейки. Но как быть с тем фактом, что вся таблица статична во времени, и при изменении значения одной ячейки-переменной моментально и «без спроса» пересчитываются значения всех других ячеек, ссылающихся на нее в формуле? Я не придумал ничего лучше, чем компенсировать отсутствие подпрограмм и циклов при помощи вкладок. Вы просто создаете в таблице столько вкладок, сколько циклов предполагается в игре и сколько раз за игру теоретически одна переменная может поменять свое значение. Тогда, например, ячейка во вкладке-2 будет наследовать значение той же ячейки во вкладке-1, претерпевать какие-то изменения и передавать свое значение в ту же ячейку из вкладки-3. Вот, например, как выглядят вкладки циклов в игре «Мировое господство».

image

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

2019-05-12-17-27-39-Google-Docs-Google-Chrome

Здесь E41 — это сумма в бюджете на начало года, X44 — сумма изменений в бюджете в течение года.

Или вот формула, которая выводит в ячейку на планшет игрока данные об экономическом состоянии города в зависимости от того, какой сейчас год на дворе. В зависимости от значения ячейки «счетчик лет» $F$1 выводятся значения одной и той же ячейки E36, но из разных вкладок, соответствующих тому или иному году.

2019-05-12-17-28-08-Google-Docs-Google-Chrome

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

Распределение ролей

Иногда перед началом игры хочется мудро распределить роли, чтобы, например, наиболее активные персонажи достались более общительным игрокам, а роли с двойным дном — тем участникам, которые умеют блефовать и сдерживать эмоции. В игре «Экстренное совещание» эта задача тоже автоматизирована. Перед началом игры участники получают ссылку на анкету в формате Google Forms, где они отвечают на несколько вопросов о своих игровых предпочтениях.

image

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

image

Сбор данных у игроков

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

Хорошим решением оказался сбор у игроков данных посредством анкет и карточек. Например, в «Чумовой Венеции» игроки в течение всей игры сдают ведущему заполненные карточки с формулировками типа «Паоло Алигьери подослал убийц к Джакомо Сфорца» или «Леонардо Бертолуччи соблазнил Лукрецию Медичи», а ведущему остается только ставить галочки в таблице на пересечении соответствующих имен и фамилий.

image

А в игре «День Выборов» команды старшеклассников сдают после каждого игрового цикла заполненные анкеты вот такого формата.

image

Данные в такой анкете максимально упорядочены, и ведущему требуется не больше 5 секунд, чтобы вбить их в таблицу.

image

Отстройка баланса

В ролевых играх важен игровой баланс: ресурсы всегда должны быть в легком дефиците, а различные инструменты по достижению целей примерно одинаково эффективными. Отстраивать баланс можно только вручную и только опытным путем, проводя серию тестовых игр. Чтобы не сойти с ума, меняя туда-сюда параметры в каждой формуле и в каждой ячейке, очень удобным решением является отдельная вкладка-справочник, где выведены все настраиваемые параметры, а формулы всей остальной таблицы ссылаются на них. При помощи справочника также можно, например, одним переключением чекбокса менять язык игры. Такая функция реализована в игре «Мировое господство».

image

Ввод данных в систему

Чтобы игра не провисала, ведущий должен иметь возможность вводить в таблицу данные максимально оперативно и эргономично. В гугл-таблицах можно настраивать формат ввода данных (dada validation). Самый быстрый и удобный формат — чекбокс. Правда, не все формулы умеют работать со значениями TRUE и FALSE. Поэтому значения чекбокса лучше сразу перевести в ноль или единицу в какой-нибудь соседней технической ячейке, а дальше уже с этими нулем и единицей делать все что угодно.

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

Вот пример полей для ввода данных в игре «Мировое господство».

image

Индикация событий

Ведущему важно вовремя замечать игровые события и реагировать на них. Так, в «Экстренном совещании» нужно вовремя замечать изменения в ячейках с номерами карточек, которые нужно выдать игрокам. А в «Мировом господстве» нужно вовремя сообщить игрокам, что город подвергся ядерному удару. Чтобы ведущий ничего не прозевал, можно использовать свойство ячейки conditional formatting (условное форматирование) — с ее помощью можно, например, сделать так, что при появлении текста «город уничтожен» ячейка самостоятельно красилась в красный цвет. В поле зрения ведущего окажется яркое красное пятно, которое невозможно не заметить.

image

Индивидуальная информация

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

Кстати, Google Sheets предусматривает возможность экспортировать данные из таблицы в веб-интерфейс, так что при желании вместо сухой таблицы игрокам на планшеты можно выводить данные в виде красиво сверстанной и анимированной инфографики.

Аккуратные графики

В игре иногда вместо цифр хочется вывести на экран график, но стандартные диаграммы раздражают своей избыточностью. А еще тем, что они не умеют прилипать к ячейкам и всегда выглядят очень неаккуратно. К счастью, в гугл таблицах есть функция SPARKLINE. Эта функция отображает мини-график внутри ячейки. Он имеет определенные настройки, и его можно использовать для лаконичной визуализации некоторых данных.

image

Игровые новости

Иногда требуется не просто вывести цифру в ячейке, но и сформулировать мысль в виде грамотно выстроенного предложения (например, в разделе «Последние новости»). В этом случае на выручку приходит функция CONCATENATE, которая умеет склеивать куски текста с цифровыми значениями из разных ячеек. Вот как выглядит формула с использованием этой функции.

2019-05-12-17-28-33-Google-Docs-Google-Chrome

Подведение итогов

В «Мировом господстве» и «Чумовой Венеции» в финале игры объявляют не только главного победителя, но и команды, отличившиеся в различных номинациях. Для подведения итогов очень удобно использовать функцию MAX, которая вычисляет максимальное число в диапазоне. Ведущему ничего не надо дополнительно делать — достаточно просто прочитать с экрана названия победивших команд.

image

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

Благодаря современным технологиям вы буквально за 10-20 минут можете создать викторину наподобие «Своей игры» и сыграть в нее с друзьями. В этой статье мы расскажем, как сделать такую викторину в PowerPoint. Начинайте придумывать вопросы!

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

Итак, приступим!

Этап 1: Создаем игровое поле

  1. Откройте PowerPoint и создайте новую презентацию.
  2. На вкладке Дизайн выберите и примените понравившуюся тему оформления.
  3. Создайте новый слайд и добавьте на него таблицу (ВставкаТаблица).

Вставка таблицы в PowerPoint

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

Таблица

  1. Измените цвет игрового поля, чтобы оно еще больше походило на оригинальное поле из «Своей игры». Для этого выделите таблицу и нажмите Заливка на панели инструментов в разделе Стили таблиц.

Заливка

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

Игровое поле

В каждую ячейку вставлена гиперссылка, которая ведет на соответствующий вопрос.

Разбираемся с макетами слайдов

У каждого слайда в PowerPoint есть свой макет. Например, Титульный слайд или Заголовок и объект.

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

Образец слайдов

Вы также можете редактировать и создавать новые макеты слайдов при помощи инструмента Образец cлайдов (Slide Master).

Работа с макетами и использование режима Образец cлайдов очень важны при создании подобной викторины, ведь она состоит из большого числа похожих слайдов.

В основном у вас будут слайды двух типов:

  • Слайд с вопросом. На нем будет размещен текст вопроса и кнопка Узнать ответ для проверки правильности ответа игрока.

Слайд с вопросом

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

Слайд с ответом

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

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

Этап 2: Создаем макеты слайдов для вопросов и ответов

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

Если вы хотите самостоятельно создать макеты, выполните следующие шаги:

  1. Перейдите на вкладку Вид и выберите Образец слайдов.
  2. Нажмите Вставить макет.

макет

  1. Кликните по макету правой кнопкой мышки и нажмите «Переименовать».

Переименовать макет

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

Управляющие кнопки

  1. В Настройке действия выберите Перейтина по гиперссылке: следующий слайд и нажмите ОК.

Настройка действия

  1. Кликните правой кнопкой мышки по кнопке, нажмите Изменить текст и напишите слово «Ответ» (или «Узнать ответ» — как больше нравится).

Ответ

  1. По аналогии со слайдом с вопросом создайте слайд с ответом. Правой кнопкой мышки кликните по левой панели с образцами слайдов и нажмите Вставить макет. Назовите новый макет «Правильный ответ».
  2. Добавьте кнопку Домой и вставьте гиперссылку, которая будет вести на слайд с игровым полем. В нашем случае это Слайд 2.

Домой

  1. Выйдите из режима Образец слайдов, нажав кнопку Закрыть режим образца на верхней панели инструментов, или перейдите во вкладку Вид и выберите Обычный режим просмотра.

закрыть-образец

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

Итак, у нас уже есть титульный слайд и слайд с игровым полем. Кроме того, мы сделали макеты слайдов для вопросов и ответов.

  1. Создайте третий слайд. Кликните правой кнопкой мышки и выберите ранее созданный макет Вопрос.
  2. Создайте четвертый слайд. Кликните правой кнопкой мышки и выберите ранее созданный макет Правильный ответ. У вас должно получиться так:

Слайд с вопросом

  1. У вас получилась пара вопрос-ответ. Продублируйте слайды 3 и 4 столько раз, сколько активных клеток на игровом поле. В нашем примере поле состоит из 20 клеток. Итоговое количество слайдов вместе с первыми двумя будет равняться 42.

Примечание: Рекомендуем на слайдах с вопросами вместо самих вопросов сперва написать черновые обозначение (например, Категория 1, Вопрос на 200). Так вам будет проще расставить гиперссылки.

Соедините клетки игрового поля с соответствующими слайдами:

  1. Выделите цифры в клетке игрового поля, кликните правой кнопкой мышки и выберите Гиперссылка (или нажмите Ctrl+K).

Гиперссылка

  1. В открывшемся окне в левой панели выберите Место в документе и укажите нужный слайд (например, Категория 1, Вопрос на 200).
  2. Нажмите ОК, чтобы вставить гиперссылку.

Вставка гиперссылки

Ограничиваем навигацию

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

по-щелчку

Этап 4: Добавляем интерактивные вопросы

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

Добавляем изображения к вопросам

Просто перетащите любую картинку в презентацию из папки на вашем компьютере. Лучше всего использовать изображения в формате PNG с прозрачным фоном.

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

Вопрос с изображением

Вы можете добавлять разные эффекты, например, тень, отражение или подсветку. Выберите вкладку Формат и нажмите Формат рисунка. При желании можно добавить анимацию.

Правильный ответ: Он чувствует себя не в своей тарелке

Загружаем музыку и настраиваем автопроигрывание

Перетащите аудиофайл на слайд или нажмите Вставить → Аудио.

Аудиовопрос

Кликните на иконку аудиофайла и перейдите во вкладку Воспроизведение. Установите Начало: автоматически.

Звук автоматически

Мы рекомендуем использовать аудиофайлы длиной 15 секунд или меньше. Кстати, Musopen.org — отличный сайт, где можно легально и бесплатно скачать музыку.

Правильный ответ: Соловей

Добавляем видеовопросы

Перетащите видео на слайд с вопросом или перейдите во вкладку Вставка и нажмите Видео.

Скриншот из викторины Своя игра

По аналогии с аудиофайлом, перейдите во вкладку Воспроизведение и установите Начало: автоматически.

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

Правильный ответ: Итальянский

Другие улучшения

Вот несколько советов, как еще улучшить вашу игру:

  • Добавьте эффекты перехода для слайдов с вопросами («Выцветание» или «Увеличение»), используя режим Образец слайдов.
  • Добавьте эффект «Перелистывание» на слайды с ответами, чтобы они выглядели так, будто вы переворачиваете карточку.
  • Добавьте триггеры, чтобы скрыть клетки с отвеченными вопросами (вы увидите их в образце презентации, который прилагается к этой статье. В веб-презентации в формате HTML5 их не будет видно).
  • Добавьте аудиотриггеры на слайды с вопросами. Например, звуки победы или поражения. Используйте эти звуки во время игры, чтобы было веселее.
  • Добавьте второй тур викторины и финал и вставьте ссылки на них на слайд с игровым полем первого тура.

Протестируйте получившуюся игру

Убедитесь, что все ссылки и эффекты работают корректно. Запустите презентацию, нажав F5оказ слайдовС начала), и просмотрите игру целиком. Проверьте каждую гиперссылку на игровом поле и удостоверьтесь, что они ведут на правильные вопросы.

Выложите игру в интернет

С помощью iSpring Converter Pro вы можете опубликовать свою викторину в интернет всего за один клик в виде веб-файла, как в этой статье.

А если вы хотите поделиться игрой через ссылку или вставить код в ваш блог или веб-сайт (как в этой статье), очень удобно использовать облачный сервис iSpring Cloud. Ваша викторина будет доступна для просмотра на любых устройствах, даже если у получателей нет PowerPoint.

Не забудьте проверить ее работоспособность после публикации.

Сыграйте в свою игру

А теперь самое интересное! После того как вы создали игру и разместили ее в интернете, пришло время пригласить друзей и сыграть! Вам понадобится два или более игроков, лист бумаги и карандаш для записи счета.

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

Правила игры просты:

  • Первый игрок выбирает категорию и сложность вопроса. Например, Президенты США, 300.
  • Ведущий кликает на выбранную клетку игрового поля и зачитывает вопрос вслух. Например: «Медвежонок Тедди был изобретен после того, как этот американский президент отказался на охоте застрелить медведя, привязанного к дереву».
  • После того как ведущий прочитает вопрос, любой из участников может хлопнуть в ладоши, чтобы ответить. Например, предположить, что это был Теодор Рузвельт.
  • Если ответ верный, игрок получает количество очков, полагающееся за этот вопрос, и может выбрать следующий.
  • Если ответ неверный, игрок получает штрафные очки, при этом другой игрок может попытаться ответить на вопрос.
  • После того как все вопросы на игровом поле будут отвечены, начинается подсчет очков. Игрок с наибольшим количеством очков побеждает.

Посмотрите, какая игра получилась у нас:

Викторина Своя игра

Чтобы узнать больше об официальных правилах игры, прочитайте официальную страничку оригинальной игры Jeopardy! на Википедии, а также страничку о «Своей Игре».

В «Свою игру» можно играть где угодно: хоть в садике, хоть в офисе. Цель викторины — не только проверить знания и скорость реакции, но и разрядить обстановку и сблизить участников.

Если у вас возникли трудности с составлением вопросов, посмотрите записи прошедших телевизионных игр.

Скачайте готовый шаблон

Скачайте готовый шаблон викторины «Своя игра» от iSpring.
Если вам нужна помощь с созданием викторины в PowerPoint — дайте знать специалистам поддержки iSpring. 

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

Если вы уже имели какой-то опыт программирования в прошлой жизни (привет, 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

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

На сегодняшний день самым мощным орудием труда в моих руках, бесспорно, является MS Excel.

Ни незаменимый в быту Фотошоп, ни обожаемый мной Индизайн, ни бестолковый Уанноут, ни Вассал с Кибебордом не решают настолько широкий спектр задач быстро, просто и эффективно. Сегодня я поделюсь ужасно примитивными способами прототипирования настолок на коленке, некрасиво, наспех и, признаться, кривовато… одним словом, оптимально для ленивых рационально мыслящих хоумрулеров и геймдизайнеров. Перечисленные ниже фокусы экономят мне кучу времени и сил – надеюсь, и вам пригодятся.

Задачи на стадии раннего прототипирования

Начнем с того, зачем мы вообще садимся за бумагу с карандашами. Мы хотим:

1. Зафиксировать идеи

Необходимо сделать наброски правил, пока они не забылись, как-нибудь пометить спорные места, набросать todo-лист, отвести место под свалку потенциально полезных мыслей.

2. Организовать контент

Характеристики юнитов, текст карт, набор тайлов, игровое поле – это всё сюда.

3. Сделать что-то играбельное

Собственно, мы хотим получить сам прототип, над которым можно будет ставить опыты.

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

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

Организация контента

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

Перед тем, как делать карты, выделите под таблицу с ними новый лист. Номер, название, цена, эффект, что там ещё? Сразу же наводит на размышления о том, какая информация будет содержаться на карте. С юнитами – то же самое. Каждый солдат – одна (часто довольно длинная) строка в таблице. Плоды обстоятельности можно начинать пожинать сразу же.

Во-первых, можно фильтровать таблицу по значениям.

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

Например, начиная с Excel 2007 появилась возможность строить быстрые мини-гистограммы для сравнения всяких значений (нормальные графики нам, как людям сугубо рациональным, делать всё как-то лень и недосуг). Два клика – и сразу же видим, чего у нас много, а чего – не хватает.

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

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

В-четвертых, можно встроить простенький авто-баланс. Проследите за своим обычным ходом мыслей при создании нового юнита. “…Так, ну этого мы сделаем посильнее, но тогда он должен и двигаться помедленней. Броня. Броня? Ну, толстая, ясное дело. И жизней добавим. Цена на такого должна быть серьезная. Дорогой, значится. А, еще дальнобойность. Дальнобойный он будет, да. Уязвим к огню. Или к холоду? А пускай к тому и другому…”

Как правило, полезность всех юнитов должна быть примерно одинаковая – она складывается из их достоинств и из неё вычитаются недостатки. Ну а если вы хотите сделать явно более сильного юнита (для верхушки дерева технологий, например) – то надо убедиться, что он действительно полезней других, и плюсов у него значительно больше, чем минусов. По сути мы подсознательно пользуемся чем-то вроде пойнтового конструктора – так почему бы не сделать его явным?

Отведите ячейку для подсчёта сравнительной “крутости” юнита (или карты, или тайла, или роли, что там у вас) – суммируйте в ней все его параметры. Понятное дело, придётся домножить их на весовые коэффициенты (10 HP – не то же, что 10 патронов или скорость 10 клеток за ход), плюс оценивать “крутость” специальных способностей надо будет каждый раз вручную.

Лично я вначале определяю среднее значение каждого параметра и принимаю его за ноль (без этого всё равно никак: в любой игре нужен эталонный средний солдат, даже если из самой игры он будет впоследствии исключён), затем масштабирую все параметры типа скорости, повреждений и цены так, чтобы любое значение оценивалось от -3 (юнит с таким значением будет гораздо хуже среднего) до +3 (юнит с таким значением гораздо полезней среднего). Потом всё это суммируется, и в идеале для каждого юнита должен получиться ноль.

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

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

Первый прототип

Рабочий прототип надо делать как можно раньше – это мы прекрасно знаем. С другой стороны, сугубо рациональным людям карты печатать и вырезать и так лень, а печатать и вырезать карты, зная, что после этой партии бОльшую их часть придётся переделывать – и вовсе мазохизм. То же касается поля, юнитов и всего прочего – проверить в работе это надо, но всё ещё слишком неопределенное, неоформленное, и на бумаге фиксировать всё это как-то не охота. К счастью, в Экселе игру можно не только разработать, но сразу же и обкатать.

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

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

Сами карты можно “вытягивать” из колоды функцией ВПР, возвращающей значение указанной строки и столбца таблицы (справка по). Делаем номер строки случайным, копипастим, получаем целую рандомную руку (вообще-то такой подход не убирает из колоды уже вытянутые карты, но мы же тут вроде как время экономить собрались).

Первые партии лучше отыграть прямо в Экселе (лишние мониторы и ноутбуки на этом этапе придутся весьма кстати), ну а когда придёт время печати – компоненты вроде карт проще всего опять же Экселю и поручить. Размечаем место под лист с картами (влезет 9 карт, если они у вас стандартного мтг-шного формата, на всякий случай измерьте линейкой точные размеры), на каждой карте ставим её номер, а потом тем же ВПРвытаскиваем из таблицы все нужные нам значения в нужных местах карты. Название выводим наверху по центру, цену – в уголке, эффект – в окошечке посередине. Меняем номер на каждой карте, при необходимости размножаем лист. Вуаля – всё готово для печати, а главное, если что-то понадобится исправить, менять значения надо будет только в самой таблице, а на картах изменения отразятся автоматически. Не очень симпатично, конечно, зато минимум ручной работы.

Кстати, не забывайте, что не обязательно печатать сразу всё: можно перелезть на бумажное поле, а вытягивалку карт оставить цифровой (особенно если у каждого тестера есть свой ноутбук или планшет).

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

Своими собственными хитростями делимся в камментах.

Перейдем к следующему примеру — необходимо разработать несложную игру. На рабочем листе (рис. 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. Один из сценариев развития игры

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти размах набора в статистике
  • Как найти количество диагоналей правильного многоугольника
  • Отоневролог как найти в воронеже
  • Как исправить социофобию
  • Северная звезда как ее найти на небеса

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии