До сих пор мы концентрировались в основном на функциональных аспектах электронных таблиц. Если и обращали внимание на эстетические элементы, то это делалось главным образом для упрощения работы с таблицей. В общем, мы подходили к изучению электронных таблиц так, как если бы они представляли собой язык программирования, рассматривая каждую ячейку как переменную, а каждую формулу — как код.
Однако программный код очень редко выполняет функцию внешнего фасада программы, в то время как электронные таблицы часто представляют собой не только код, но и пользовательский интерфейс. По завершении работы над электронной таблицей геймдизайнеры не компилируют ее в какой-либо исполняемый файл, а сразу же передают другим людям, которые затем работают с этой таблицей в непосредственном виде. В силу этого надлежащее форматирование электронных таблиц может служить той же цели, что и применение единообразного стиля кодирования, с тем отличием, что при создании электронной таблицы вам доступно гораздо больше средств форматирования.
Следовательно, правильное и единообразное форматирование не только придает красивый вид электронной таблице, но и имеет практический смысл, облегчая навигацию и поиск нужных данных и снижая вероятность внесения ошибок при изменении содержимого таблицы. Электронные таблицы служат не только для сохранения данных и вычисления формул, но и для донесения результатов этих вычислений до вас или других членов вашей команды, поэтому умение представлять данные электронных таблиц в ясном и доходчивом виде играет важную роль и может избавить вас от множества лишних усилий и проблем.
Иногда электронная таблица содержит множество отдельных взаимосвязанных элементов, которые лучше разместить в разных областях. Если речь идет о довольно сложной таблице, расположение всех таких данных в отдельных областях на одном листе будет выглядеть несколько громоздко и усложнит навигацию. Например, если параметры персонажа будут находиться в ячейках A1:E10, список оружия — в J1:L30, доспехи — в N1:P30, аксессуары — в R1:T30, данные кривой опыта/уровня — в A15:B55 и таблицы подстановки вторичных параметров — в F40:M80, то вся эта информация будет играть важную роль, но у вас возникнут проблемы с ее просмотром и согласованным расположением на одном листе. Конечно, вы могли бы упростить ситуацию, скрыв часть столбцов и строк, но, как упоминалось в предыдущей главе, когда вы скрываете данные, часто сложно понять, что именно скрыто и скрыто ли что-нибудь вообще. Более эффективный подход сводится к тому, чтобы использовать в одном документе несколько рабочих листов.
Как показано на рис. 33.1, в левом нижнем углу рабочего листа можно увидеть следующие три элемента: знак плюс, значок с тремя линиями и ярлык вкладки с надписью по умолчанию Sheet1 (Лист 1).

Рис. 33.1
Дважды щелкнув на надписи Sheet1 (Лист 1), вы сможете выделить ее и заменить более осмысленным названием. То же самое можно сделать, выбрав команду Rename (Переименовать) в меню рабочего листа, которое можно открыть, щелкнув на направленной вниз стрелке на ярлыке рабочего листа.
Щелкнув на знаке плюс, можно добавить новый лист. Вы можете добавить любое количество листов, при этом каждый из них обычно служит для отдельной цели. Перейти к другому рабочему листу можно, щелкнув на его ярлыке внизу или выбрав нужный рабочий лист из списка, который открывается щелчком на значке с тремя горизонтальными линиями. Также можно перейти к следующему или предыдущему листу в списке, нажав клавишу PgUp или PgDn и удерживая при этом клавиши Ctrl и Shift. Если вам нужно изменить порядок рабочих листов для облегчения такой навигации, это можно сделать, просто щелкая на ярлыках листов и перетаскивая их влево или вправо (рис. 33.2).

Рис. 33.2
Вы можете спросить, зачем создавать несколько рабочих листов (то есть отдельных вкладок) в одной электронной таблице (то есть в документе, содержащем один или несколько рабочих листов), если можно просто создать несколько электронных таблиц? Если рабочие листы абсолютно независимы друг от друга, эти данные, возможно, действительно лучше разместить в разных электронных таблицах, но если вам нужно, чтобы ячейки одного рабочего листа ссылались на ячейки другого, то это гораздо проще сделать в одной электронной таблице, не пытаясь ссылаться из одного файла электронных таблиц на другой, совершенно отдельный документ.
Чтобы сослаться на ячейку, расположенную на другом рабочем листе той же таблицы, следует сначала записать имя рабочего листа, поставить после него восклицательный знак, а затем — имя ячейки. Например, если вы находитесь на вкладке Characters (Персонажи), как показано на рис. 33.2, и хотите извлечь значение ячейки B5, находящейся на вкладке Weapons (Оружие), то это можно сделать с помощью формулы =Weapons!B5. Вам даже не нужно запоминать этот синтаксис, потому что для получения формулы вы можете просто записать знак равенства, перейти на вкладку Weapons (Оружие), щелкнуть на ячейке B5 и нажать клавишу Enter (Ввод). После этого программа сама введет в формуле правильное название нужной ячейки или диапазона ячеек.
Обратите внимание на то, что для указания ячеек, находящихся на других рабочих листах, можно использовать и абсолютные, и относительные ссылки. Если вы продублируете формулу =Weapons!B5 в нескольких расположенных ниже строках с помощью функции автозаполнения, то увидите, что она будет корректироваться в каждой следующей строке: =Weapons!B6, =Weapons!B7 и т.д. Но если вы таким же образом продублируете формулу =Weapons!$B$5, то увидите, что она будет вставляться в следующие строки без каких-либо изменений.
Когда имя рабочего листа содержит пробелы, его следует заключать в одинарные кавычки. Если в случае, показанном на рис. 33.2, вам потребуется получить доступ к ячейке A3, находящейся на вкладке Leveling Curve (Кривая уровня), это можно сделать с помощью формулы ='Leveling Curve'!A3, но если вы запишете имя этой вкладки без кавычек, редактор выдаст сообщение об ошибке.
Взглянув на панель инструментов своего редактора, вы увидите там множество кнопок (рис. 33.3), большая часть которых служит для изменения внешнего вида ячеек, выделенных в данный момент.

Рис. 33.3
• Расположенные слева кнопки для выбора формата ячеек позволяют задать способ представления данных. Данные можно выразить в виде денежной суммы со знаком денежной единицы, процентов со знаком процента, десятичного числа с заданным количеством знаков после запятой или в одном из других форматов, список которых можно отобразить с помощью кнопки 123 (например, в одном из форматов даты и времени).
• Справа от кнопок для выбора формата ячеек расположены кнопки для выбора шрифта и его размера. Эти параметры используются нечасто, поскольку редактор позволяет изменять масштаб отображения всей таблицы. В то же время иногда бывает полезно выделить содержимое некоторых ячеек более крупным шрифтом в сочетании с большей шириной столбца или высотой строки.
• Наряду с форматированием шрифта вы можете сделать текст в ячейках полужирным, курсивным или зачеркнутым (а также подчеркнутым с помощью сочетания клавиш Ctrl+U). В меню Format (Формат) можно задать и ряд других параметров форматирования, например способ выравнивания текста и его переноса на следующую строку.
• Можно изменить также цвет текста и фона. Обратите внимание на то, что при выборе одинакового цвета для фона и текста последний становится невидимым.
• Наконец, вы можете очертить границами отдельную ячейку или прямоугольный блок ячеек. Границы могут проходить по всем сторонам или только по одной стороне, быть толстыми или тонкими. Например, вы можете отделить два столбца друг от друга сплошной линией, выделив левый столбец и задав для него границу, проходящую только по правой стороне. А толстая граница вокруг блока ячеек позволит визуально изолировать его от остальной части листа.
Форматирование может не только придать красивый вид рабочему листу, но и позволяет другому человеку лучше понимать и использовать представленные в нем данные. В качестве примера посмотрим, какие типы ячеек может содержать электронная таблица (однако учтите, что это далеко не полный список).
• Неизменяемые данные — жестко закодированные неизменяемые слова или числа. Примером могут служить названия задействуемых в игре видов оружия или числовые параметры противников.
• Входные данные — поля, содержимое которых изменяется вручную и используется для получения дополнительных результатов. Допустим, что вы еще не определились со стоимостью или параметрами некоторых боевых юнитов в стратегической игре, но у вас есть формула, с помощью которой можно вычислить, находится ли заданный юнит выше или ниже кривой. В таком случае стоимость и параметры юнитов — это поля, с которыми разработчик должен экспериментировать до тех пор, пока не сбалансирует игру.
• Вычисляемые поля — промежуточные формулы, результат которых зависит от содержимого других полей, например, с неизменяемыми или входными данными. Часто бывает полезно разбить одну сложную формулу на несколько более простых этапов — это упрощает поиск ошибок в случае возникновения проблем и делает более понятным процесс вычислений для других людей.
• Управляющие поля — особый вид полей с входными данными, используемый для выбора одной из нескольких вещей. Например, в карточной игре вы можете применять разные кривые стоимости для разных типов карт. В таком случае можно сделать тип карты управляющим полем и с помощью функции IF() определять, какую формулу следует задействовать в зависимости от типа карты.
• Выходные данные — окончательные результаты вычислений, которые могут представлять для вас интерес.
Поскольку все эти поля являются обычными ячейками, по умолчанию они выглядят совершенно одинаково. Именно здесь вам может пригодиться форматирование: с его помощью можно сделать очевидной разницу в функциональном назначении ячеек различного типа. Если вы будете единообразно использовать различные цвета фона для каждого типа полей в своей электронной таблице (а может быть, и во всех электронных таблицах, как программисты везде применяют определенный стиль кодирования), то работающий с вашей таблицей человек сразу увидит, какие поля он должен модифицировать, какие ему не следует трогать и какие будут содержать нужные ответы. Например, для вычисляемых полей можно использовать светло-серый фон с темно-серым текстом (подобно тому как во многих программах серым цветом выделяются недоступные пункты меню), чтобы было понятно, что эти поля не следует изменять и в большинстве случаев можно проигнорировать. Окрасив ячейки для входных данных в ярко-желтый или другой яркий цвет либо создав вокруг них толстую рамку, вы дадите понять, что эти данные можно и нужно модифицировать. Важную роль выходных данных можно подчеркнуть, выделив эти ячейки жирным начертанием. Также можно выделить их особым цветом или даже задействовать условное форматирование, изменяя их цвет в зависимости от полученного результата (например, окрашивая фон в красный цвет в случае значительного отклонения объекта от кривой стоимости/мощности).
Границы и разные цвета фона можно использовать также для разделения рабочего листа на функциональные разделы. Например, если ваша таблица предназначена для сравнения издержек и преимуществ различных карт в коллекционной карточной игре, то для столбцов с издержками можно применить один цвет фона, а для столбцов с преимуществами — другой. Если имеется несколько типов преимуществ (например, основные параметры, пассивные особые способности, активируемые особые способности или иные категории), можно использовать для них разные оттенки одного цвета, чтобы показать, что это хотя и разные, но все же родственные параметры.
Описывать функциональное назначение ячеек можно с помощью комментариев, подобно тому как программисты снабжают комментариями различные фрагменты кода. Это можно делать, либо комментируя отдельные ячейки (в случае чего для просмотра комментариев нужно будет наводить на них курсор мыши), либо непосредственно вводя текст в некоторые ячейки (как в случае заголовка строки/столбца или поля Примечания, создаваемого для каждого игрового объекта). Даже очень краткий пояснительный текст может существенно облегчить использование и понимание электронной таблицы.
На ячейки с входными данными бывает полезно наложить ограничение, не позволяющее вводимым значениям выходить за рамки разумных пределов. Это можно сделать, применив функцию проверки данных. Выделите отдельную ячейку или блок ячеек и выберите в меню Data (Данные) пункт Data Validation (Проверка данных), также можно щелкнуть на ячейке правой кнопкой мыши и выбрать пункт Data Validation (Проверка данных) в контекстном меню (рис. 33.4). Откроется диалоговое окно, в котором вы сможете указать, какие ячейки следует проверять, какие критерии проверки использовать (например, должно ли вводимое значение находиться в заданном диапазоне значений или представлять собой значение из списка, находящегося в другом месте электронной таблицы) и что делать, если данные станут некорректными (показать предупреждение или вообще отклонить изменение). Проверку данных можно выполнять также в вычисляемых полях при поиске ошибок, если известно, что результат вычислений должен находиться в некотором заданном диапазоне (например, вероятность всегда находится в диапазоне от 0 до 1).
Функция проверки данных позволяет создать в ячейке раскрывающийся список значений. Его удобно использовать, когда ячейка для входных данных может содержать лишь несколько допустимых значений и вы хотите исключить вероятность неправильного ввода. Для этого в качестве критерия проверки нужно выбрать List of Items (Раскрывающийся список) (рис. 33.5).
|
|
| |
| Рис. 33.4 | Рис. 33.5 |
Затем просто введите через запятую значения, которые может содержать ячейка. А если они уже введены в определенный диапазон ячеек электронной таблицы, выберите в качестве критерия проверки List from a Range (Раскрывающийся список из диапазона) и укажите этот диапазон ячеек. Нажмите кнопку Save (Сохранить), и в затронутых этим правилом ячейках появится стрелка, щелкнув на которой можно будет открыть список доступных вариантов (рис. 33.6).

Рис. 33.6
Иногда в отдельных ячейках требуется сохранять большое количество текста: описания карт или правил, диалоги персонажей, отображаемые в игре описания квестов, примечания разработчиков или иную служебную информацию. Для ячеек с большим количеством текста могут оказаться полезными описываемые далее способы форматирования текстовых полей.
Такие текстовые поля обычно не могут поместиться в небольшой ячейке — им требуется больше места. Если соседние ячейки в той же строке пустые, то длинный текст отображается полностью с наездом на эти пустые ячейки (рис. 33.7).
Текст на рис. 33.7 по-прежнему находится в ячейке A1, а ячейки B1:E1 пустые. Но если одна из них содержит данные, то текст из ячейки A1 будет виден лишь частично — тот, который помещается до границы ячейки с данными (рис. 33.8).

Рис. 33.7

Рис. 33.8
Хотя теперь отображается только часть текста из ячейки A1, невидимая часть по-прежнему считается ее содержимым. Допустим, вам нужно, чтобы этот текст отображался целиком. Для этого можно увеличить горизонтальный размер доступного пространства, увеличив ширину столбца (щелкнув на границе между заголовками столбцов и перетащив ее вправо), или объединить несколько ячеек в одну более крупную, как было описано в главе 30.
Можно также активировать режим переноса по словам, при котором высота ячейки автоматически увеличивается таким образом, чтобы в ней мог поместиться весь текст. Для этого выделите соответствующую ячейку или группу ячеек и выберите в меню Format (Формат) пункт Text Wrapping→Wrap (Перенос→Переносить по словам) либо воспользуйтесь кнопкой для выбора режима переноса текста на панели инструментов (рис. 33.9).

Рис. 33.9
Обратите внимание на то, что если текст очень длинный, то ячейка может стать настолько большой, что не будет помещаться на экране! В таком случае тоже можно увеличить ширину столбца (рис. 33.10).
Описанные методы могут пригодиться, например, когда требуется создать ячейки с документацией, описанием правил и тому подобной информацией. При ее добавлении у вас очень быстро возникнет вопрос: можно ли в ячейке разбивать текст на несколько абзацев с помощью символов разрыва строки? Как оказывается, да, для этого просто нажимайте клавишу Enter (Ввод), удерживая клавишу Alt.

Рис. 33.10
Чтобы сделать свои формулы более осмысленными, можете присвоить им имена. Например, какой из следующих двух вариантов формулы для расчета урона будет легче понять с первого взгляда: =BaseDamage*MultiplierTargetArmor или =$D$7*$C$1-$F$7? Строго говоря, здесь нельзя дать однозначный ответ. Конечно, первый вариант формулы выглядит более осмысленным, но второй сообщает вам, где именно находятся данные, на которые она ссылается. Так что это дело вкуса. Однако имейте в виду, что вы можете присвоить отдельным ячейкам или целым диапазонам ячеек имена и использовать их в своих формулах. Это можно сделать, выбрав в меню Data (Данные) пункт Named Ranges (Именованные диапазоны) (рис. 33.11).

Рис. 33.11
При этом в правой части окна появится вкладка, на которой можно будет задать имя для определенного диапазона ячеек или одной ячейки. Обратите внимание на то, что после присвоения имени ячейке или диапазону ячеек ссылки на них обрабатываются подобно абсолютным (не относительным) ссылкам, то есть именованные ссылки не изменяются при их дублировании с помощью функции автозаполнения или копирования и вставки.
В этой главе мы рассмотрели много материала, поэтому сначала вспомним некоторые приемы, которые изучили в предыдущих главах, и дополним их возможностью использования нескольких рабочих листов.
Допустим, что мы десять раз подряд подбрасываем честную монету, получая в результате орла или решку. Давайте начнем с того, что с помощью метода перебора попробуем перечислить все 1024 возможных результата десяти попыток подбрасывания монеты, выделив по одному столбцу на каждую попытку и по одной строке на каждый возможный результат. Если вы забыли, как это делается, обратитесь к главе 31. В следующем столбце (столбцах) вычислите размер самой длинной серии орлов или решек. Например, для последовательности ОРРОООРРОО этот размер равен 3 (три орла в середине), для РРРРООРРРО — 4 (четыре решки в начале), для ОРОРОРОРОР — 1, а для ОООООООООО — 10 (десять орлов подряд).
Затем, применяя функцию COUNTIF() к содержимому столбца, отслеживающего размер самой длинной серии, можно определить вероятность того, что он будет равен 1, 2, 3… 10. Определив эти вероятности, убедитесь, что их сумма равна 1, и представьте их графически, чтобы посмотреть, как выглядит распределение вероятностей и часто ли встречается тот или иной размер самой длинной серии.
Теперь создайте второй рабочий лист. На нем используйте функцию RANDBETWEEN() для получения псевдослучайного числа в диапазоне от 1 до 1024. Создайте десять ячеек и примените функцию INDEX() или INDIRECT() для извлечения из первого рабочего листа тех десяти результатов подбрасывания монеты, которые находятся в строке с номером, равным результату функции RANDBETWEEN(). То есть если эта функция выдаст число 412, нужно будет найти результаты подбрасывания монеты, находящиеся в 412-й строке. Наконец, отобразите на втором листе размер самой длинной серии орлов или решек в этой строке, который вы уже вычислили на первом листе.
Отформатируйте ячейки с результатами подбрасывания монеты на втором рабочем листе таким образом, чтобы было видно, что это выходные поля, которые не следует модифицировать.
В другом месте этого же рабочего листа создайте для результатов подбрасывания монеты десять входных полей, в которые необходимо вводить данные, и отформатируйте их так, чтобы их назначение было очевидным. В каждой из этих ячеек используйте функцию проверки данных, чтобы они могли содержать только слова «орел» и «решка» (или буквы «О» и «Р», или иные обозначения, которые вы решили применять изначально). Вы можете либо отклонять некорректный ввод, либо задействовать в каждом поле раскрывающийся список.
Теперь вычислите размер самой длинной серии орлов или решек, полученной в десяти входных полях, подобно тому как это делалось на первом рабочем листе для каждой из 1024 строк. Выделите ячейку с размером самой длинной серии, используя любые подходящие средства форматирования (цвета, границы и т.д.), чтобы было понятно, что это вычисляемое выходное поле, которое содержит важную информацию и не должно изменяться.
Наконец, с помощью дополнительного текстового поля с функцией IF() или условного форматирования выделите одну из этих двух строк — либо с псевдослучайными результатами подбрасывания монеты, либо с результатами, введенными человеком, — в зависимости от того, в какой строке больше самая длинная серия (в случае ничьей выберите любую строку случайным образом).
Теперь попросите кого-то из своих друзей придумать десять случайных результатов подбрасывания монеты, делая это в уме. Введите эту последовательность во входные поля для результатов подбрасывания монеты, генерируемых человеком. Сравните ее с содержимым выходных полей для результатов подбрасывания монеты, генерируемых машиной. Как упоминалось в главе 20, большинство людей очень плохо справляются с задачей генерирования случайных результатов, и можно считать, что, выбирая строку с большой самой длинной серией, компьютер пытается угадать, какие результаты действительно случайные, а какие были введены человеком, пытающимся имитировать случайность. Насколько прав этот «искусственный интеллект» в своей догадке? Попробуйте проделать этот опыт с несколькими своими друзьями и посмотрите, часто ли его догадка будет верной.
Чтобы попрактиковаться в форматировании текста, попробуйте создать круто выглядящее облако слов, используя функцию объединения ячеек и режим переноса по словам, вставляя символ разрыва строки после каждой буквы для вертикального расположения некоторых слов и варьируя применяемый шрифт, размер и формат текста. Залейте все ячейки фоновым цветом так, чтобы не было видно линий сетки. На рис. 33.12 представлен небольшой пример такого облака, где все слова относятся к теме игрового дизайна.

Рис. 33.12
Каждый редактор электронных таблиц предлагает свои горячие клавиши для перехода к следующему или предыдущему рабочему листу, так что, если вы используете не Google Spreadsheets, а другой редактор, уточните, как это делается в нем. Горячие клавиши позволяют переключаться между вкладками гораздо быстрее, чем с помощью мыши.
Существует много способов вычисления этого размера. Один из возможных подходов сводится к следующему. Если данные находятся в ячейках A1:J1024, то пусть столбцы K — T отслеживают суммарное количество содержащихся в строке орлов и решек. Столбец K при этом будет всегда содержать 1. В столбце L нужно записать формулу =IF(B1=A1,K+1,1) и продублировать ее вправо и вниз с помощью автозаполнения. Затем в ячейке U1 нужно записать формулу =MAX(K1:T1) для вычисления размера самой длинной серии в строке и продублировать ее вниз с помощью автозаполнения.
Большинство редакторов электронных таблиц позволяют изменять ориентацию текста таким образом, чтобы он отображался вертикально или под определенным углом, но в различных редакторах это делается по-разному. В редакторе Google Sheets для этого нужно выбрать в меню Format (Формат) пункт Text Rotation (Вращение текста). В редакторе Excel вы можете щелкнуть на ячейке правой кнопкой мыши и выбрать в контекстном меню команду Format Cells (Формат ячеек), а затем перейти на вкладку Alignment (Выравнивание) и задать ориентацию текста в разделе Orientation (Ориентация).