Скриншот экрана игры

Эта статья посвящена тому, как я смог написать 3D-движок только на формулах Excel. Я реализовал следующий функционал:

  • бесконечная процедурно генерируемая карта лабиринта
  • рендеринг трассировкой лучей в реальном времени
  • вычисление окклюзии
  • рендеринг простейшего освещения
  • шейдер освещения и вычислений
  • движок естественного движения
  • в 3D-движке не используются макросы

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

Можете скачать файл и протестировать его самостоятельно!

Файлы




Контекст


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

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

Затем, после изучения машины Тьюринга, фраза стала для нас полностью верной, хотя и не вполне реализуемой.

Получив многолетний опыт работы с Excel, мы уже поняли, что единственное ограничение формулы Excel — недостаток способов ввода-вывода.

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

Как бы то ни было, эта работа — не просто какое-то хвастовство… У меня были для неё серьёзные причины.

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

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

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

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

При использовании в бизнесе формулы обладают следующими преимуществами перед макросами:

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

Примечание: эти пункты в основном относятся к процедурам, используемым как макросы; дополнительная функция, написанная на VBA, может увеличить эффективность, не снижая качества.

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

Если конкретнее, то я нашёл всего два случая, когда потребовался VBA:

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

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

Карта


Моя электронная таблица должна была стать игрой в стиле Doom в лабиринте.

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

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

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

Начальные состояния генератора случайных чисел должны быть позициями (x;y) на карте, чтобы мы могли получать разные значения для каждой позиции, и мы не можем получить результат предыдущего случайного числа как начальное состояние для следующего, или нам придётся хранить всю карту с самого начала.

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

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

Тогда я обнаружил метод средних квадратов (middle-square method), который на самом деле не очень «случаен», потому что в нём используются последовательные начальные состояния. Но он подсказал мне идею того, что можно брать десятичную часть любого другого вычисления.

Я выяснил, что если брать десятичные части sin(x)+cos(y), то наконец-то получаются красивые числа без какого-либо прослеживаемого паттерна, а время вычислений при этом на удивление малО.

Для получения десятичных частей математические функции mod() и floor() гораздо более эффективны по сравнению с текстовой функцией подстроки mid().

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

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

Плотностью размещения стен управляют два параметра.

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

Стоит заметить, что карта «плоская», без подъёмов и спусков. Можно было добавить рельеф с помощью генератора рельефа (подошёл бы алгоритм Diamond-Square, потому что его можно написать без рекурсивной функции), но весь последующий процесс сильно облегчило бы вырезание отверстий в полу и потолке с дополнительным значением уровня.


Так, похоже, мы в аду

Трассировщик лучей


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

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

Окклюзия


Первым сложным моментом будет нахождение первого объекта на пути каждого луча.

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

То есть процесс можно упростить до горизонтального «радара» в одном измерении.

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

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

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

Одно из ограничений Excel заключается в отсутствии условного цикла и для экономии времени можно только пропускать тело цикла. Поэтому нам нужно ограничить максимальное расстояние проверки, считая, что если на этом расстоянии стена не найдена, то её нет.

Пол и потолок


Чтобы определить потолок и пол, нам достаточно определить, где заканчивается стена.

Отдельный лист изменяет расстояние до пола или потолка в зависимости от вертикального угла.

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

Эффективное сравнение реализовано использованием только проекции расстояния до стены и до пола/потолка по оси камеры. Конечное расстояние затем получается с помощью предварительно вычисленного коэффициента расстояния в шейдере расстояний. Постоянные предварительно вычисленные значения нужны для экономии ресурсов.

Освещение


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

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

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

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

Коэффициент отражения — это просто функция угла.

В конце концов освещение становится результатом функции коэффициента расстояния, потолка/пола или разрешения стен, коэффициента отражения и коэффициента шейдера освещения.

Экран дисплея


Эффективный дисплей реализуется с помощью условного форматирования — градиент цвета зависит от значения ячейки.

Сокрытие значения выполняется форматированием ячейки.

Коллизии со стенами


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

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

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

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

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

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

Враги



Привет, красное привидение!

Графический рендеринг


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

Целый отдельный лист посвящён вычислению формы сфер с учётом горизонтального радиуса и вертикальной высоты овоида. Для анимирования существа используется соотношение высоты/ширины.

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

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

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

Здесь вычисления тоже производятся в горизонтальной плоскости, а максимальный объём вычислений подготавливается перед завершением 3D-вычислений для каждого пикселя.

Поведение врагов


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

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

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

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

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

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

Атаки врагов


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

Область видимости каждого монстра вычисляется на вкладке радара с учётом расположения стен.

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

Это создаёт эффект наносимого игроку урона — простой эффект негативного цвета во весь экран.

Добавлен также ещё один эффект — отмена рендеринга всех остальных врагов при нанесении урона игроку.

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

Атаки игрока


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

Эта упрощённая модель позволяет игроку предотвратить атаку врага, снизив его жизнь до нуля.

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

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

Смерть и перезапуск


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

Этот экран рендерится с помощью ещё одного шейдера освещения. К цвету применён эффект негатива, чтобы подчеркнуть нанесение урона.

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

Сдвигание вниз — это простое смещение шейдера освещения, в который добавлены другие сообщения, например, рекорды (high score) и перезапуск игры.

Очки должны отрисовываться с помощью пикселей шрифтом очень низкого разрешения.

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

Комментарии (67)


  1. Bookvarenko
    20.02.2018 11:56
    +2

    Шикарно, нету слов, одни восторги! Спасибо.


  1. anandr
    20.02.2018 11:59

    Да уж… Месье знает толк :)
    В самом лучшем значении этой фразы!
    Мегакруто!


  1. altervision
    20.02.2018 12:02

    Месье не просто знает толк ;) Месье как минимум познал дзен, суть бытия и вопрос, ответом на который было пресловутое 42)
    Это выше всяких похвал! Шедеврально!


  1. a-tk
    20.02.2018 12:03

    Не перевелись ещё маньяки в этом мире… Крутота!


  1. noxway
    20.02.2018 12:08

    «Знание офисных приложений», после прочтения статьи, принимает для меня совсем иной смысл.


  1. vtulin
    20.02.2018 12:19

    Квинтэссенция «Офиса»!
    Бесконечные комнатушки опенспейса, музыка особенно доставляет:)


  1. Bookvarenko
    20.02.2018 12:23

    "Подхожу к бухгалтерии — какая-то подозрительная тишина. Ну, точно, по сети в Ехсеl шпилят."


    1. kAIST
      21.02.2018 09:51

      Уже было что то похожее )
      https://habrahabr.ru/post/237641/


  1. pda0
    20.02.2018 12:45

    (Для тех к то помнит.)

    Уровень Excel 95 достигнут. Через 2 года он выпустит космосим в Excel. А ещё через 3 года он сделает гоночки…


  1. plus_stick
    20.02.2018 12:54

    Такое мог написать только человек, у которого на работе нет интернета, нельзя играть в игры, нельзя вообще ничего открывать, кроме блокнота с калькулятором, паинта, ворда и экселя. Максимум, что я могу сделать — это крестики-нолики. Ну и морской бой какой-нибудь, и то с VBA. Браво!


  1. PRO100Spike
    20.02.2018 12:54

    нет поддержки разных ОС в libreoffice работать отказался, сюжета нет, геймплей вторичен (видел такое еще в году 99ом), но за реализацию 10из10ти)


    1. khdavid
      20.02.2018 15:25

      мой либр оффис заработал, просто сначала попросил в настройках включить макросы.


    1. AshikTC
      21.02.2018 15:07
      +1

      Numbers тоже отказался… повыключал все формулы, либо заменил на свои.


  1. SONANT
    20.02.2018 12:58

    Crazy man! ;)



  1. helgisbox
    20.02.2018 13:26

    В excel-е когда-то давно пытался картинки рисовать таким образом, но тормозило в те времена страшно. А тут вон оно что. Мегазачот ;)


  1. Alexey_mosc
    20.02.2018 13:42
    +1

    Парень, ты гений!


  1. antoo
    20.02.2018 13:49
    +1

    Теперь осталось дождаться, пока кто-нибудь напишет прайс-лист на Unreal Engine :)


    1. InChaos
      21.02.2018 10:16

      Ждем Бухгалтерию Предприятия на CryEngine.


  1. Color
    20.02.2018 13:50
    +1

    Когда сам Doom на Excel портируют?


    1. ITMatika
      21.02.2018 16:34
      +1

      Так уже, в 95-м


      1. a-tk
        21.02.2018 21:23

        Это как бы немножко не то же самое…


        1. ITMatika
          22.02.2018 05:56

          Ну так без внятного ТЗ…
          Где ж вы были в 95-м? ;)


          1. a-tk
            22.02.2018 13:29

            Паскакаль учил :)


  1. saaivs
    20.02.2018 14:08

    Напомнило, habrahabr.ru/post/179295 :)


    1. bopoh13
      20.02.2018 18:44
      +1

      Была идея перегнать в SVG, да весит больше ))


  1. Aquahawk
    20.02.2018 14:16

    на самом деле впечатляюще. Человек который смог сделать это без труда потом въедет в любой GL, DX, Metal или что там ещё понапридумывают. Это действительно уровень понимания того как это работает, а не просто пользование.


  1. tema_sun
    20.02.2018 14:27

    Мечусь между двумя состояниям: «ненавижу автора» и «ненавижу себя».
    Впечетляющая работа!


  1. Ipeacocks
    20.02.2018 15:01

    Вот, теперь знания Excel можно добавить в резюме.


  1. DrPass
    20.02.2018 15:05

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


  1. mickvav
    20.02.2018 15:18
    -1

    За реализацию — однозначно респект.
    По поводу философии «вокруг»- вопрос ужасно спорный, как ни крути.
    Да, современное железо позволяет реализовать на excel-е сложные штуки, но идея
    заменять программный продукт сложно устроенной таблицей — странна и сомнительна.
    Причины:
    1) Люди, освоившие ексель и имеющие потенциал к освоению настоящих языков программирования, могут остановиться и решить, что «а теперь я всё буду делать на экселе», как следствие — закроют себе множество возможностей для роста.
    2) Сам по себе эксель без vba не позволяет нормально версионировать результат и посмотреть, что именно изменилось и как. (Или уже есть удобный аналог git-а для формул?)
    Мёржить файлы, опять же, боль. Ссылки на внешние данные — работают криво и ломаются между версиями екселя. Бррр…
    3) Очень тяжко уползать от екселя к базам данных. (Хотя и можно, да. Но нужно отдельно сперва дорасти до понимания и принятия аналогичной SQL-ю системы хранения)

    Как следствие — это всё же довольно нишевый инструмент — обработать разномастный выхлоп разных прожек, построить такой-сякой-разэтакий графичек (хотя для чуть более серьезной визуализации — уже нужен gnuplot или VTK какой-нибудь), свести приход с расходом либо на верхнем уровне менеджмента, либо в конторе уровня «ларёк у дороги». Чуть более серьезные вещи — и нужны нормальные инструменты.


    1. MaximSuvorov
      20.02.2018 16:23

      2) Сам по себе эксель без vba не позволяет нормально версионировать результат и посмотреть, что именно изменилось и как. (Или уже есть удобный аналог git-а для формул?)

      Умеет:
      support.office.com/en-us/article/compare-two-versions-of-a-workbook-by-using-spreadsheet-compare-0e1627fd-ce14-4c33-9ab1-8ea82c6a5a7e


      1. mickvav
        20.02.2018 16:32

        Эмм. Ну, это не git а diff, всё же. От появления diff-а до появления CVS-а прошло 20 лет, если что. А от CVS-а до git-а — ещё лет 15 кажется. И вывод у этого чуда, эмм, сложен для понимания. Но лучше чем ничего, согласен.


        1. MaximSuvorov
          20.02.2018 16:41

          Вывод у лучшего мерджера файлов — Araxis Merge которым я пользовался для работы — ± не сильно лучше.


          1. mickvav
            20.02.2018 17:00

            Ни разу не пользовался. Посмотрите, что github делает (оно онлайн-тул, конечно, но всё же) — github.com/mickvav/snmpbuilder/commit/52df21b42747e01c98dc5c82995737de36c5dd7a#diff-3dd7b23e94954baac44c14c78ba8dc53
            Видно где меняли, что было, что стало, контекст, в котором происходит дело.
            Ровно ввиду того, что (обычно) при написании программы как программы контекст более-менее локален, а при пользовании таблицами — размазан — получается, что вывод diff-а показывает, где дело происходит и о чем речь вообще, а при работе с таблицами соорудить интерфейс, в котором это будет удобно в понимании — отдельная нетривиальная задача.
            И то, что при изменении обработки 1000 строчек у вас меняется 1000 формул — никак не добавляет читаемости diff-у от excel-я. В программе это будет ровно одна строка.


    1. rockman78
      20.02.2018 19:23
      +1

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


    1. x67
      20.02.2018 20:49

      После sql сложно возвращаться к excel-like кодингу


  1. ilyaplot
    20.02.2018 15:47

    Очень непривычное управление. Было бы здорово юзать wasd.


    1. ilyaplot
      20.02.2018 15:54

      Разобрался, переделал на WASD, очень круто, спасибо:)


  1. PMVyatkin
    20.02.2018 16:55

    Мегакруто! Спасибо.
    Подкину бизнес-идей — смартфон iExcel, браузер Excella, почтовый клиент Excelook, приставку для телевизора Sony Exceltion, умные excel-часы с возможностью устанавливать 1 048 576 будильников, фитнес-экслет с возможностью мерить показания тела и сохранять в Excel-файл, нейронную сеть на Excel, Excel-coin, методологию управления проектами Excram…


    1. testlnord
      20.02.2018 17:55

      Вот нейронная сеть: Understanding Neural Networks Using Excel


  1. DIHALT
    20.02.2018 17:08

    В Exel 2000 не работает.


    1. jamepock
      20.02.2018 18:02
      +3

      Ага, и тестами код не покрыт.


  1. Quardex
    20.02.2018 18:56
    +4

    Когда на работе запрещают устанавливать игры…


  1. Blackmeser
    20.02.2018 19:24

    Это конечно с виду необыкновенно круто, и демонстрирует отличную изобретательность, но, с реальными задачами фраза: «любые вычисления можно выполнить в любом языке программирования, даже через формулы электронной таблицы» не особо вяжется с реальной практикой. Хотя не отрицаю, что где-то 99,9% вычислений более-менее реализуемы.
    Когда у нас есть ограниченные ресурсы, ограниченный (и тем более заранее известный) объём данных — это хорошая демонстрация, но как к примеру реализовать в Excel вычисления с неизвестным заранее объёмом данным? Как реализовывать списки (List) с переменным количеством значений/элементов?


    1. ilyaplot
      21.02.2018 10:09

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


      1. Blackmeser
        21.02.2018 15:30
        +1

        Нет, и денди — не электронная таблица.


    1. staticlab
      21.02.2018 11:00

      Как реализовывать списки (List) с переменным количеством значений/элементов?

      Вообще Excel позволяет косвенную адресацию.


      1. Blackmeser
        21.02.2018 15:33
        +1

        Это вообще не то. Так или иначе, ячейки заполнять надо.


    1. bopoh13
      21.02.2018 12:13

      Как реализовывать списки (List) с переменным количеством значений/элементов?
      Начните с изучения абсолютных/относительных ссылок, функции СМЕЩ() и Диспетчера имён. Можно создавать даже многоуровневые списки, что уменьшит количество элементов.


      1. Blackmeser
        21.02.2018 15:57
        +1

        Я просто конкретизирую вопрос используя пример: допустим у нас есть столб неопределённой высоты (высота — вводимое значение), столб делится на сектора длиной 1м и массой 1кг, нужно подсчитывать число секторов (это элементарно) и нагрузку сверху на каждый сектор. Т.е. создать таблицу, в которой будет номер сектора и нагрузка на него сверху, сделать это используя практически любой язык программирования — элементарно, самый обычный список. А теперь вопрос: как реализовать это в Excel, при условии что мы не можем до бесконечности заполнять строки формулами под всевозможные габариты столба!? Если бы в Excel была возможность по условию редактировать из одной ячейки содержимое другой ячейки — без использования скриптов и макросов — тогда бы эта задача была реализуема, но насколько мне известно — такой функции нет.


        1. Am0ralist
          21.02.2018 17:11
          +1

          А теперь вопрос: как реализовать это в Excel, при условии что мы не можем до бесконечности заполнять строки формулами под всевозможные габариты столба!?
          Ять… вначале сами кастрируем задачу услвоиями, чтоб нельзя было сделать в экселе, потом побеждаем.
          Если есть универсальная растягиваемая формула, то она клонируется во все ячейки одним кликом мышки плюс операцией вставки.
          В другой столбец выводим номер сектора, если он есть. Если же нет, то записываем пусто. Расчет нагрузок производить, если номер сектора не равен пусто. Итого, формулы в двух столбах до 1048576 строки, но отображаются только нужные вам строки.


          1. Blackmeser
            22.02.2018 15:21

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


            1. Am0ralist
              22.02.2018 15:38

              Дано: универсально растягиваемая формула, клик по столбцу, ctrl+V.
              Вопрос, куда еще растягивать формулу, если на листе всего 1048576 строк?

              Вот это — вывод номера сектора:
              =ЕСЛИ(СТРОКА()<=$адрес$ячейки; СТРОКА();"")
              Вот это — вывод нагрузки:
              =(если(B1<>""; формула_расчета;"")

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


  1. Dark_Purple
    20.02.2018 19:42

    На моем компе даже на минималках только 10 фпс. ))


  1. x67
    20.02.2018 20:41

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

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

    И про понимание и поддержку вы также ошиблись. 10 строк вба кода будут всегда удобнее проще и быстрее 5 этажной формулы из впров и прочих непонятных сочитаний. Что уж говорить об условных операторах… сможет ли пользователь разобрать такой оператор тройной вложенности с отловом ошибок и теми же впрами и ссылками на диапазоны по всей книге?


  1. engine9
    20.02.2018 20:59

    10 троллейбусов из буханки из 10, но при этом шикарно! Даже глянцевый блик реализован, круто.


  1. vdonich
    20.02.2018 21:54

    В качестве идеи — почему бы не стилизовать врагов под привидения, как в Пакмене?

    как-то так
    image


  1. ddemidov
    21.02.2018 01:08

    Спасибо большое! Это восхитительно!

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


  1. Rudolfo
    21.02.2018 06:15

    Жду порт Quake II на ваш движок.


  1. MrShoor
    21.02.2018 08:50

    Не могу не оставить вот это здесь.
    www.pouet.net/prod.php?which=53021


    1. KvanTTT
      22.02.2018 12:17

      Антиалиазинг не помешал бы.


  1. dantaeusb
    21.02.2018 10:16

    Это конечно здорово, но:
    1) Разве хэш медленный, если на каждый вариант клетки лабиринта нужно всего три (всегда по 2 стены) бита? То есть даже если брать медленный sha256, у нас целых 256 бит информации, из которых можно вытащить 64 клетки лабиринта с полными данными о 4 стенах. Не считая что есть более быстрые uniform хэши.
    2) Почему такой странный алгоритм лабиринта? Неужели ни Прима, ни Уилсона, не реализовать?


  1. freemanon
    21.02.2018 10:16

    И этот человек просто преподает Excel? Наверно даже у программиста придумавшего Excel отвисла бы челюсть


  1. Bookvarenko
    21.02.2018 12:40

    Хм, "Бухгалтерия Предприятие" на шейдерах? Что-то в этом есть.


  1. HueyOne
    21.02.2018 21:12

    Что используется в качестве постоянно тикающего таймера?
    Код с телефона не вижу