Ответы пользователя по тегу Разработка игр
  • Что это за файл и синтаксис?

    @Mercury13
    Программист на «си с крестами» и не только
    Это файл местной консоли. Файл устроен на манер командного: каждая строчка — это отдельная команда для игрового интерпретатора.

    Первая часть — это общая конфигурация игры, которую, скорее всего, больше менять нельзя. Очень удобно при разработке: я сейчас на W10, разрабатывая программу, воссоздаю её каталог символьными ссылками, но тогда символьных ссылок не было, даже под NT. Приходилось брать файлы откуда-то из другого места, а не из каталога с EXE.

    Вторая — самые настоящие команды консоли. Quake очень популяризовал внутреннюю консоль игры.
    Ответ написан
  • Как создают текстуры для игр?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы, конечно, говорите о 3D. Там создают текстуры для ожидаемого разрешения экрана (2к или 4к, например), а остальное — MIP-текстурирование. Уменьшенные в 2, 4, 8 и т.д. раз версии создаются автоматически.
    Отдельный вопрос — как в текстуру втиснуть псевдо-векторную вещь, для этого используется хитрый формат текстуры и хитрые шейдеры.

    Вы можете запустить и какой-нибудь Need for Speed Porsche в 4к. Скорее всего, в каком-то месте уровня зависнет, но некоторое время работать будет. Края объектов будут резкие, за это отвечает 3D-движок. Но треугольники будет видны, а текстуры мыльные по современным меркам. Вот вам огромное превышение системных требований.

    Но в текстурах есть одно важное попущение меньшим разрешениям: между островками текстур должно быть несколько пикселей, чтобы при уменьшении не захватило соседний островок, и островки должны быть зарисованы с припуском по той же причине.
    Ответ написан
  • Возможно ли реализовать одноранговый мультиплеер с защитой от жульничества?

    @Mercury13
    Программист на «си с крестами» и не только
    Это не одноранговая игра, это клиент-серверная.

    ИДЕЯ 1. Передавать с сервера картинку. Всё, читерство пресечено на корню. Это те самые Google Stadia и PS Now. Недостатки — в огромной нагрузке на сервер и задержках между управлением и картинкой. Как их решить?

    ИДЕЯ 2. Передавать с сервера некую информацию, по которой клиент будет строить картинку. Нагрузка на сервер меньше — он не занимается рендерингом. Зато появляется первая предпосылка к жульничеству — по этой информации жульническая программа определяет, где находится враг, и наводит оружие. Но остаётся недостаток: всё та же огромная задержка между управлением и картинкой. При этом задержку никак нельзя улучшить — у нас то самое «пространство-время», знакомое из теории относительности.

    О чём я: между Землёй и Луной секунда, и случились два события, на Земле и на Луне. Возможны три варианта: а) свет доходит от Земли до Луны, и событие на Земле заведомо раньше для любого наблюдателя; б) свет доходит от Луны до земли, и событие на Луне заведомо раньше; в) не успевает дойти ни тот, ни другой свет, и хрен его знает, какое раньше — для одних наблюдателей земное, для других лунное. Подобное пространство-время есть и в любом динамичном мультиплеере.

    ИДЕЯ 3. Ну, если задержку не улучшить, купируем её тем, что клиент может как-то предсказывать, чтó остальные будут делать, пока пакет ползёт от сервера. Чего не хватает? 1) Клиенты могут внезапно появляться в поле зрения, и не очень хотелось бы, чтобы мы зашкерились за углом, а враг появился ХЗ где, причём где — это зависит от нашего пинга; 2) Из соображений серверной производительности вопрос «видит ли клиент А клиента Б?» желательно решать очень приблизительно, с запасом — Z-буфер решит эту задачу значительно лучше, чем вычисление на процессоре, видит ли клиент А мизинец клиента Б.

    Есть ещё такая штука: представьте себе, у клиента А пропала связь. Он со своей пропавшей связью начинает крутить мышью, и не хотелось бы, чтобы в момент появления связи этот клиент умер от ХЗ кого, кого он даже не видел. Ну или со связью в порядке, но А очень насобачился работать мышью. Так что вопрос «видит ли один другого» обычно не рассматривает направление взгляда, только геометрию уровня.

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

    Вот, собственно, и причина wallhack’ов: сервер принял решение, что клиент А, возможно, видит клиента Б, и начинает передавать его положение. И потому wallhack’и обычно не работают, если Б далеко: сервер понимает, что Б не виден и в ближайшее время не будет виден.

    Есть ещё такая помощь клиенту, связанная с тем, что есть мощные виды оружия вроде снайперской винтовки, с огромной разницей между «попал» и «промазал». Каждый клиент видит своё в зависимости от работы сети (вспомните фразу «ХЗ, что раньше»), и в момент прихода информации о выстреле сервер пытается восстановить, что именно видел клиент на своём экране, и по этой картинке решает, попал или нет (на этом основан глюк «спрятался за углом, и всё равно убили»). Но эту помощь тоже эксплуатируют: представьте себе, пакеты клиент→сервер, которые идут по штуке за, скажем, 50 мс, отправляют по пачке за 0,3 секунды — больше типичного времени компенсации задержек, но меньше типичного времени реакции. Получается, что персонаж скачет (клиенты, заглядывающие наперёд на 100 мс, отказываются предсказывать дальше — пусть он лучше зависает, чем тыкается в стены), причём скачет так, что в него хрен выстрелишь (пока среагируешь, он перескочит в другое место). А поскольку пакеты сервер→клиент ходят исправно, а сервер руководствуется прикидкой, что видел клиент, клиент всё видит и метко стреляет, а в него никто попасть не может. Если этот трюк исполнять автоматически только при появлении врага на экране, это будет максимально беспалевно — ну у игрока начались перекэширования из-за того, что видеопамяти не хватило. Эту штуку можно сделать даже на приставке, даже не разбирая её — нужен свитч (приставки всё-таки насобачились сообщать, что кто-то физически режет провод), кусок витой пары, моторчик с оптопарой и педалька под ногу. А для некоторых игр хватает свитча и педали, главное не жадничать и отпускать её иногда.

    А теперь вместо «чечни» (я так обозвал Counter-Strike — он появился в те времена, когда война в Чечне превратилась в антитеррористическую операцию) возьмём какой-нибудь преферанс. В чём разница? А в том, что игра не динамичная! И потому тактика «передавать только те данные, что нужны для рендеринга» вдруг становится годной. И если вы в преферансе сможете палить чужие карты — автор разгильдяй!

    Скажу честно, я не знаю, как на всех этих chess.com компенсируют задержки в шахматном суперблице типа «три минуты на партию». Если средняя игра тридцать-сорок ходов, то задержки в 0,1 секунды отъедят 3…4 секунды, а задержки в 0,2 — 6…8. Но из-за шахматного жульничества и далеко ушедшей дебютной теории основной формат игры — именно суперблиц.

    В общем, хрен вы реализуете диплом о защите от жульничества, не понимая, как работает мультиплеер и откуда жульничество берётся. А берётся жульничество из трёх предпосылок: 1) участники мультиплеера живут в релятивистском пространстве-времени; 2) очень хочется экономить вычисления на сервере; 3) жульничество иногда маскируют под обычные для компьютерного мира явления вроде сетевого затора или долгого кадра.

    Да, как реально защищают от жульничества: 1) Не допускают никого постороннего в программу-клиент, чтобы даже пакеты нельзя было расшифровать; 2) Ловят программы-жулики по принципу антивируса; 3) Передают клиентам как можно меньше того, что они знать не обязаны; 4) Ловят признаки компьютерного вмешательства в изображение или управление.
    Ответ написан
    Комментировать
  • Как ограничить скорость разгона?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак, тут у нас задача: каким образом, НАИМЕНЬШЕЙ КРОВЬЮ (игра совершенно условная, верно?) сделать поведение машины в зависимости от оборотов. Опустим сложные материи вроде приёмистости, турбины, торможения двигателем, спойлеров, дифференциала, увода шин и прочего. Считаем, что обороты мотора измеряем в об/мин, остальное (скорости, расстояния…) — в единицах СИ.

    1. Нам нужны передаточные числа коробки в единицах «обороты·c/м·мин». Имея физическую машину в гараже и инструкцию к ней, действуем так: замеряем действующий радиус колеса с учётом смятой шины, находим передаточные числа передач в коробке и главной передачи, и

    об·/метр = (передаточное_число_коробки·передаточное_число_главной_передачи)/(120π·радиус_колеса).

    Ну или просто едем на стабильной скорости, замеряем скорость GPS’ом или километровыми знаками (важно! — спидометр всегда врёт), и заодно видим обороты мотора.

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

    2. Теперь придумываем сопротивление движению в виде квадратного трёхчлена: Fсопр=av²+bv. Цифры a и b находим из двух условий: а) на максимальной скорости Fсопр=Pmax/v; б) линейная часть равна квадратичной где-то около 30 км/ч.

    3. Находим характеристику двигателя: МОЩНОСТЬ от оборотов. Загоняем её в игру в виде ломаной или сплайна.

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

    5. Ускорение машины: a = (P/v−Fсопр(v))/m, с какой-нибудь аппроксимацией, когда скорость меньше минимальной стабильной (5…10 км/ч в зависимости от машины).

    6. Из скорости через наши «круго-линейные» передаточные числа определяем новые обороты двигателя и ударился ли он в отсечку. Если ударился, ограничиваем скорость.

    7. Если машина вдруг прыгает (хоть одно ведущее колесо в воздухе) — просто считай, что она на нейтрали.

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

    9. На малых скоростях есть ещё один ограничивающий фактор — пробуксовка шин. Если игра условная, то просто коряво рассчитай трение шин и не допускай такого разгона, что шины буксуют.
    Ответ написан
    Комментировать
  • Как поставляются игры на компьютеры?

    @Mercury13
    Программист на «си с крестами» и не только
    Касательно читов. Я простым анализом памяти смог узнать в Microsoft Train Simulator состав поезда игрока, его скорость, положение контроллеров, пройденный путь, давление в различных элементах пневматического тормоза (оказывается, в PSI), боксует ли он. Жаль, я не смог обнаружить привязку всего этого к путям.

    Как я это делал. Через ArtMoney получал некие базовые адреса. Если адрес статический — ну, всё в порядке. Если нет — писал утилиту, в которую изначально вводился найденный адрес. По цифрам я прикидывал, где мог начинаться объект, и снова поиск через ArtMoney… Ну и так далее, пока не дойду до статического адреса. Вот так оно у меня выглядело.

    TmstsLocalTrain = packed record
          _mem0000 : array [$0000..$0061] of byte;
          // 0062
          HeadWagon : dword;   // Головная единица ПС
          // 0066
          TailWagon : dword;   // Хвостовая единица ПС
          // 006A
          LocWagon : dword;    // Управляемая игроком единица ПС
          // 006E
          _mem006E : dword;
          // 0072
          Caps : dword;
          // 0076
          _mem0076 : array [$0076..$0091] of byte;
          // 0092
          Speed : single;       // Скорость по скоростемеру, м/с
          // 0096
          Acceleration : single;  // Ускорение, м/с2
          // 009A
          _mem009A : array [$009A..$00D5] of byte;
          // 00D6
          TimeSec : single;
          // 00DA
          ReversingOdometer : single;
          // 00DE
        end;


    ПС = подвижной состав. Одометр реверсивный, потому что при осаживании (заднем ходе) считает назад. Байтовый массив _mem0000 — это память, которую я не смог опознать. HeadWagon, TailWagon, LocWagon, Caps — на самом деле указатели, но поскольку они не имеют смысла в адресном пространстве лентописателя (задачей было сделать аналог скоростемерной ленты), они Dword, а не указатели.

    Вспоминал, что значат сокращения П, ПТЭ и прочее. Оказалось: паровоз, тепловоз, электровоз. Естественно, регулятор пара есть только у паровозов.
    Ответ написан
    Комментировать
  • Я придумал новый гениальный способ оптимизации игр?

    @Mercury13
    Программист на «си с крестами» и не только
    Гений постольку, поскольку каким-то раком научил движок делать то, чего он не может из коробки. Но есть вопросы.
    Поскольку игра изометрическая, низшие уровни детализации неактуальны. А в обычном 3D — более чем.
    Изометрия обычно не настолько детальна, чтобы загрузка была нужна особенно часто — нужно что-то вроде «при приближении к подуровню грузить его».
    Если движок не поддерживает фоновую подгрузку — всё будет с ней в порядке, не будет игрок испытывать тормозов?
    С мультиплеером всё в порядке?
    Ответ написан
    Комментировать
  • Какой способ отрисовки использован в игре?

    @Mercury13
    Программист на «си с крестами» и не только
    Рейкастинг и есть, только не по пикселям, а по столбцам.
    Ответ написан
    5 комментариев
  • Как работает просчёт траектории в играх типа Angry Birds?

    @Mercury13
    Программист на «си с крестами» и не только
    От массы тела зависит взаимодействие с другой массой.
    От силы броска и массы тела — начальная скорость v.

    Чаще всего действительно не доводят до аналитического решения, а каждый кадр происходит шаг численного решения дифференциального уравнения:
    (vx, vy)′ = (0, −g) — ну или сопротивление воздуха добавьте
    (x, y)’ = (vx, vy)

    Гуглите «методы Рунге—Кутты», нам хватит метода второго порядка.
    Ответ написан
    Комментировать
  • Каков смысл скалярного произведения в Cel Shading?

    @Mercury13
    Программист на «си с крестами» и не только
    Отвечу по существу.

    У нормали длина всегда 1. Иногда это реально вектор, перпендикулярный к полигону — если мы хотим осветить плоский полигон как плоскость. Иногда мы хотим из плоских полигонов создать впечатление криволинейной поверхности и потому делаем (например, интерполяцией или специальной текстурой, т.н. картой нормалей) непрерывное поле нормалей.

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

    Если длина вектора луча тоже 1 — то результат будет [−1…1]. Если он меньше 0 (в случае, если нормаль наружная, а луч идёт от источника света) — перед нами коэффициент, во сколько раз реальная освещённость меньше, чем обеспечиваемая источником света. Если больше — поверхность в собственной тени. (Расчёт падающих теней — отдельный и сложный вопрос.)

    С цел-шейдингом никак это не связано, это вообще база по освещению.
    Ответ написан
    Комментировать
  • Столкнулся с проблемой парсинга заголовка wav звука?

    @Mercury13
    Программист на «си с крестами» и не только
    Пропускать «левые» блоки, пока не дойдём до data! Что ещё делать?
    У меня получился файл длиной 5.241.822, и там такие блоки: по смещению 0C fmt длиной 0x10, по смещению 24=0C+8+10 LIST длиной AA, и по смещению D6=24+8+AA будет нужная нам data.

    Уточню, что я имел в виду. RIFF — это стандартный блочный формат, не ограничивающийся WAV’ом. Допустим, есть формат RMI = RIFF MIDI. Ваше решение подразумевает, что за блоком «fmt» сразу идёт блок «data», что не всегда верно.

    Ещё раз, мужик! По смещению 0C будет блок «fmt»: 4 байта сигнатура, 4 байта длина и 0x10 байт данные.
    За этими 0x10 байтами, по смещению 24=0C+8+10, идёт блок LIST: 4 байта сигнатура, 4 байта длина и 0xAA байт данные. Блок не наш — пропускаем эти байты, и переходим сразу на смещение 0xD6=24+8+AA. Там 4 байта сигнатура, 4 байта длина и 0x4FFB00 байт данные. Их-то и читаем.
    Ответ написан
  • Можно ли выкладывать на вики сканы карт из настольной игры или хотя бы текст с карт?

    @Mercury13
    Программист на «си с крестами» и не только
    Это находится в «серой зоне» и зависит от «борзости» издателя. По авторским правам это чистое «добросовестное пользование несвободного контента», которое определяется исключительно судом (нет чётких критериев), и если издателю захочется закрыть — закроет. Пара советов.
    1. Ставьте такое качество, чтобы текст едва читался.
    2. Использование каждой несвободной картинки должно быть обосновано.
    Ответ написан
    Комментировать
  • Как договорится с художником и какие есть лицензии у изображений?

    @Mercury13
    Программист на «си с крестами» и не только
    На вопрос 2 — из некоммерческих годятся общественное достояние (Public domain = PD = CC0) и «укажи автора» (Creative Commons Attribution = CC-BY). Никакие другие лицензии CC для коммерческой игры не годятся!

    Если игра открытая — подумай, под какой лицензией она будет выпущена и совместимы ли требования с этой лицензией. Например, с GPL совместимы PD = CC0, CC-BY, CC-BY-SA.

    Разумеется, возможна ситуация, что одни части игры под одной лицензией, другие — под другой. Например, движок GPL-ный, а изображения под более строгой или более мягкой лицензией. Так, Doom (1993) имеет GPL-ный движок и коммерческое всё остальное.

    Каждую полукоммерческую лицензию приходится рассматривать по отдельности.

    Если лицензий несколько (например, CC-BY + GPL2 + GPL3) — если среди них есть хоть одна, которая тебя устраивает, порядок!
    Ответ написан
    Комментировать
  • Какая графика используется в игровых движках?(вектор или растр.)И как вообще устроен графический редактор в них?

    @Mercury13
    Программист на «си с крестами» и не только
    Трёхмерная графика не бывает векторной и растровой. У неё там свои разновидности, и там она используется полигональная. Текстуры, разумеется, растровые. Существуют псевдовекторные элементы вроде поля расстояний, но это именно что «псевдо-».

    Двухмерная — в подавляющем большинстве случаев растровая, но и векторные элементы бывают.
    Ответ написан
    Комментировать
  • Старые игровые движки и их строение?

    @Mercury13
    Программист на «си с крестами» и не только
    Нашёл вот такую книгу.
    gamesmaker.ru/books/kak-samomu-sozdat-trehmernuyu-igru
    Вроде она.
    Ответ написан
    Комментировать
  • Что делать при несовпадении координат на клиенте и сервере?

    @Mercury13
    Программист на «си с крестами» и не только
    Я об играх, где игрок управляет одним объектом: шутерах, гонках…
    Клиент и сервер держат несколько исторических положений.

    Координаты СЕБЯ, ЛЮБИМОГО — клиентские. Если серверные координаты в такт 1234 не совпадают с нашими — откатываемся к серверным, повторно прокрутив нужное количество тактов управления.
    Вещи неуправляемые/слабоуправляемые, вроде запаса жизни, берутся подтверждённые сервером.

    Координаты ВРАГОВ — серверные (возможно, каким-то образом экстраполированные).

    Для физики пуль пишется т.н. «компенсация пинга»: если клиент пишет, что в такт 1234 он стреляет, сервер восстанавливает, что КЛИЕНТ ВИДЕЛ в такт 1234, и сравнивает попадание именно с ТЕМ положением клиента. Для медленных снарядов компенсация обычно не пишется.
    Ответ написан
    Комментировать
  • Как программировать игру в игре?

    @Mercury13
    Программист на «си с крестами» и не только
    Обычно для этого используют скриптовый движок. Наиболее известный — Lua.

    Также используют триггеры, эталонный пример — StarCraft.
    Но, работая с триггерами, надо разделять «условие» и «повод». Повод — это событие-импульс, которое МОЖЕТ спровоцировать срабатывание триггера. Условия — это уже дополнительные вещи, которые проверяются потом.

    Третья возможность — движок, основанный на данных. Например, задаём тип атаки, количество HP, тип движения и прочее, и вся эта библиотека уже записана в коде. Эталонный пример — Doom (самый ещё первый, 1993 года). Кстати, в его последователе Hexen появились скрипты.
    Ответ написан
  • Как создать отличный сбалансированный уровень?

    @Mercury13
    Программист на «си с крестами» и не только
    https://www.youtube.com/watch?v=0xBJwrm9C8w
    https://www.gdcvault.com/play/1023139/Level-Design...

    https://www.rockpapershotgun.com/2015/01/22/how-to...

    https://www.gamasutra.com/blogs/AsherEinhorn/20150...

    Есть ещё книга «Fundamentals of puzzle and casual game design», но я её пока не видел в лицо.

    И без бета-тестеров никуда. Сам не делал уровни, но один знакомый нарисовал немаленький мод к Braid — бета-тестерами служили его отец и я.

    Вот ещё нашёл по Braid: gamedesignreviews.com/reviews/braid-understanding-...
    Ответ написан
    Комментировать
  • Как продумать геймплей, чтобы он был завлекающий и сбалансированный?

    @Mercury13
    Программист на «си с крестами» и не только
    К сожалению, геймдизайн — это очень творческая профессия, и Extra Credits предупреждает: дизайн, базирующийся на собранных данных, не делает нового, он только оттачивает имеющееся.
    https://www.youtube.com/watch?v=nqGcXOksFGg

    Может быть, это вам и нужно — заработать побольше денег на клоне Dota (PUBG, Candy Crush, Angry Birds). Но про творчество попытаюсь рассказать.

    1. Ходите на художественные выставки.
    2. Играйте во что угодно, впрочем, необычным образом. Во-первых, играйте не только в любимые жанры, но и в файтинги, RPG, симуляторы и прочее. Во-вторых, часто хватит потратить на игру четыре-пять часов. В-третьих, прикарманивайте их решения. В четвёртых, ищите поломы системные (например, где-то ∞ денег) и поломы отдельной подсистемы (застревающая камера). Намеренные ли эти поломы? Мешают ли играть?
    Ответ написан
    Комментировать
  • HTML5 game | Как убрать задержку клавиатуры после первого нажатия клавиши?

    @Mercury13
    Программист на «си с крестами» и не только
    Если игрок управляет дискретным курсором или маркером, например, в сапёре или пасьянсе (если те играются с клавиатуры, разумеется) — так и надо, нужен системный автоповтор клавиш.

    Если игрок управляет непрерывно движущимся персонажем, надо отойти от системных автоповторов и сделать две независимых подсистемы.
    • Подсистема реагирования на клавиатуру. При нажатии на кнопку системный код превращается в виртуальную клавишу (например, «Идти вверх», «Выстрел» или «Бомба»). Затем в битовой маске управления в соответствующей позиции ставится 1. При отпускании — соответственно 0.
    • Подсистема тактов игры. По таймеру проводится такт игры — акт управления всеми её персонажами, главным и врагами. В зависимости от состояния клавиш мы ведём Главного в ту или иную сторону.
    • Третья подсистема — рендерер игры. Она может быть синхронной с тактами игры или нет, в зависимости от того, какое мы хотим поведение на слабых машинах и есть ли желание проработать асинхронщину (не обязательно многопоточную; например, рендерер может поминутно вызывать «прокрути такт игры, если надо»). А также звук и сеть — в нашем вопросе, впрочем, не до них (и вообще рендерингом занимается браузер).

    Если тактовая частота игры невелика (скажем, до 16) и приходится подгонять героя «на один шажок», у меня есть маленький лайфхак, оставшийся с J2ME. Создаём две маски: «нажатая» и «удерживаемая».
    • При нажатии: поставить 1 в обе маски.
    • При отпускании: поставить 0 только в удерживаемую.
    • При управлении героем: нажатая := нажатая OR удерживаемая; именно по этой «нажатой» управляем героем; нажатая := 0.

    С новым годом, и хороших игр!
    Ответ написан
    1 комментарий
  • Где найти новые детерминированные игры с полной информацией?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть разумеется.
    18 век: https://en.wikipedia.org/wiki/Agon_(game)
    19 век: https://ru.wikipedia.org/wiki/Реверси
    20 век: https://ru.wikipedia.org/wiki/Перебрось_мостик
    20 век: https://ru.wikipedia.org/wiki/Гекс
    20 век: https://en.wikipedia.org/wiki/Quoridor
    21 век: https://ru.wikipedia.org/wiki/Улей_(игра)
    21 век: https://ru.wikipedia.org/wiki/Khet

    Почему таких игр крайне мало?
    1. Мы автоматически отбрасываем часть позиций как неперспективные — потому, чтобы обеспечить ту же просчитываемость, ДИсПИ должна быть намного богаче тайной или случайной. Некоторые механики придётся отбросить, поскольку, например, заимствованием стратегии доказывается, что первый выигрывает.
    2. Из двух игроков разной силы один выигрывает с вероятностью, стремящейся к 100%, игра быстро теряет интерес. А ведь как важен такой интерес для новой игры, которая пока продвигается…
    3. Продвигается исключительно гиками: сложно сыграть, например, папе с дочкой.
    UPD. 4. Крайне сложно сделать, чтобы компьютер косплеил человека. Другими словами, совершал ошибки, свойственные человеку, и при попытках подловить тупой алгоритм ходил как угодно, лишь бы по-другому.

    А насчёт шахмат — от первых упоминаний до современных правил прошло тысячелетие! Догадываетесь, какие плейтесты они прошли, чтобы из банального варгейма стать тем, чем они являются сейчас (хотя тоже, по всей видимости, были популярны в первую очередь у верхушки общества).
    Ответ написан
    5 комментариев