<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Igor Stepanov</title><subtitle>Блог о геймдизайне, играх и геймдев-разработке. Подписывайтесь на телеграмм-канал</subtitle><author><name>Igor Stepanov</name></author><id>https://teletype.in/atom/ig0rstepan0v</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/ig0rstepan0v?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/ig0rstepan0v?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-05T06:00:50.136Z</updated><entry><id>ig0rstepan0v:Procedural-generation-of-puzzle-levels</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/Procedural-generation-of-puzzle-levels?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Процедурная генерация уровня для небольшого пазла</title><published>2026-01-14T12:09:30.690Z</published><updated>2026-01-15T07:33:58.912Z</updated><category term="matchast" label="Матчасть"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/78/64/78643cfe-4f55-4986-ac09-ff5e9b373f1b.png&quot;&gt;На новогодних каникулах сделал небольшой классический пазл с шариками в качестве домашнего проекта. И больше всего времени у меня заняла задача генерация уровней для такого пазла на ходу.</summary><content type="html">
  &lt;p id=&quot;ZL0G&quot;&gt;На новогодних каникулах в качестве домашнего проекта сделал небольшой классический пазл с шариками для маленькой консоли &lt;a href=&quot;https://play.date/&quot; target=&quot;_blank&quot;&gt;Playdate&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;JHqz&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/78/64/78643cfe-4f55-4986-ac09-ff5e9b373f1b.png&quot; width=&quot;570&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;iVpn&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4f/2b/4f2b5d95-e8a8-4f02-a1e8-27206c2c1715.png&quot; width=&quot;570&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;nC5w&quot;&gt;Это моя вторая игра на этой консоли. До этого была игра «&lt;a href=&quot;https://play.date/games/move-match/&quot; target=&quot;_blank&quot;&gt;Move and match&lt;/a&gt;», которая уже издана и продается в официальном каталоге.&lt;/p&gt;
    &lt;p id=&quot;ZUCv&quot;&gt;О том, как разрабатывать игры под консоль, я писал ранее в &lt;a href=&quot;https://teletype.in/@ig0rstepan0v/Developing-for-Playdate&quot; target=&quot;_blank&quot;&gt;этом подробном гайде&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;zvRu&quot;&gt;Больше всего времени у меня заняла задача генерации уровней на ходу.&lt;/p&gt;
  &lt;p id=&quot;FBrn&quot;&gt;Я решил обрисовать алгоритм и показать некоторые идеи, которые могут пригодиться для генерации уровней в похожих ситуациях.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Yfm2&quot;&gt;Описание алгоритма в виде статьи мне самому помогло отрефакторить алгоритм и найти в нем некоторые ошибки.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;23hr&quot;&gt;Геймплей&lt;/h2&gt;
  &lt;p id=&quot;lImU&quot;&gt;У нас есть прямоугольное поле с шарами. Несколько белых и один черный. Мы управляем черным шаром. Стрелками мы можем толкнуть черный шар в одном из четырех направлений. Тот покатится и, если встретит на своем пути шар, толкнет его, а сам остановится. В свою очередь, белый шар может толкнуть на своем пути другой шар.&lt;/p&gt;
  &lt;figure id=&quot;87vS&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ac/79/ac796760-dca2-4610-bfde-01d880863d72.gif&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;WPtY&quot;&gt;Если черный шар выкатится за края поля, мы проиграем. Задача: столкнуть с поля все белые шары.&lt;/p&gt;
  &lt;p id=&quot;ufNe&quot;&gt;Уровни генерируются на ходу по последней позиции черного шара.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;w1xj&quot;&gt;Кстати, чуть не забыл про телеграм-канал, куда я тоже делаю посты: &lt;a href=&quot;https://t.me/SecretRoom_Gamedesign&quot; target=&quot;_blank&quot;&gt;https://t.me/SecretRoom_Gamedesign&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;zHji&quot;&gt;Задача&lt;/h2&gt;
  &lt;p id=&quot;fc0U&quot;&gt;Зная начальную позицию черного шара, расставить N белых шаров на поле, так чтобы уровень был проходимым и интересным.&lt;/p&gt;
  &lt;h2 id=&quot;jbo6&quot;&gt;Решение&lt;/h2&gt;
  &lt;p id=&quot;9vrn&quot;&gt;Будем строить уровень в том же порядке, как мы будем его проходить.&lt;/p&gt;
  &lt;p id=&quot;ONBV&quot;&gt;Возьмем позицию черного шара и выберем случайное направление.&lt;/p&gt;
  &lt;figure id=&quot;jfaS&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/01/bb/01bbe708-a67e-4d03-b496-7f0bf833e9df.png&quot; width=&quot;818&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zLC7&quot;&gt;Затем выберем на сколько клеток он должен будет сдвинуться при первом ходе. Причем сдвиг может быть даже нулевой, так как черный шар при ходе может остаться на той же самой клетке.&lt;/p&gt;
  &lt;figure id=&quot;tmEq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/ce/abcee300-c166-44eb-acb7-139ad5af3979.png&quot; width=&quot;818&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;ZoWC&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6c/03/6c035b67-5b87-44a1-81f4-caef15c4e697.png&quot; width=&quot;815&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LPMp&quot;&gt;Разместим рядом с новой позицией черного шара наш первый белый шар, причем по направлению движения.&lt;/p&gt;
  &lt;figure id=&quot;OXfw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/11/a0/11a03013-8f70-408e-944a-83f05f58c5d8.png&quot; width=&quot;814&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;KK7H&quot;&gt;Запомним историю случившегося хода:&lt;/p&gt;
  &lt;p id=&quot;Txmh&quot;&gt;1-й ход: Герой двигался по таким-то клеткам. Белые шары двигались по таким-то клеткам.&lt;/p&gt;
  &lt;figure id=&quot;TzWQ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d9/6f/d96f2a44-07a0-4999-9355-94d54454fced.gif&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;NuWu&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d2/38/d238c70b-2fd3-47ae-a1e7-0fb175b24027.png&quot; width=&quot;813&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gHW1&quot;&gt;Выбираем следующую позицию черного шара аналогичным образом: выбираем случайное направление и смещение.&lt;/p&gt;
  &lt;p id=&quot;3t5D&quot;&gt;Однако теперь при выборе появляется ограничение. Новый белый шар не должен попасть на уже посещенные черным шаром клетки.&lt;/p&gt;
  &lt;p id=&quot;Lb6t&quot;&gt;Например, мы не можем установить второй белый шар сюда. Потому что по этим клеткам уже ходил черный шар в первом ходу — будет противоречие.&lt;/p&gt;
  &lt;figure id=&quot;O2Qe&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0a/38/0a384525-5ae1-48e9-8088-e28610a996c2.png&quot; width=&quot;818&quot; /&gt;
    &lt;figcaption&gt;Сюда нельзя&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;1rlT&quot;&gt;А можно ли поставить новые шары на клетки, по которым уже летали другие белые шары? Например, здесь:&lt;/p&gt;
  &lt;figure id=&quot;Ze61&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/10/86/1086f187-d7a9-4a54-a09d-feb274113a46.png&quot; width=&quot;820&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;iJEU&quot;&gt;Можно, но не везде.&lt;/p&gt;
  &lt;p id=&quot;17z8&quot;&gt;Рассмотрим &lt;strong&gt;первый вариант&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure id=&quot;j1Ci&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d9/5e/d95e618c-8ca3-4a47-a58c-48c30379d891.png&quot; width=&quot;819&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;n2LC&quot;&gt;Мы генерируем шар уже для второго хода, то есть позицию белого шара на &lt;strong&gt;момент второго хода&lt;/strong&gt;. Но по центральной линии уже пролетал первый белый шар.&lt;/p&gt;
  &lt;p id=&quot;KOJv&quot;&gt;Давайте восстановим начальную картину уровня, чтобы мы оказались ко второму ходу в такой ситуации, как на картинке выше.&lt;/p&gt;
  &lt;p id=&quot;kFtj&quot;&gt;Исходный уровень должен быть таким:&lt;/p&gt;
  &lt;figure id=&quot;w8i1&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/10/61/1061ea70-699e-4a97-8e7a-688a2707610b.png&quot; width=&quot;820&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;rCcH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f4/fb/f4fb0250-b189-4e41-b2e5-dc9a48e68acd.gif&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;o8Rd&quot;&gt;То есть в начальной позиции уровня мы поставили шар на одну клетку правее.&lt;/p&gt;
  &lt;figure id=&quot;Gq5A&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/65/b8/65b8076e-ac0b-44bf-92ec-650fdc0356e0.png&quot; width=&quot;815&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CltP&quot;&gt;&lt;strong&gt;У края поля&lt;/strong&gt;: Мы не можем на втором ходу ожидать белый шар у края поля. Потому что это значит, что в изначальном положении уровня он должен находиться за пределами поля.&lt;/p&gt;
  &lt;figure id=&quot;eRTZ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b5/41/b54192bc-805d-4233-a5e8-bc16ba90db98.png&quot; width=&quot;817&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4eop&quot;&gt;По ходу расстановки новых шаров уровень обрастет историей ходов в виде различных стрелочек на поле с их нумерацией.&lt;/p&gt;
  &lt;figure id=&quot;XTfr&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/87/6b/876b265d-367f-4127-b37a-4e0c7b2a0cc3.png&quot; width=&quot;819&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;GklH&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3d/d8/3dd856e2-e835-454d-b099-6d6585e016ca.png&quot; width=&quot;816&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MX7Y&quot;&gt;Каждый раз, когда мы будем вычислять начальную позицию новых белых шаров на поле, мы должны:&lt;/p&gt;
  &lt;ul id=&quot;a3WE&quot;&gt;
    &lt;li id=&quot;x0dT&quot;&gt;Смещать их по соответствующим стрелочкам истории белых шаров, если они на них попадают.&lt;/li&gt;
    &lt;li id=&quot;qgKP&quot;&gt;И проверять, что белые шары не мешают перемещениям черного шара в соответствующий момент истории ходов. То есть сместили шар — проверили историю перемещений, могло ли быть пересечение с черным шаром в определенных ходах. Если могло, то значит вариант расстановки белого шара не подходит.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;CMNx&quot;&gt;Здесь, главное не запутаться и хорошо понимать историю перемещений шаров.&lt;/p&gt;
  &lt;p id=&quot;s4rm&quot;&gt;То есть вы должны, как бы, восстанавливать историю позиций шаров в истории до определенного хода и делать соответствующие проверки на конфликты.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;lR2t&quot;&gt;Надо сказать, что шар при установке может сместиться сразу на несколько клеток по шагам истории и даже в нескольких направлениях. Если он после каждого смещения попадает на стрелку, у которой номер хода был раньше, чем предыдущая стрелка смещения.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;7gee&quot;&gt;Кусочек кода с проверкой истории в момент нахождения позиции белого шара:&lt;/p&gt;
  &lt;pre id=&quot;yePY&quot; data-lang=&quot;lua&quot;&gt;-- ballsMovesTable - таблица с историей перемещения белых шаров
-- heroMovesTable - таблица с перемещением черного шара

newBallPosition = {x = newHeroPosition.x + direction.x,
                   y = newHeroPosition.y + direction.y}

-- Если позиция будет за пределами карты, то установка шара невозможна
if not pointInBounds(newBallPosition, bounds) then
   return false
end

h = #ballsMovesTable -- Количество совершенных ходов в истории

-- Идем по ходам в истории в обратную сторону
for i = #ballsMovesTable, 1, -1 do
   ballsMove = ballsMovesTable[i]
      
   -- Если попали на стрелку предыдущего белого шара
   if ballsMove[newBallPosition.x][newBallPosition.y] ~= nil then
      
      -- Проверяем перед смещением, что мы не пересекаемся с черным шаром
      -- по истории после этого момента
      for j = i + 1, h do
         if heroMovesTable[j][newBallPosition.x][newBallPosition.y] then
            return false
         end
      end
         
      -- Смещаем шар по стрелке из истории хода
      offsetX = ballsMove[newBallPosition.x][newBallPosition.y].x
      offsetY = ballsMove[newBallPosition.x][newBallPosition.y].y
      newBallPosition = {x = newBallPosition.x + offsetX,
                         y = newBallPosition.y + offsetY}
      if not pointInBounds(newBallPosition, bounds) then
         return false
      end
      h = i
         
   end
end

-- Проверяем финальную позицию белого шара на пересечении
-- с начальной историей черного шара
for j = h, 1, -1 do
   if heroMovesTable[j][newBallPosition.x][newBallPosition.y] then
      return false
   end
end

return true&lt;/pre&gt;
  &lt;h2 id=&quot;FI1r&quot;&gt;Развесовка алгоритма&lt;/h2&gt;
  &lt;p id=&quot;y4sj&quot;&gt;Я еще улучшил алгоритм небольшой &lt;strong&gt;развесовкой&lt;/strong&gt; решений в момент выбора на сколько клеток мы смещаем черный шар при ходе и отдал приоритет большим смещениям. Чтобы уровень был интереснее. Так как, чем длиннее перемещения черного шара, тем интереснее создаются ситуации.&lt;/p&gt;
  &lt;p id=&quot;armi&quot;&gt;В итоге у меня получилась такая генерация уровней. Кстати, очень залипательная игра получилась.&lt;/p&gt;
  &lt;figure id=&quot;Z7iG&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6b/7f/6b7f1f97-d41d-46e4-b989-8942096e740b.gif&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>ig0rstepan0v:Broughlikes</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/Broughlikes?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Брогалики. Жанр для небольших проектов</title><published>2025-12-28T08:48:45.417Z</published><updated>2025-12-28T08:50:10.509Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/8f/6c/8f6cf8d0-ceb7-445d-a66f-3e246fb4082f.png"></media:thumbnail><category term="dekonstrakty" label="Деконстракты"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/d4/81/d481e49f-3b1e-4b8e-8f31-41b8595b6fea.jpeg&quot;&gt;Несколько постов назад я писал о небольшом рогалике Bug hunter из сборника UFO 50. В этом посте я снова хочу вернуться к размышлениям на тему таких минималистичных, но глубоких игр.</summary><content type="html">
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#wKet&quot;&gt;Поджанр в рогаликах&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#n3qZ&quot;&gt;Игры&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#DZ7K&quot;&gt;Mosaic (бесплатно, игра в браузере)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#Hl6H&quot;&gt;Rolldown (бесплатно, игра в браузере)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#49st&quot;&gt;Проблема: Патовые ситуации&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#nX4C&quot;&gt;Продолжаем играть в другие брогалики&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#0Byn&quot;&gt;Twinfold (Steam, Mobile)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#joQV&quot;&gt;Pawnbarian (Steam, Mobile)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#gYwX&quot;&gt;Проблема: Слишком сильный герой&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#HWsX&quot;&gt;Игры Майкла Бро (Michael Brough)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#iKbz&quot;&gt;Деконструкция жанра и идеи&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;h2 id=&quot;wKet&quot;&gt;Поджанр в рогаликах&lt;/h2&gt;
  &lt;p id=&quot;gTH1&quot;&gt;&lt;a href=&quot;https://teletype.in/@ig0rstepan0v/UFO-50-Bug-hunter&quot; target=&quot;_blank&quot;&gt;Несколько постов назад&lt;/a&gt; я писал о небольшом рогалике Bug Hunter из сборника UFO 50. В этом посте я хочу вернуться к размышлениям на тему таких минималистичных, но глубоких игр.&lt;/p&gt;
  &lt;p id=&quot;UfdI&quot;&gt;Я узнал, что существует такой жанр игр, который называют «&lt;strong&gt;broughlikes&lt;/strong&gt;», другими словами — брогалики.&lt;/p&gt;
  &lt;p id=&quot;90Hi&quot;&gt;Главной фигурой в разработке этих игр считается геймдизайнер &lt;a href=&quot;https://en.wikipedia.org/wiki/Michael_Brough_(game_designer)&quot; target=&quot;_blank&quot;&gt;Michael Brough&lt;/a&gt;. Он специализируется на одном жанре и выпустил несколько игр с похожими друг на друга идеями. В честь него и назван этот поджанр рогаликов.&lt;/p&gt;
  &lt;p id=&quot;raDY&quot;&gt;Что представляет собой такая игра:&lt;/p&gt;
  &lt;ul id=&quot;voGh&quot;&gt;
    &lt;li id=&quot;XOdI&quot;&gt;Это пошаговый рогалик с одним героем на очень небольшом поле: 6x6, 5x5 или даже 4x4.&lt;/li&gt;
    &lt;li id=&quot;KIub&quot;&gt;В игре несколько типов врагов.&lt;/li&gt;
    &lt;li id=&quot;ZgJS&quot;&gt;Герой прокачивается, собирая в свой инвентарь различные заклинания или пассивные способности.&lt;/li&gt;
    &lt;li id=&quot;7Hoh&quot;&gt;Игра, как правило, ничего толком не объясняет. Игрок сам должен выяснить правила игры, ее особенности и приемы — это часть игрового опыта.&lt;/li&gt;
    &lt;li id=&quot;O308&quot;&gt;Обычно в таких играх, несмотря на минималистичность, представлен довольно глубокий геймплей, который порождает множество интересных игровых ситуаций.&lt;/li&gt;
    &lt;li id=&quot;mb8K&quot;&gt;Игра следует правилу «easy-to-learn, hard-to-master».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;epDn&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/21/9a213e41-ff64-4e9d-99e0-09c9f618e59b.png&quot; width=&quot;292&quot; /&gt;
    &lt;figcaption&gt;Игра Mosaic&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;dpns&quot;&gt;На itch.io есть тег «&lt;a href=&quot;https://itch.io/games/tag-broughlike&quot; target=&quot;_blank&quot;&gt;broughlikes&lt;/a&gt;», по которому можно найти некоторые, в том числе, бесплатные игры.&lt;/p&gt;
  &lt;p id=&quot;Y8D3&quot;&gt;Дальше я рассмотрю несколько подобных игр, в которые я поиграл, и попробую провести деконструкцию жанра — с прицелом на возможность сделать что-то своё в таком же духе.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;aeuV&quot;&gt;Кстати, если интересно — добавляйтесь в телеграм-канал: &lt;a href=&quot;https://t.me/SecretRoom_Gamedesign&quot; target=&quot;_blank&quot;&gt;https://t.me/SecretRoom_Gamedesign&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;n3qZ&quot;&gt;Игры&lt;/h2&gt;
  &lt;h3 id=&quot;DZ7K&quot;&gt;Mosaic (бесплатно, игра в браузере)&lt;/h3&gt;
  &lt;p id=&quot;Gr8w&quot;&gt;Начну с игры &lt;a href=&quot;https://zunil.itch.io/mosaic&quot; target=&quot;_blank&quot;&gt;Mosaic&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;qDff&quot;&gt;Играть можно прямо в браузере, но сначала коротко о правилах:&lt;/p&gt;
  &lt;ul id=&quot;kuGD&quot;&gt;
    &lt;li id=&quot;ud5G&quot;&gt;Есть два поля: верхнее и нижнее.&lt;/li&gt;
    &lt;li id=&quot;yVRh&quot;&gt;На верхнем поле находится зелёная фишка героя, которая может перемещаться и атаковать врагов.&lt;/li&gt;
    &lt;li id=&quot;99Bp&quot;&gt;Враги, в свою очередь, пытаются поймать героя.&lt;/li&gt;
    &lt;li id=&quot;bxwt&quot;&gt;Если герой убивает врага, в нижнее поле падает цветная плитка. Цвет зависит от типа врага.&lt;/li&gt;
    &lt;li id=&quot;Tl1E&quot;&gt;Если герой получает урон, то в нижнюю колонку падает серая плитка жизни.&lt;/li&gt;
    &lt;li id=&quot;fVpl&quot;&gt;Дальше работает принцип match-3. Три одинаковые плитки по горизонтали или вертикали исчезают.&lt;/li&gt;
    &lt;li id=&quot;DcVG&quot;&gt;Игра закончится, если нижнее поле будет переполнено, как в Тетрисе.&lt;/li&gt;
    &lt;li id=&quot;QUyu&quot;&gt;В игре есть заклинания, помогающие выходить из сложных ситуаций.&lt;/li&gt;
    &lt;li id=&quot;OKIA&quot;&gt;Иногда выгодно осознанно получить урон, чтобы сбросить серую плитку в нужное место и собрать полезный матч.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;1tNy&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/de/66/de667f76-206d-4189-b277-3590c7d9f86a.png&quot; width=&quot;450&quot; /&gt;
    &lt;figcaption&gt;Атакую лошадь и желтая плитка падает вниз. Создается метч и желтые плитки исчезают&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;Hl6H&quot;&gt;Rolldown (бесплатно, игра в браузере)&lt;/h3&gt;
  &lt;p id=&quot;axdd&quot;&gt;&lt;a href=&quot;https://kindanice.itch.io/rolldown&quot; target=&quot;_blank&quot;&gt;Ролдаун&lt;/a&gt; — рогалик, в котором главным героем выступает шестигранный игральный кубик.&lt;/p&gt;
  &lt;p id=&quot;eABG&quot;&gt;Мы перекатываем кубик по полю и пытаемся убить врагов. Правило простое: если число точек на верхней грани кубика больше, чем «глаз» у врага, кубик побеждает при атаке.&lt;/p&gt;
  &lt;p id=&quot;FNPH&quot;&gt;Игра довольно простая, но идея любопытная.&lt;/p&gt;
  &lt;figure id=&quot;IJka&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/96/20/9620c2a0-a898-490d-aac2-a9ac9776fb90.png&quot; width=&quot;895&quot; /&gt;
    &lt;figcaption&gt;Кубик может пойти влево и убить двухглазую крысу шестеркой&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;49st&quot;&gt;Проблема: Патовые ситуации&lt;/h2&gt;
  &lt;p id=&quot;uSLK&quot;&gt;Здесь я хочу остановиться и рассмотреть первую проблему, которая может встречаться в дизайне подобных игр, и как ее решать.&lt;/p&gt;
  &lt;p id=&quot;RegS&quot;&gt;Частая игровая ситуация: Между героем и врагом одна клетка.&lt;/p&gt;
  &lt;figure id=&quot;Rxl5&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e5/34/e534a277-9c41-4d28-9f6a-2647527c3330.png&quot; width=&quot;194&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kbkd&quot;&gt;Игровой цикл работает так:&lt;/p&gt;
  &lt;ul id=&quot;Vs8A&quot;&gt;
    &lt;li id=&quot;WC8N&quot;&gt;Сначала ходит герой: он либо двигается на одну клетку, либо атакует.&lt;/li&gt;
    &lt;li id=&quot;ilS9&quot;&gt;Дальше ход врага. Враг всегда движется в сторону героя.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Gkrw&quot;&gt;Если герой стоит через одну клетку от врага, ему невыгодно идти вперёд: враг тут же атакует. Герой отступает, враг преследует — и мы снова оказываемся в той же ситуации. Возникает пат.&lt;/p&gt;
  &lt;figure id=&quot;WeVS&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0f/4c/0f4c8648-3ee2-4d39-8333-3279151b1110.png&quot; width=&quot;192&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;q8ig&quot;&gt;Самое простое решение — добавить команду &lt;strong&gt;Wait&lt;/strong&gt; (пропуск хода), но это не слишком интересный вариант.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;DPdK&quot;&gt;Что предлагают для решения выше рассмотренные игры?&lt;/p&gt;
  &lt;p id=&quot;f6pE&quot;&gt;&lt;strong&gt;Mosaic&lt;/strong&gt; позволяет использовать урон в свою пользу: игрок сам выбирает клетку, где получит урон, и может сбросить плитку жизни в нужное место, собрав матч.&lt;/p&gt;
  &lt;figure id=&quot;hf5x&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e9/4c/e94cfa95-8449-4e2c-8c12-e1fec9dd0633.png&quot; width=&quot;188&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;dL0F&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e3/cc/e3cc2f14-8c61-44b3-9f23-0bbd08f0cc3f.png&quot; width=&quot;186&quot; /&gt;
    &lt;figcaption&gt;Используем урон для составления метча&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;QV7Y&quot;&gt;В &lt;strong&gt;Rolldown&lt;/strong&gt; есть враги, которые ходят по диагонали. Достаточно сделать шаг в сторону — враг приблизится и станет уязвимым.&lt;/p&gt;
  &lt;figure id=&quot;AZam&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/5a/025a5812-d7ce-4ea7-a1bb-fb8f8581f989.png&quot; width=&quot;296&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Smnj&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/32/fd/32fd5fee-75ea-4c59-acef-bb262cd20993.png&quot; width=&quot;215&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;f25Q&quot;&gt;Как идея: Можно ввести специальные «ледяные» клетки. Если враг наступает на такую клетку, он проскальзывает дальше на одну клетку. Это помогло бы выходить из патовых ситуаций. Останется только заманить врага на такую клетку.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;nX4C&quot;&gt;Продолжаем играть в другие брогалики&lt;/h2&gt;
  &lt;h3 id=&quot;0Byn&quot;&gt;Twinfold (Steam, Mobile)&lt;/h3&gt;
  &lt;p id=&quot;BlRX&quot;&gt;&lt;a href=&quot;https://store.steampowered.com/app/980880/Twinfold/&quot; target=&quot;_blank&quot;&gt;Твинфолд&lt;/a&gt; много позаимствовал из «&lt;a href=&quot;https://2048game.com/ru/&quot; target=&quot;_blank&quot;&gt;2048&lt;/a&gt;».&lt;/p&gt;
  &lt;figure id=&quot;o4q0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/18/7a/187ab2e1-46af-4b0b-81e2-3e7a78e8b63a.png&quot; width=&quot;424&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wkv4&quot;&gt;&lt;strong&gt;Во-первых&lt;/strong&gt;, все объекты на поле перемещаются одновременно с героем.&lt;/p&gt;
  &lt;p id=&quot;ITEZ&quot;&gt;Мы двигаем не только героя, но и все объекты на поле в одну сторону. Стенки же остаются на месте. Главная механика игры — враги уничтожаются за счет ударов об эти самые стенки. Правда, герой тоже может потерять здоровье аналогичным способом.&lt;/p&gt;
  &lt;p id=&quot;4boA&quot;&gt;У врагов показано направление хода. И можно сместить все объекты так, чтобы враг оказался перед стенкой. В таком случае враг ударится об стенку вместо того, чтобы атаковать героя.&lt;/p&gt;
  &lt;figure id=&quot;MfEF&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7c/1d/7c1dc613-0217-4a06-a901-23d6ccf5ed78.png&quot; width=&quot;119&quot; /&gt;
    &lt;figcaption&gt;Враг (внизу) хочет атаковать героя (белого, сверху)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Hwcd&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9d/61/9d619da1-b868-4ac8-98e9-76042b67ac91.png&quot; width=&quot;180&quot; /&gt;
    &lt;figcaption&gt;Смещаем поле влево, и враг при ходе ударится об стенку&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TPUR&quot;&gt;&lt;strong&gt;Далее:&lt;/strong&gt; в игре есть плитки золота, которые имеют на своей грани число. Плитки можно мержить.&lt;/p&gt;
  &lt;figure id=&quot;p6gD&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/01/16/011634cb-b668-484d-ae58-69ee44a84acd.png&quot; width=&quot;475&quot; /&gt;
    &lt;figcaption&gt;Двигаем поле вверх. 1 и 1 превратится в 2&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MHf8&quot;&gt;Каждый раз когда золото мержится, на поле появляется ее клон, расположение стен и ямы меняется на случайное.&lt;/p&gt;
  &lt;figure id=&quot;wojH&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/94/24/9424c6b0-7f21-482a-a665-428a6c4c5ab0.png&quot; width=&quot;472&quot; /&gt;
    &lt;figcaption&gt;На поле появилась дополнительная золотая двойка для следующего мержа (необязательно рядом)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;IRD3&quot;&gt;Задача игры: создать как можно большую плитку золота, после чего ее съесть.&lt;/p&gt;
  &lt;p id=&quot;j7IV&quot;&gt;Собирая золотые плитки, мы получаем игровые очки для рекорда и опыт. За накопленный опыт открываются заклинания на выбор. Есть пассивки и активки. Для активок нужен тратить ресурс — убитые души врагов.&lt;/p&gt;
  &lt;figure id=&quot;Yt68&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/92/e4/92e47fcc-522e-43d6-946a-afacefe45ada.png&quot; width=&quot;687&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tPyv&quot;&gt;Примечательно, что в игре есть кнопка отмены хода. Можно отменить один или два последних хода и переиграть их.&lt;/p&gt;
  &lt;p id=&quot;oDLf&quot;&gt;Мне понравился способ убивать и подставлять врагов. Особенно приносит удовольствие скидывать врагов в яму. Ну и механика мержа тоже хорошо работает. Есть желание создать золотую плитку как можно дороже и потом ее съесть.&lt;/p&gt;
  &lt;p id=&quot;mqGx&quot;&gt;Кстати золотые плитки также являются аптечками для героя. Похожий &lt;a href=&quot;https://teletype.in/@ig0rstepan0v/UFO-50-Bug-hunter&quot; target=&quot;_blank&quot;&gt;дуализм&lt;/a&gt; объектов был и в Bug Hunter. Когда один объект отвечает за много функций. Хорошее решение от геймдизайнера.&lt;/p&gt;
  &lt;p id=&quot;vi42&quot;&gt;Еще если монстр двигается на монстра, то они мержатся и превращаются в одного более сильного монстра.&lt;/p&gt;
  &lt;p id=&quot;wHje&quot;&gt;Это очень хороший представитель broughlikes — с большим количеством скрытых механик, которые постепенно раскрываются по ходу игры.&lt;/p&gt;
  &lt;h3 id=&quot;joQV&quot;&gt;Pawnbarian (Steam, Mobile)&lt;/h3&gt;
  &lt;p id=&quot;awkU&quot;&gt;&lt;a href=&quot;https://store.steampowered.com/app/1142080/Pawnbarian/&quot; target=&quot;_blank&quot;&gt;Pawnbarian&lt;/a&gt; — это следующая игра, в которую я поиграл. Игра является шахматным рогаликом с элементами декбилдера.&lt;/p&gt;
  &lt;p id=&quot;yKl2&quot;&gt;У нас есть небольшое поле, враги, герой и колода карточек с шахматными фигурами. В начале хода из колоды достаются карточки, игрок выбирает фигуру и делает ход по правилам этой фигуры. Дальше атакуют монстры, если достают до героя и перемещаются в другие клетки.&lt;/p&gt;
  &lt;figure id=&quot;cprF&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/77/6c/776cdaa4-7781-44e9-957e-c807178d4e66.png&quot; width=&quot;486&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;b4lH&quot;&gt;К сожалению, в этой игре потерялась та элегантность и минимализм, который присущий этому жанру рогаликов.&lt;/p&gt;
  &lt;figure id=&quot;RjoU&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/96/e9/96e9b10a-93e3-4ff6-8807-2bab56cb4dd3.png&quot; width=&quot;470&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nygs&quot;&gt;Если я уж начал говорить об этой игре, то немного побурчу по поводу их интерфейсных решений.&lt;/p&gt;
  &lt;p id=&quot;W192&quot;&gt;Во-первых, очень неудобно считывать клетки, которые являются безопасными. Посмотрите на скриншот выше. Вы видите безопасную клетку, на которой нет красных отметок?&lt;/p&gt;
  &lt;p id=&quot;wYwy&quot;&gt;Вот эта клетка безопасна. (На ней нет красных отметок урона по клетке):&lt;/p&gt;
  &lt;figure id=&quot;oJIW&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f6/68/f66827c2-4513-4d3c-b0c7-e1d1cab5420c.png&quot; width=&quot;231&quot; /&gt;
    &lt;figcaption&gt;Визуальный шум не дает видеть островки безопасности&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ifUS&quot;&gt;Что мешало сделать хотя бы так:&lt;/p&gt;
  &lt;figure id=&quot;G0Ua&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/00/6d/006d7128-aeaa-4321-bdf7-8468c0868984.png&quot; width=&quot;368&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;iUur&quot;&gt;Во-вторых, как вам очки действия, которые выглядят как стрелки и похожи на кнопку пропуска хода, которая лежит рядом?&lt;/p&gt;
  &lt;figure id=&quot;zMpJ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d8/64/d864ff0d-3171-4390-b403-7223eaf05476.png&quot; width=&quot;320&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;YYIb&quot;&gt;Странное изображение монеток, не находите?&lt;/p&gt;
  &lt;figure id=&quot;uPIi&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a4/9f/a49f8e47-d7a6-4193-a97c-ce8b90f5f130.png&quot; width=&quot;167&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;gYwX&quot;&gt;Проблема: Слишком сильный герой&lt;/h2&gt;
  &lt;p id=&quot;sMSd&quot;&gt;В Pawnbarian есть ключевая проблема, которая портит весь игровой опыт. В этой игре слишком много возможностей у героя. Чтобы это компенсировать приходится вводить сильных врагов, которые покрывают слишком много клеток своими атаками, вводить яд, который держится на клетках какое-то время. И поле становится абсолютно нечитаемым.&lt;/p&gt;
  &lt;figure id=&quot;cbRF&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ce/5f/ce5f8c4b-be76-45a3-9633-10ee0a4b1cbb.png&quot; width=&quot;283&quot; /&gt;
    &lt;figcaption&gt;Что тут происходит?&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Qg3B&quot;&gt;В итоге игра выглядит отталкивающе из-за своей перегрузки информацией. В этой игре была допущена ошибка слишком &lt;strong&gt;сильного героя&lt;/strong&gt;, которого пришлось компенсировать такими же сильными врагами.&lt;/p&gt;
  &lt;h2 id=&quot;HWsX&quot;&gt;Игры Майкла Бро (Michael Brough)&lt;/h2&gt;
  &lt;p id=&quot;iHJq&quot;&gt;Пока у меня не дошли руки поиграть в игры самого родоначальника жанра.&lt;/p&gt;
  &lt;p id=&quot;OFnC&quot;&gt;Ключевой игрой Michael Brough считается &lt;a href=&quot;https://store.steampowered.com/app/274700/868HACK/&quot; target=&quot;_blank&quot;&gt;868-Hack&lt;/a&gt;. Игра есть в стиме и на мобилках. И если я все-таки доберусь до нее, то сделаю отдельный пост.&lt;/p&gt;
  &lt;figure id=&quot;59WH&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/33/df/33dfac3b-bbe8-47f1-83e8-58f5f3350097.png&quot; width=&quot;765&quot; /&gt;
    &lt;figcaption&gt;Выглядит угрожающе, но по геймплею вроде не все так страшно&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;iKbz&quot;&gt;Деконструкция жанра и идеи&lt;/h2&gt;
  &lt;p id=&quot;54C5&quot;&gt;Итак, допустим я захочу сделать игру в таком жанре. На какие вопросы мне нужно ответить?&lt;/p&gt;
  &lt;p id=&quot;cuqg&quot;&gt;Базовые вещи:&lt;/p&gt;
  &lt;ul id=&quot;9It9&quot;&gt;
    &lt;li id=&quot;FzBF&quot;&gt;Поле игры. Небольшое. Оно может быть:&lt;/li&gt;
    &lt;ul id=&quot;xXZx&quot;&gt;
      &lt;li id=&quot;wyVp&quot;&gt;С квадратными или гексагональными клетками.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;NPwh&quot;&gt;Клетки поля:&lt;/li&gt;
    &lt;ul id=&quot;4BRv&quot;&gt;
      &lt;li id=&quot;QRC3&quot;&gt;Между клетками могут быть стенки.&lt;/li&gt;
      &lt;li id=&quot;4907&quot;&gt;Клетки могут быть ямами.&lt;/li&gt;
      &lt;li id=&quot;1DYk&quot;&gt;Могут быть платформы-возвышенности, в этом случае есть смысл дать герою забираться на эти платформы. Это может породить множество механик, таких как спрыгивание на врагов. См. &lt;a href=&quot;https://teletype.in/@ig0rstepan0v/UFO-50-Bug-hunter&quot; target=&quot;_blank&quot;&gt;Bug Hunter.&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;Sit4&quot;&gt;Могут быть телепорты в случайное или определенное место на карте.&lt;/li&gt;
      &lt;li id=&quot;DFkE&quot;&gt;Могут быть клетки-конвейерные ленты, которые перемещают героев или врагов.&lt;/li&gt;
      &lt;li id=&quot;Kaz9&quot;&gt;Некоторые клетки могут менять скорость перемещения, ускорять или замедлять. Что-то вроде льда или клея.&lt;/li&gt;
      &lt;li id=&quot;2rpn&quot;&gt;Возможно, некоторые клетки могут усилить атаку героя или врага, которые на них стоят.&lt;/li&gt;
      &lt;li id=&quot;O2s3&quot;&gt;Возможны шипы или разлитая кислота на клетках, которые наносят всем урон. Хотя, некоторые враги могут быть невосприимчивы к урону.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;ix1f&quot;&gt;Герой:&lt;/li&gt;
    &lt;ul id=&quot;PDvI&quot;&gt;
      &lt;li id=&quot;eQGa&quot;&gt;У героя есть здоровье или всего одна жизнь.&lt;/li&gt;
      &lt;li id=&quot;yVAD&quot;&gt;Перемещение героя может быть реализовано по-разному. Обычно это движение на один шаг в сторону. Но можно попробовать перемещения до ближайшей стенки, как катящийся шарик.&lt;/li&gt;
      &lt;li id=&quot;wCwE&quot;&gt;Герой может атаковать врага вместо перемещения. Также герой может атаковать врага даже на расстоянии, как это сделано в 868-Hack.&lt;/li&gt;
      &lt;li id=&quot;8ZsI&quot;&gt;Одно действие героя — один ход.&lt;/li&gt;
      &lt;li id=&quot;XWTR&quot;&gt;Атака приоритетнее хода. Если можно атаковать, то герой атакует.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;rWU3&quot;&gt;Движение врагов:&lt;/li&gt;
    &lt;ul id=&quot;BpF0&quot;&gt;
      &lt;li id=&quot;2QjS&quot;&gt;Враги могут преследовать героя по кратчайшему пути.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul id=&quot;cZQw&quot;&gt;
      &lt;li id=&quot;oCwj&quot;&gt;Возможны враги, которые наоборот убегают от героя и атакуют дальними атаками.&lt;/li&gt;
      &lt;li id=&quot;7Ii8&quot;&gt;Враги могут быть статичными, но атакующими. Назовем это «ленивыми» врагами.&lt;/li&gt;
      &lt;li id=&quot;2o5T&quot;&gt;Враги могут двигаться по какому-то маршруту. «Патрулирующие» враги.&lt;/li&gt;
      &lt;li id=&quot;RVNj&quot;&gt;Враги могут отличаться скоростью перемещения, сколько клеток они преодолевают за один раз.&lt;/li&gt;
      &lt;li id=&quot;0V0o&quot;&gt;Некоторые враги могут двигаться по диагонали.&lt;/li&gt;
      &lt;li id=&quot;3HVL&quot;&gt;Враги атакуют, если герой в радиусе поражения.&lt;/li&gt;
      &lt;li id=&quot;wj1I&quot;&gt;Возможны враги, которые ходят и атакуют сразу за один ход.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;Ofj1&quot;&gt;Свойства врагов:&lt;/li&gt;
    &lt;ul id=&quot;i6Wx&quot;&gt;
      &lt;li id=&quot;rTSY&quot;&gt;Разная восприимчивость к урону от объектов. Кто-то не падает в ямы, кто-то может проходить по кислоте или шипам без урона.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;41KG&quot;&gt;Другие объекты:&lt;/li&gt;
    &lt;ul id=&quot;hrwo&quot;&gt;
      &lt;li id=&quot;qxOq&quot;&gt;Бомбы. Чтобы активировать, нужно атаковать. Имеют таймер до взрыва.&lt;/li&gt;
      &lt;li id=&quot;4CXv&quot;&gt;Каменный шар. Можно толкнуть и тот покатится, давя врагов и разрушая объекты на своем пути.&lt;/li&gt;
      &lt;li id=&quot;6chx&quot;&gt;Кнопка и ловушка. Встаем на кнопку — активируется ловушка в другой клетке. Например, выпускает стрелу или огонь, давит врагов прессом, роняет люстру с потолка на клетку.&lt;/li&gt;
      &lt;li id=&quot;oU87&quot;&gt;Огонь. Можно поджечь клетку, и она будет гореть несколько ходов.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;eZrv&quot;&gt;Спеллы и пассивки.&lt;/li&gt;
    &lt;ul id=&quot;5TBk&quot;&gt;
      &lt;li id=&quot;TJXX&quot;&gt;Герой должен прокачиваться, получая активные и пассивные способности.&lt;/li&gt;
      &lt;li id=&quot;XKTN&quot;&gt;У спеллов есть кулдаун или они должны тратить некоторый ресурс.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;JJQt&quot;&gt;Ресурс.&lt;/li&gt;
    &lt;ul id=&quot;Vdn2&quot;&gt;
      &lt;li id=&quot;PMuu&quot;&gt;В игре могут быть монетки для покупки заклинаний и собираемая мана/энергия для использования.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;xSq5&quot;&gt;Цель игры.&lt;/li&gt;
    &lt;ul id=&quot;6SIL&quot;&gt;
      &lt;li id=&quot;XK8C&quot;&gt;Игра может вестись на очки. Нужно решить, как зарабатываются очки. Например, за убийство врагов или прохождение уровня.&lt;/li&gt;
      &lt;li id=&quot;V3RI&quot;&gt;Для более быстрого набора очков может использоваться счетчик комбо. Например, подряд убитые враги дают в два раза больше очков.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;tq4q&quot;&gt;Кривая сложности.&lt;/li&gt;
    &lt;ul id=&quot;Th4I&quot;&gt;
      &lt;li id=&quot;aAWN&quot;&gt;Игра должна усложняться в течение одной попытки. Нужно будет компенсировать прокачку героя более сложными ситуациями, возможно большим количеством врагов.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;nHVk&quot;&gt;Такой вот стартовый набор для размышлений. Возможно, я когда-нибудь снова вернусь к этому жанру, как к одной из идей для домашнего проекта.&lt;/p&gt;

</content></entry><entry><id>ig0rstepan0v:Danger-of-adaptive-difficulty</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/Danger-of-adaptive-difficulty?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Хотел как лучше. Как я испортил игру динамической сложностью</title><published>2025-12-10T15:43:07.451Z</published><updated>2025-12-12T19:08:50.682Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f7/dd/f7dd137a-6b0a-4997-89f3-b1d5b55c6cd2.png"></media:thumbnail><category term="dekonstrakty" label="Деконстракты"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/21/c2/21c23f8f-80a2-4a81-bfa9-8ee5a85c4e4f.png&quot;&gt;Когда-то во время флеш-игр я сделал небольшую логическую игру «Спартанцы против гоблинов».</summary><content type="html">
  &lt;p id=&quot;9U9r&quot;&gt;Когда-то очень давно, еще во времена флеш-игр, я сделал небольшую логическую игру «&lt;a href=&quot;https://www.newgrounds.com/portal/view/603301&quot; target=&quot;_blank&quot;&gt;Спартанцы против гоблинов&lt;/a&gt;». &lt;/p&gt;
  &lt;figure id=&quot;gSrD&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/hW_74JJUAHM?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;YUqL&quot;&gt;Правила игры основаны на шахматной игре «Пешечная дуэль». Мы играем тремя пешками против трех пешек соперника. Задача: загнать оппонента в угол и лишить его возможности ходить.&lt;/p&gt;
  &lt;figure id=&quot;SA0H&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/76/ab7634c5-b779-42bb-80df-7098eb580d4a.png&quot; width=&quot;635&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CjGR&quot;&gt;В игре я сделал &lt;strong&gt;динамическую сложность&lt;/strong&gt; противника. Его IQ меняется в зависимости от того, как играет игрок. Если игрок выигрывает, то противник становится сложнее и делает умные ходы, в случае проигрыша противник становится слабее.&lt;/p&gt;
  &lt;p id=&quot;c4PT&quot;&gt;Это было ошибкой. За счет такой динамической сложности игроки никак не могли научиться играть. Вместо того, чтобы много раз ошибаться и искать верную стратегию против сложного противника, игроки скатывались к слабому сопернику и ничему не учились. После прохождения игры они оставались с теми же знаниями, какими они были в начале. Игра, по сути, не давала никакого прогресса.&lt;/p&gt;
  &lt;p id=&quot;7gHb&quot;&gt;Это снизило оценку игры. Игроки оценили ее в ⭐ 3.36/5.&lt;/p&gt;
  &lt;p id=&quot;6wOy&quot;&gt;Это замечали &lt;a href=&quot;https://www.newgrounds.com/portal/view/603301&quot; target=&quot;_blank&quot;&gt;в комментариях&lt;/a&gt; к игре. Пример комментария:&lt;/p&gt;
  &lt;blockquote id=&quot;AylB&quot;&gt;Intresting idea wierd execution.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;yZrY&quot;&gt;It would be nice if you could choose which ai you wanted to play, and it would be good if the level 1 ai actually tried to fight instead of giving you the game for free. I didn&amp;#x27;t really understand how to play because they kept giving me the win.&lt;/blockquote&gt;
  &lt;p id=&quot;If4I&quot;&gt;Перевод:&lt;/p&gt;
  &lt;blockquote id=&quot;LD5S&quot;&gt;Интересная идея, но странная реализация.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;vzJm&quot;&gt;Было бы неплохо, если бы можно было выбирать, за какого ИИ играть, и было бы неплохо, если бы ИИ первого уровня действительно пытался сражаться, а не давал игру бесплатно. Я не очень понимал, как играть, потому что они постоянно давали мне победу.&lt;/blockquote&gt;
  &lt;h2 id=&quot;Ct2J&quot;&gt;Мысль&lt;/h2&gt;
  &lt;p id=&quot;SsC8&quot;&gt;Сложно научиться играть в игру, которая как &lt;strong&gt;желе&lt;/strong&gt;, только и делает, что старается подстроиться под игрока.&lt;/p&gt;
  &lt;p id=&quot;dBa5&quot;&gt;Я бы провел аналогию с автомобилем и скользкой горой. Игрок пытается заехать на гору, но гора под ним тает от бешеного кручения колес. В итоге гора будет побеждена и просто растает, но игрок так ничему и не научится, и не получит удовлетворения от такой игры.&lt;/p&gt;
  &lt;figure id=&quot;T5KY&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/21/c2/21c23f8f-80a2-4a81-bfa9-8ee5a85c4e4f.png&quot; width=&quot;1536&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>ig0rstepan0v:Game-prototype-using-Deepseek</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/Game-prototype-using-Deepseek?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Сделал прототип игры с помощью Deepseek (делюсь игрой и промтами)</title><published>2025-11-21T09:02:29.755Z</published><updated>2025-11-21T10:55:04.290Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/5a/59/5a59c83b-f3d2-4b56-a631-375d6112a47b.png"></media:thumbnail><category term="instrumenty" label="Инструменты"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/2c/64/2c64a6b5-797e-4dc1-9861-6124eabd9aff.png&quot;&gt;Решил попробовать прототипирование игр с помощью нейросетей. Хочу поставить несколько экспериментов на эту тему.</summary><content type="html">
  &lt;p id=&quot;GzMy&quot;&gt;Решил попробовать прототипирование игр с помощью нейросетей. Хочу поставить несколько экспериментов на эту тему.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;vUva&quot;&gt;Ссылка на телеграмм-канал, в котором все посты: &lt;a href=&quot;https://t.me/SecretRoom_Gamedesign&quot; target=&quot;_blank&quot;&gt;https://t.me/SecretRoom_Gamedesign&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;9QAz&quot;&gt;Для первой пробы я взял игру из UFO 50, о &lt;a href=&quot;https://teletype.in/@ig0rstepan0v/UFO-50-Party-house&quot; target=&quot;_blank&quot;&gt;которой писал ранее&lt;/a&gt; и через примерно 50-60 запросов к Deepseek сделал прототип клона на HTML.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;GoKq&quot;&gt;На выходе я получил три файла, которые можно закинуть в папку на компе и запустить index.html или запаковать три файла в архив и залить, например, на itch.io.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;5c9g&quot;&gt;&lt;a href=&quot;https://ig0rstepan0v.itch.io/party-house-from-ufo-50?secret=pWwlrzezpgYq9Rg8eCb7foReVM&quot; target=&quot;_blank&quot;&gt;Результат&lt;/a&gt;, в который можно поиграть:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;vvIN&quot; class=&quot;m_retina&quot;&gt;
      &lt;img src=&quot;https://img3.teletype.in/files/2c/64/2c64a6b5-797e-4dc1-9861-6124eabd9aff.png&quot; width=&quot;549&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;p id=&quot;tInP&quot;&gt;Архив с полученными файлами:&lt;/p&gt;
  &lt;p id=&quot;dY9G&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1pWh-eOahlFaSOFMT-GY79BA6IPprBeen/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;https://drive.google.com/file/d/1pWh-eOahlFaSOFMT-GY79BA6IPprBeen/view?usp=sharing&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;ZtBR&quot;&gt;История моих запросов к сети очень похожа на процесс создания игры с нуля. Когда есть только базовая идея, которая постепенно обрастает новыми подробностями.&lt;/p&gt;
  &lt;p id=&quot;t6UB&quot;&gt;Я вынес ключевые сообщения в отдельный документ. Можно быстро пробежаться и понять, какие промты у меня были. В этом документе отдельным цветом &lt;strong&gt;выделил 23 бага&lt;/strong&gt;, которые мы вместе с нейросетью исправляли в процессе.&lt;/p&gt;
  &lt;p id=&quot;slWd&quot;&gt;Итак, краткая история переписки &lt;a href=&quot;https://teletype.in/@ig0rstepan0v/Deepseek-log-for-Party-house&quot; target=&quot;_blank&quot;&gt;по ссылке&lt;/a&gt;&lt;a href=&quot;https://teletype.in/@ig0rstepan0v/H46mJ1YPu__&quot; target=&quot;_blank&quot;&gt;:&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;VMIo&quot; class=&quot;m_retina&quot;&gt;
      &lt;img src=&quot;https://img2.teletype.in/files/57/74/577434c4-e099-425c-9807-742c7120a369.png&quot; width=&quot;362.5&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;p id=&quot;ZMAc&quot;&gt;А вот уже полная история моей переписки с Deepseek с его ответами:&lt;/p&gt;
  &lt;ol id=&quot;OPaW&quot;&gt;
    &lt;li id=&quot;Fy2Z&quot;&gt;Part 1: &lt;a href=&quot;https://chat.deepseek.com/share/qn7h4zvg21atyuylkg&quot; target=&quot;_blank&quot;&gt;https://chat.deepseek.com/share/qn7h4zvg21atyuylkg&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;Z0mz&quot;&gt;Part 2: &lt;a href=&quot;https://chat.deepseek.com/share/qkprmyqo1jle6bj6an&quot; target=&quot;_blank&quot;&gt;https://chat.deepseek.com/share/qkprmyqo1jle6bj6an&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;cwOp&quot;&gt;Part 3: &lt;a href=&quot;https://chat.deepseek.com/share/wylte67psv4rhajqq8&quot; target=&quot;_blank&quot;&gt;https://chat.deepseek.com/share/wylte67psv4rhajqq8&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;iLoy&quot;&gt;Готовый промт для экспериментов&lt;/h2&gt;
  &lt;p id=&quot;JvVb&quot;&gt;Продолжая эксперимент, попробовал написать один большой промт, с помощью которого можно самим сделать игру, но уже в вашей любимой нейросети.&lt;/p&gt;
  &lt;p id=&quot;GxGt&quot;&gt;Вам, возможно, понадобится редактор для более удобной работы с скриптами, рекомендую установить &lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot;&gt;VS Code&lt;/a&gt; или &lt;a href=&quot;https://notepad-plus-plus.org/downloads/&quot; target=&quot;_blank&quot;&gt;Notepad++&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;lm43&quot;&gt;Итак, промт:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;7His&quot;&gt;Напиши на html игру. Предоставь этот код в виде отдельных трех файлов html, css и javascript.&lt;/p&gt;
    &lt;p id=&quot;bAxz&quot;&gt;Правила игры:&lt;/p&gt;
    &lt;p id=&quot;4CiD&quot;&gt;У игрока есть ресурсы: Желтые жетоны (иконка солнышка) и зеленые жетоны (иконка знака доллара). Максимальное количество жетонов на счету игрока — 65 желтых и 30 зеленых.&lt;/p&gt;
    &lt;p id=&quot;zEt3&quot;&gt;Существуют карты с различными типами. Каждая карта имеет свойства:&lt;/p&gt;
    &lt;ol id=&quot;NFhU&quot;&gt;
      &lt;li id=&quot;cWMl&quot;&gt;Стоимость в желтых жетонах в магазине.&lt;/li&gt;
      &lt;li id=&quot;dr18&quot;&gt;Сколько жетонов дает карта при нахождении на столе. Сколько желтых и сколько зеленых. Значения могут быть отрицательными.&lt;/li&gt;
      &lt;li id=&quot;lSHl&quot;&gt;Название карты.&lt;/li&gt;
      &lt;li id=&quot;sCtp&quot;&gt;Описание карты.&lt;/li&gt;
      &lt;li id=&quot;su3d&quot;&gt;Иконка эмодзи, отображаемая на карте.&lt;/li&gt;
      &lt;li id=&quot;7k6f&quot;&gt;Опасная карта или нет.&lt;/li&gt;
      &lt;li id=&quot;1tqP&quot;&gt;Сколько карт в магазине такого типа можно купить.&lt;/li&gt;
      &lt;li id=&quot;JeRI&quot;&gt;Звездная карта или нет.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;p id=&quot;DKJm&quot;&gt;У нас есть стол, на который кладутся карты из колоды. На столе ограниченное количество слотов = 5.&lt;/p&gt;
    &lt;p id=&quot;WV35&quot;&gt;Какие типы карт есть в игре:&lt;/p&gt;
    &lt;ol id=&quot;U0Lm&quot;&gt;
      &lt;li id=&quot;pM4N&quot;&gt;Приятель. Стоимость — 2 желтых жетона. Дает 1 желтый, 0 зеленых. 4 карты в магазине. Эмодзи — Студент. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;toFF&quot;&gt;Мажор. Стоимость — 3 желтых жетона. Дает 0 желтый, 1 зеленых. 4 карты в магазине. Эмодзи — Портфель. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;f9L1&quot;&gt;Дебошир. Не продается в магазине. Дает 2 желтый, 0 зеленых. Эмодзи — Кулак. Опасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;F5py&quot;&gt;Водитель. Стоимость — 3 желтых жетона. Дает 0 желтый, 0 зеленых. 4 карты в магазине. Эмодзи — Машина. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;7um0&quot;&gt;Обезьяна. Стоимость — 3 желтых жетона. Дает 4 желтый, 0 зеленых. 4 карты в магазине. Эмодзи — Обезьяна. Опасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;34Vj&quot;&gt;Вышибала. Стоимость — 4 желтых жетона. Дает 0 желтый, 0 зеленых. 4 карты в магазине. Эмодзи — Сапог. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;1BGh&quot;&gt;Билетерша. Стоимость — 4 желтых жетона. Дает -1 желтый, 2 зеленых. 4 карты в магазине. Эмодзи — Билет. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;OU93&quot;&gt;Собака. Стоимость — 4 желтых жетона. Дает 2 желтый, 0 зеленых. 4 карты в магазине. Эмодзи — Собака. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;717C&quot;&gt;Хиппи. Стоимость — 4 желтых жетона. Дает 1 желтый, 0 зеленых. 4 карты в магазине. Эмодзи — Лист дерева. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;5kxU&quot;&gt;Рок-звезда. Стоимость — 5 желтых жетона. Дает 3 желтый, 2 зеленых. 4 карты в магазине. Эмодзи — Гитара. Опасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;kDhv&quot;&gt;Комик. Стоимость — 5 желтых жетона. Дает 0 желтый, -1 зеленых. 4 карты в магазине. Эмодзи — Клоун. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;RkP6&quot;&gt;Повар. Стоимость — 5 желтых жетона. Дает 4 желтый, -1 зеленых. 4 карты в магазине. Эмодзи — Повар. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;y56c&quot;&gt;Плюсик. Стоимость — 5 желтых жетона. Дает 3 желтый, 0 зеленых. 4 карты в магазине. Эмодзи — Парочка. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;znmL&quot;&gt;Чирлидер. Стоимость — 7 желтых жетона. Дает 0 желтый, 0 зеленых. 4 карты в магазине. Эмодзи — Чирлидер. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;YP7f&quot;&gt;Меценат. Стоимость — 9 желтых жетона. Дает 0 желтый, 3 зеленых. 4 карты в магазине. Эмодзи — Мешок денег. Неопасная. Незвездная.&lt;/li&gt;
      &lt;li id=&quot;sMd5&quot;&gt;Инопланетянин. Стоимость — 40 желтых жетона. Дает 0 желтый, 0 зеленых. Бесконечное количество карт в магазине. Эмодзи — Инопланетянин. Неопасная. Звездная.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;p id=&quot;OGuc&quot;&gt;В колоде игрока изначально лежат следующие карты:&lt;/p&gt;
    &lt;p id=&quot;r2lq&quot;&gt;4 приятеля, 2 мажора, 4 дебошира.&lt;/p&gt;
    &lt;p id=&quot;qU2g&quot;&gt;Процесс игры:&lt;/p&gt;
    &lt;p id=&quot;w3IM&quot;&gt;У нас 25 раундов.&lt;/p&gt;
    &lt;p id=&quot;eBRg&quot;&gt;Каждый раунд мы последовательно достаем карты из перемешанной колоды по запросу игрока. Каждая карта кладется на площадку. Игрок может остановить раунд, нажав на специальную кнопку. После остановки карты перестают доставаться из колоды. Если закончились свободные площадки или игрок остановил игру сам, происходит подсчет ресурсов.&lt;/p&gt;
    &lt;p id=&quot;VVfu&quot;&gt;Если в процессе выставления карт на стол, на столе окажется более трех опасных карт, то раунд считается проигранным и ресурсы за этот раунд не получаются.&lt;/p&gt;
    &lt;p id=&quot;Ch54&quot;&gt;Также раунд проигрывается, если карта Плюсик оказывается на столе, но после нее нет больше свободного слота. Причина — переполнение дома.&lt;/p&gt;
    &lt;p id=&quot;QEQ4&quot;&gt;В игре есть магазин, где можно покупать новые карты между раундами. Купленные карты добавляются в колоду игрока.&lt;/p&gt;
    &lt;p id=&quot;W4CV&quot;&gt;Текущую колоду карт игрока можно посмотреть в отдельном окне.&lt;/p&gt;
    &lt;p id=&quot;QeJc&quot;&gt;В магазине можно покупать дополнительные слоты для стола. Первый слот стоит 2 зеленых жетона, второй — три, и так далее...&lt;/p&gt;
    &lt;p id=&quot;GjZ1&quot;&gt;Цель игры — провести такой раунд из 25, чтобы на столе было не менее 4 звездных карт.&lt;/p&gt;
    &lt;p id=&quot;opPX&quot;&gt;У некоторых карт есть активные способности. Когда такая карта на столе на нее можно нажать и применить ее активную способность. У каждой карты за один раунд только одно применение способности.&lt;/p&gt;
    &lt;p id=&quot;Ru9H&quot;&gt;Карты с активными способностями:&lt;/p&gt;
    &lt;ol id=&quot;S7l2&quot;&gt;
      &lt;li id=&quot;s0me&quot;&gt;Собака. При нажатии на собаку вызывается окно, в котором отображается одна карта из оставшейся колоды. Карту можно забрать и положить на стол или удалить из колоды до конца раунда. Отказаться от выбора нельзя.&lt;/li&gt;
      &lt;li id=&quot;RU7k&quot;&gt;Водитель. При нажатии вызывается окно, в котором отображаются все оставшиеся карты в колоде. Можно выбрать одну из карт и положить на стол. Окно можно закрыть и тогда способность не расходуется.&lt;/li&gt;
      &lt;li id=&quot;mdFl&quot;&gt;Вышибала. При нажатии вызывается окно, в котором отображаются все карты на столе, исключая саму карту вышибалы. Можно выбрать 1 карту и убрать со стола. Окно можно закрыть и тогда способность не расходуется.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;p id=&quot;IhJB&quot;&gt;У некоторых карт есть пассивные способности.&lt;/p&gt;
    &lt;p id=&quot;9end&quot;&gt;Карты с пассивными способностями:&lt;/p&gt;
    &lt;ol id=&quot;KOLv&quot;&gt;
      &lt;li id=&quot;jCKx&quot;&gt;Хиппи. Каждый хиппи на столе увеличивает лимит опасных карт в раунде. Например, если есть 1 хиппи на столе, то раунд проигрывается, если достигаем 4 опасных карт, а не трех, как обычно.&lt;/li&gt;
      &lt;li id=&quot;YiG7&quot;&gt;Комик. Если в конце раунда все слоты будут заняты, то каждый комик дает бонус 5 желтых жетонов.&lt;/li&gt;
      &lt;li id=&quot;exvk&quot;&gt;Плюсик. Когда карта появляется на столе, сразу же кладется из колоды еще одна карта. Если для новой карты нет места, раунд проигрывается, так как дом переполнен.&lt;/li&gt;
      &lt;li id=&quot;sbov&quot;&gt;Чирлидер. В конце раунда дается бонус в желтых жетонах, который зависит от количества чирлидеров на столе. 1 чирлидер = 1 желтый жетон, 2 = 4, 3 = 9, 4 = 16.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;p id=&quot;78aY&quot;&gt;Внешний вид карт на столе: когда карта на столе, на ней должна отображаться эмодзи, сколько карта дает, опасная она или нет, если опасная помечается красным крестиком, звездная карта или нет, если звездная, то помечается звездой.&lt;/p&gt;
    &lt;p id=&quot;COYi&quot;&gt;Сделай игру минималистичной и постарайся избежать перегрузки интерфейса лишними сообщениями. Например, при покупке карты просто купи и положи ее в колоду. Не нужно сопроводительных сообщений.&lt;/p&gt;
    &lt;p id=&quot;OFPJ&quot;&gt;Но когда на столе есть слишком много опасных карт, то есть осталась одна опасная карта до проигрыша, то выводи предупреждение.&lt;/p&gt;
    &lt;p id=&quot;B1EK&quot;&gt;Также выводи шанс вытаскивания опасной карты из колоды, когда осталась одна опасная карта до проигрыша.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>ig0rstepan0v:UFO-50-Party-house</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/UFO-50-Party-house?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Party house (UFO 50). Любопытная механика декбилдера</title><published>2025-07-17T11:31:18.178Z</published><updated>2025-12-12T19:17:01.714Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/d7/fd/d7fd39d6-6af2-4afe-85d0-7fbb4bb90b9b.png"></media:thumbnail><category term="igry" label="Игры"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/52/23/52235c7d-d8fb-4783-a180-40172760de21.png&quot;&gt;Прохожу потихоньку сборник UFO 50. Я уже писал об одной игре из этого сборника ранее. Сейчас я дошел до игры Party house, и о ней мне тоже захотелось поговорить отдельно, потому что в механике игры я увидел потенциал, возможность развить ее в нечто большее.</summary><content type="html">
  &lt;p id=&quot;sLxd&quot;&gt;Прохожу потихоньку сборник &lt;a href=&quot;https://store.steampowered.com/app/1147860/UFO_50/&quot; target=&quot;_blank&quot;&gt;UFO 50&lt;/a&gt;. Я уже писал об &lt;a href=&quot;https://teletype.in/@ig0rstepan0v/UFO-50-Bug-hunter&quot; target=&quot;_blank&quot;&gt;игре Bug Hunter&lt;/a&gt; из сборника. Сейчас дошел до игры &lt;strong&gt;Party house&lt;/strong&gt;, и о ней мне тоже захотелось поговорить отдельно, потому что в ее механике я увидел потенциал и возможность развить геймплей в нечто большее.&lt;/p&gt;
  &lt;figure id=&quot;BAl3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/52/23/52235c7d-d8fb-4783-a180-40172760de21.png&quot; width=&quot;1436&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hdg0&quot;&gt;Игра представляет собой декбилдер. В ней есть что-то от любимой всеми &lt;a href=&quot;https://store.steampowered.com/app/2379780/Balatro/&quot; target=&quot;_blank&quot;&gt;Balatro &lt;/a&gt;и что-то от Блекджека.&lt;/p&gt;
  &lt;h2 id=&quot;k4Q1&quot;&gt;Правила&lt;/h2&gt;
  &lt;h3 id=&quot;2zt5&quot;&gt;Вечеринка&lt;/h3&gt;
  &lt;p id=&quot;lWGx&quot;&gt;У нас есть дом, в который мы можем пускать гостей по одному человеку. У дома есть вместимость, которую мы сможем потом увеличить за деньги.&lt;/p&gt;
  &lt;p id=&quot;mSbV&quot;&gt;Каждый гость может принести ресурсы: &lt;strong&gt;популярность&lt;/strong&gt; и/или &lt;strong&gt;деньги&lt;/strong&gt;. (Впрочем, есть гости, которые наоборот могут брать плату.)&lt;/p&gt;
  &lt;p id=&quot;KbMr&quot;&gt;Есть особенный тип гостей — «&lt;strong&gt;проблемные&lt;/strong&gt;» (друзья-дебоширы, гангстеры, игроки в карты...). Если таких на вечеринке будет 3 штуки, то приедет полиция и закроет вечеринку — вы не получите с этой вечеринки ни популярности, ни денег.&lt;/p&gt;
  &lt;p id=&quot;TIt3&quot;&gt;Вы сами должны решить, в какой момент вы закроете вход и остановите вечеринку.&lt;/p&gt;
  &lt;p id=&quot;wzmY&quot;&gt;Таким образом, в игре есть механика «испытай свою удачу» (push your luck), как в Блекджеке. Вы можете продолжать рисковать и приглашать гостей, но есть риск провалить всю вечеринку.&lt;/p&gt;
  &lt;h3 id=&quot;1l4C&quot;&gt;Формирование колоды&lt;/h3&gt;
  &lt;p id=&quot;GOQ6&quot;&gt;Гости выбираются случайно из вашей &lt;strong&gt;колоды&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;iLmI&quot;&gt;В начале игры у вас есть колода из друзей. Кто-то дает популярность (желтая цифра), кто-то деньги (зеленая цифра), кто-то — проблемный гость (обозначены крестиком).&lt;/p&gt;
  &lt;figure id=&quot;dQU1&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/50/2e/502e8680-5f43-4923-9498-902116cd55ec.png&quot; width=&quot;1725&quot; /&gt;
    &lt;figcaption&gt;Стартовая колода&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6Pi5&quot;&gt;После каждой вечеринки вы можете пополнить колоду, «купив» новые карты из магазина за популярность. Ассортимент магазина не бесконечный. Количество оставшихся карт на складе указано под карточкой.&lt;/p&gt;
  &lt;p id=&quot;DHWA&quot;&gt;Если под цифрой красная плашка — то это плата, которую мы должны заплатить гостю за вход.&lt;/p&gt;
  &lt;figure id=&quot;UDTa&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e6/65/e6656e88-f243-4d92-972b-85a3593ad607.png&quot; width=&quot;1427&quot; /&gt;
    &lt;figcaption&gt;Планирование новой вечеринки — добавление новых друзей в уже существующую колоду за популярность. Также здесь можно за деньги увеличить свой дом&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DkZ9&quot;&gt;Гостей из колоды удалять нельзя, можно только увеличивать колоду.&lt;/p&gt;
  &lt;h3 id=&quot;Fcc3&quot;&gt;Способности гостей&lt;/h3&gt;
  &lt;p id=&quot;oY9K&quot;&gt;У гостей могут быть способности, которые имеют решающее значение.&lt;/p&gt;
  &lt;p id=&quot;wq2A&quot;&gt;Примеры способностей:&lt;/p&gt;
  &lt;ul id=&quot;3RwS&quot;&gt;
    &lt;li id=&quot;fKft&quot;&gt;Хиппи — Помогает «утихомирить» одного проблемного гостя.&lt;/li&gt;
    &lt;li id=&quot;2x4E&quot;&gt;Собака — Позволяет один раз за вечеринку подсмотреть следующего гостя в дверях. Гостю можно отказать во входе.&lt;/li&gt;
    &lt;li id=&quot;zVud&quot;&gt;Охранник — Может вышвырнуть одного гостя из вечеринки.&lt;/li&gt;
    &lt;li id=&quot;KG7o&quot;&gt;Комедиант — Даст дополнительную популярность, если весь дом будет заполнен.&lt;/li&gt;
    &lt;li id=&quot;00GY&quot;&gt;Танцовщицы — Чем больше танцовщиц, тем более популярная будет вечеринка.&lt;/li&gt;
    &lt;li id=&quot;LdtV&quot;&gt;Шофер — Может съездить за определенным гостем и привезти его в дом.&lt;/li&gt;
    &lt;li id=&quot;Ew0d&quot;&gt;Журналистка — За каждого проблемного гостя поднимает популярность.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;hl0N&quot;&gt;Цель игры&lt;/h3&gt;
  &lt;p id=&quot;onaW&quot;&gt;У нас есть 25 дней на то, чтобы провести особую вечеринку. На такой вечеринке должно присутствовать 4 звездных гостя. У таких гостей большая цена для добавления в колоду. Соответственно, нам нужно копить популярность, чтобы расширить свою колоду такими гостями.&lt;/p&gt;
  &lt;p id=&quot;XVGC&quot;&gt;Также нам нужно копить деньги на дом, потому что нужно нам много места, чтобы повысить шанс на принятие всех четырех звездных гостей.&lt;/p&gt;
  &lt;p id=&quot;KyLo&quot;&gt;При этом наша колода не должна быть слишком большой по той же причине.&lt;/p&gt;
  &lt;h3 id=&quot;kQth&quot;&gt;Сценарии&lt;/h3&gt;
  &lt;p id=&quot;rvXH&quot;&gt;В игре несколько сценариев, которые отличаются набором гостей в магазине.&lt;/p&gt;
  &lt;p id=&quot;Ay6V&quot;&gt;Также есть бесконечный режим, в котором нужно проходить случайные сценарии подряд. В случайных сценариях карты в магазине выбираются случайно. Чем больше сценариев будет пройдено без проигрыша, тем лучше.&lt;/p&gt;
  &lt;h3 id=&quot;0odo&quot;&gt;PvP&lt;/h3&gt;
  &lt;p id=&quot;t0pR&quot;&gt;Примечательно, что в игре есть соревновательный режим на двоих. В этом режиме вы соревнуетесь за очки популярности.&lt;/p&gt;
  &lt;h2 id=&quot;0dLK&quot;&gt;Особенности геймплея&lt;/h2&gt;
  &lt;p id=&quot;EOdV&quot;&gt;Во-первых, игра очень проста по своей кор-механике. Тапаешь на дверь и запускаешь новых гостей. Иногда можешь рисковать и пускать лишних гостей, задерживая вечеринку. В какой-то момент можно приостановить вечеринку.&lt;/p&gt;
  &lt;p id=&quot;Myw8&quot;&gt;Во-вторых, механика очень азартна и полагается на вашу удачу. Однако, в игре присутствуют стратегии сбора колоды, вариативность.&lt;/p&gt;
  &lt;p id=&quot;blxw&quot;&gt;Мне кажется, что такой геймплей отлично бы лег на мобилки.&lt;/p&gt;
  &lt;p id=&quot;vd85&quot;&gt;Можно даже поразмышлять на тему, мог ли из этого получиться Free-to-play.&lt;/p&gt;
  &lt;h2 id=&quot;xmw0&quot;&gt;Free-to-play?&lt;/h2&gt;
  &lt;p id=&quot;7DLf&quot;&gt;Стартовые мысли, как это может работать:&lt;/p&gt;
  &lt;ul id=&quot;HMCM&quot;&gt;
    &lt;li id=&quot;Fuva&quot;&gt;У нас есть длинная кампания, состоящая из разных сценариев (уровней).&lt;/li&gt;
    &lt;li id=&quot;Nnq4&quot;&gt;Каждый сценарий (уровень) стартует с нуля. Между сценариями переносится только хардвалюта.&lt;/li&gt;
    &lt;li id=&quot;yUw8&quot;&gt;В начале сценария есть стартовая колода.&lt;/li&gt;
    &lt;li id=&quot;gBuj&quot;&gt;Количество игровых дней (раундов) на прохождение сценария не ограничено, но каждый день стоит одну энергию. Энергия ограничена и восстанавливается со временем. Энергию можно покупать за хард-валюту.&lt;/li&gt;
    &lt;li id=&quot;Ad1t&quot;&gt;Упрощаем механику магазина. За проведенные вечеринки мы копим популярность, как и в оригинальной игре. По накоплению необходимого количества-порога, выдаем на выбор три карты гостя, которые можем добавить в колоду. В общем, механика билдостроения как в рогаликах.&lt;/li&gt;
    &lt;li id=&quot;4ACT&quot;&gt;Есть также деньги (софт-валюта), которая зарабатывается с вечеринок. За нее мы можем увеличивать вместимость дома.&lt;/li&gt;
    &lt;li id=&quot;bjHg&quot;&gt;Цель сценария — тут нужно подумать. Либо накопить достаточно много популярности, либо отстроить дом на максимум, либо как и в оригинале привести специальных гостей.&lt;/li&gt;
    &lt;li id=&quot;MRV4&quot;&gt;Очень важно ввести механику &lt;strong&gt;тайм-прессинга&lt;/strong&gt;, чтобы был смысл покупать энергию, а не ждать ее бесплатное накопление.&lt;/li&gt;
    &lt;ul id=&quot;WD8w&quot;&gt;
      &lt;li id=&quot;406b&quot;&gt;Можно попробовать ввести временные карты, которые действуют только ограниченное время (реальное время), затем пропадают из колоды.&lt;/li&gt;
      &lt;li id=&quot;G3RT&quot;&gt;Может быть механика ослабления колоды в оффлайне. Гости могут скучать и пропадать из колоды в случайном порядке.&lt;/li&gt;
      &lt;li id=&quot;Wult&quot;&gt;Это все, конечно, еще должно сопровождаться ивентами, которые могут давать временное усиление.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;rMYp&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b0/a2/b0a2f50c-2469-4d87-a313-b946048ce111.png&quot; width=&quot;775&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;rf2q&quot;&gt;
    &lt;li id=&quot;BiBN&quot;&gt;Сеттинг можно изменить. Это могут быть карты воинов, которых мы собираем в отряд. В конце дня отряд идет в подземелье и добывает опыт. Задача сценария — победить босса подземелья. В качестве проблемных карт могут быть воины-зомби. Их нельзя держать в отряде больше двух, иначе произойдет отравление всего отряда.&lt;/li&gt;
  &lt;/ul&gt;

</content></entry><entry><id>ig0rstepan0v:Chance-calculator</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/Chance-calculator?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Расчет шансов предметов в лутбоксе на основе цен</title><published>2025-05-02T14:49:29.116Z</published><updated>2025-05-05T19:52:23.943Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/8e/63/8e63b13b-75f6-40bf-b78e-80bd4ed139c4.png"></media:thumbnail><category term="matchast" label="Матчасть"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/6e/c7/6ec7c810-8072-444b-89f5-7435c194e26c.png&quot;&gt;Сделал инструмент для геймдизайнеров, которым можно быстро считать шансы в лутбоксах.</summary><content type="html">
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#TFAe&quot;&gt;Пример использования&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#wucw&quot;&gt;Первое рассуждение&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#9T4W&quot;&gt;Функция распределения&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#Tv8c&quot;&gt;Сводим задачу к поиску коэффициентов формулы&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#mFUf&quot;&gt;А что насчет коэффициента «a», а?&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#m5KH&quot;&gt;Первая версия модели&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#9hZT&quot;&gt;Вторая версия&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#5i22&quot;&gt;Ссылка на таблицу&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;p id=&quot;ozKA&quot;&gt;Сделал инструмент для геймдизайнеров, которым можно быстро считать шансы в лутбоксах.&lt;/p&gt;
  &lt;p id=&quot;lrnq&quot;&gt;Видео-инструкция:&lt;/p&gt;
  &lt;figure id=&quot;QOz9&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/f6YPUwXpPpw?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;72hX&quot;&gt;Если посчитаете инструмент полезным, не стесняйтесь делиться ссылкой.&lt;/p&gt;
    &lt;p id=&quot;eS8I&quot;&gt;Если работали с похожими системами, буду рад услышать мнение со стороны.&lt;/p&gt;
    &lt;p id=&quot;anvl&quot;&gt;Телеграмм-канал: &lt;a href=&quot;https://t.me/SecretRoom_Gamedesign&quot; target=&quot;_blank&quot;&gt;https://t.me/SecretRoom_Gamedesign&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;yqpA&quot;&gt;Задача. Дано:&lt;/p&gt;
  &lt;ul id=&quot;xrg5&quot;&gt;
    &lt;li id=&quot;kTVe&quot;&gt;Лутбокс и его цена.&lt;/li&gt;
    &lt;li id=&quot;CWbs&quot;&gt;Лутбокс выдает один предмет.&lt;/li&gt;
    &lt;li id=&quot;8anx&quot;&gt;Список возможных предметов и их цен.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;mRob&quot;&gt;Найти:&lt;/p&gt;
  &lt;ul id=&quot;uMEK&quot;&gt;
    &lt;li id=&quot;hNPq&quot;&gt;Шанс каждого предмета.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;9RWM&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6e/c7/6ec7c810-8072-444b-89f5-7435c194e26c.png&quot; width=&quot;1071&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;RQtI&quot;&gt;Условие:&lt;/p&gt;
  &lt;ul id=&quot;QgLS&quot;&gt;
    &lt;li id=&quot;zdAQ&quot;&gt;Среднее (матожидание) выпадающих предметов из лутбокса = Стоимость лутбокса * (100% - House Edge)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;o1hG&quot;&gt;«House Edge» — комиссия казино. Сколько процентов от оборота товаров оставляет за собой владелец, разыгрывая предметы.&lt;/p&gt;
    &lt;p id=&quot;YTXs&quot;&gt;Например, может быть равна 10%. В этом случае, если лутбокс будет стоить 100 долларов, то в среднем предметы будут падать из него на 90 долларов.&lt;/p&gt;
    &lt;p id=&quot;uIIV&quot;&gt;Другими словами, это сколько процентов комиссии зарабатывает казино.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;TFAe&quot;&gt;Пример использования&lt;/h2&gt;
  &lt;p id=&quot;uqEQ&quot;&gt;Представьте, что у нас есть магазин кейсов с оружием из Counter Strike. Цена оружия динамическая и зависит от ситуации на рынке.&lt;/p&gt;
  &lt;p id=&quot;ax3n&quot;&gt;Вы, как обладатель площадки, владеете складом различного оружия на своих аккаунтах.&lt;/p&gt;
  &lt;p id=&quot;HW0Y&quot;&gt;Вы хотите продавать кейсы с оружием. Из кейса можно получить только одно оружие на основе шансов. Цену кейсов и оружие в них вы формируете заранее.&lt;/p&gt;
  &lt;p id=&quot;DJH2&quot;&gt;Вам нужен инструмент, чтобы вычислять шансы. &lt;/p&gt;
  &lt;p id=&quot;RsAh&quot;&gt;Можно считать это руками довольно простой таблицей, перебирая шансы каждого предмета до тех пор, пока ваше матожидание не сойдется с ценой лутбокса.&lt;/p&gt;
  &lt;p id=&quot;qzlg&quot;&gt;Но что, если таких кейсов очень много, а пересчитывать их нужно часто? Нужна математическая модель для автоматического расчета.&lt;/p&gt;
  &lt;p id=&quot;M3hJ&quot;&gt;Пример такого сайта: &lt;a href=&quot;https://skin.club/en&quot; target=&quot;_blank&quot;&gt;https://skin.club/en&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;lpZM&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/92/6d/926d4152-6496-4a4d-aa04-e799398ee636.png&quot; width=&quot;1105&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NqAd&quot;&gt;Пример кейса с сайта:&lt;/p&gt;
  &lt;figure id=&quot;Xjcv&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ca/99/ca99215c-6514-4e09-9d64-1cafdbafe296.png&quot; width=&quot;1103&quot; /&gt;
    &lt;figcaption&gt;Пример лутбокса за 3.59$. Цены и шансы обновляются почти каждый день&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bSq6&quot;&gt;Давайте посчитаем матожидание из примера на скриншоте и выясним комиссию продавца.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;50Iz&quot;&gt;Матожидание = Сумма произведений (Item price * Item chance)&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;7T73&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/69/53/6953686f-d62a-44d9-a056-527da7474f88.png&quot; width=&quot;327&quot; /&gt;
    &lt;figcaption&gt;Комиссия примерно равна 20%&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;lbma&quot;&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1D7GTmNtxsEESizlEXK2PJIV5jUDY5voKaL29sx0-IVc/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;Ссылка на таблицу&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;dY2N&quot;&gt;Как вычислять шансы?&lt;/p&gt;
  &lt;h2 id=&quot;wucw&quot;&gt;Первое рассуждение&lt;/h2&gt;
  &lt;p id=&quot;65u4&quot;&gt;Довольно быстро стало понятно, что решений у задачи может быть много.&lt;/p&gt;
  &lt;p id=&quot;k0rz&quot;&gt;Я взял пример и перераспределил шансы — получил то же самое матожидание.&lt;/p&gt;
  &lt;figure id=&quot;mEKS&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3c/87/3c872916-d508-47fd-95e8-40993eb95601.png&quot; width=&quot;334&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PoOf&quot;&gt;При одних и тех же входных значениях может быть несколько решений. Значит нам нужен параметр, который будет дополнительно регулировать распределение шансов.&lt;/p&gt;
  &lt;h3 id=&quot;9T4W&quot;&gt;Функция распределения&lt;/h3&gt;
  &lt;p id=&quot;yez8&quot;&gt;Нам нужна функция, которая будет распределять шансы относительно цен. Я взял за основу степенную функцию (гиперболу). Про нее у меня есть &lt;a href=&quot;https://teletype.in/@ig0rstepan0v/Power-function&quot; target=&quot;_blank&quot;&gt;отдельный пост&lt;/a&gt;. Этой функцией мы будем считать веса предметов. В свою очередь шансы будут считаться на основе весов.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;UZfv&quot;&gt;Шанс предмета = Вес предмета / Сумма всех весов.&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;mrNz&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/93/aa937ad0-1f52-4eef-85a2-e9188d9d7ee1.png&quot; width=&quot;246&quot; /&gt;
    &lt;figcaption&gt;Степенная функция&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Sk3G&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/26/eb/26ebf4d6-b290-4a84-b456-455dedd52863.png&quot; width=&quot;923&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;RUWc&quot;&gt;Очевидно, что в списке предметов должны быть предметы разных цен. Обязательно должны быть предметы ниже и выше стоимости сундука. Только в таких случаях задача может быть решаема.&lt;/p&gt;
  &lt;h3 id=&quot;Tv8c&quot;&gt;Сводим задачу к поиску коэффициентов формулы&lt;/h3&gt;
  &lt;p id=&quot;NlQ8&quot;&gt;Итак, у нас есть формула для вычисления веса предмета:&lt;/p&gt;
  &lt;figure id=&quot;wCa9&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/93/aa937ad0-1f52-4eef-85a2-e9188d9d7ee1.png&quot; width=&quot;246&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0BHV&quot;&gt;Задача сводится к тому, чтобы подобрать коэффициенты.&lt;/p&gt;
  &lt;p id=&quot;dCT4&quot;&gt;Какие-то коэффициенты стоит зафиксировать константами. Зафиксируем &lt;strong&gt;power = -1&lt;/strong&gt;, потому что функция должна быть гиперболой и &lt;strong&gt;b = 1&lt;/strong&gt;, потому что вес предмета должен быть больше нуля. (По сути &lt;strong&gt;b&lt;/strong&gt; — минимальный вес).&lt;/p&gt;
  &lt;p id=&quot;EPL7&quot;&gt;В качестве &lt;strong&gt;x&lt;/strong&gt; будет выступать цена предмета.&lt;/p&gt;
  &lt;figure id=&quot;QzQd&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/89/9c/899cb5ab-f7c3-4bb5-a61c-4232d36a53fe.png&quot; width=&quot;293&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;G2we&quot;&gt;Мы будем искать &lt;strong&gt;k&lt;/strong&gt; и &lt;strong&gt;a&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;bQCl&quot;&gt;Допустим, что у нас есть предметы со стоимостями x1, x2 ... xn и весами w1, w2 ... wn.&lt;/p&gt;
  &lt;p id=&quot;RdU9&quot;&gt;Матожидание будет равно:&lt;/p&gt;
  &lt;figure id=&quot;UvxT&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/66/68/6668517f-8345-4db8-989e-55618dce1067.png&quot; width=&quot;292&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Epcn&quot;&gt;В свою очередь веса будут выражены нашей степенной функцией. Подставляем ее вместо w1 ... wn.&lt;/p&gt;
  &lt;figure id=&quot;9W1P&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/78/c6/78c645c4-0f6e-4268-8d6f-8be6203448b2.png&quot; width=&quot;846&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;XDh7&quot;&gt;Раскроем скобки:&lt;/p&gt;
  &lt;figure id=&quot;t9fu&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0d/5b/0d5b21b8-16a3-4d9a-80ec-1834b6494e67.png&quot; width=&quot;882&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;RFWC&quot;&gt;Знаменатель в левую часть:&lt;/p&gt;
  &lt;figure id=&quot;NjdG&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ea/e6/eae69e85-46d5-444c-a494-a1ae23c60f97.png&quot; width=&quot;1017&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;sZz5&quot;&gt;Все, что с коэффициентом &lt;strong&gt;k&lt;/strong&gt; в левую сторону, все остальное в правую:&lt;/p&gt;
  &lt;figure id=&quot;FWqU&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2d/e6/2de644fa-7cbc-4589-8934-5d9aefc89724.png&quot; width=&quot;910&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;P2WB&quot;&gt;Получаем &lt;strong&gt;k&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure id=&quot;Mty4&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0a/68/0a680711-a46e-4291-8668-280ea117f7cc.png&quot; width=&quot;1117&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;BqYk&quot;&gt;Приведу это к приличному виду через промежуточные переменные:&lt;/p&gt;
  &lt;figure id=&quot;nx2m&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ec/bc/ecbcc101-88b7-4d86-abc5-c15595f62d5d.png&quot; width=&quot;559&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;EKAb&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8d/6e/8d6e105e-68e9-420a-8028-44a5d1b67a0b.png&quot; width=&quot;646&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;9J2P&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e2/77/e277d899-22c5-47fc-a07e-fd63dd72445a.png&quot; width=&quot;819&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;k1Sc&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8f/82/8f829aa0-557e-4ed1-b008-f54cbded0cf4.png&quot; width=&quot;776&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CKEw&quot;&gt;Таким образом:&lt;/p&gt;
  &lt;figure id=&quot;UAHY&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0a/59/0a593ac8-af9d-45f2-8fde-045dd9eb544e.png&quot; width=&quot;575&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;mFUf&quot;&gt;А что насчет коэффициента «a», а?&lt;/h3&gt;
  &lt;p id=&quot;5ORL&quot;&gt;Обращусь к своей статье о &lt;a href=&quot;https://teletype.in/@ig0rstepan0v/Power-function&quot; target=&quot;_blank&quot;&gt;степенной функции&lt;/a&gt;. Там я показывал, что коэффициент «&lt;strong&gt;a&lt;/strong&gt;», по своей сути, определяет вертикальную асимптоту гиперболы, то есть границу функции. Очевидно, что граница должна быть левее цены самого дешевого предмета.&lt;/p&gt;
  &lt;figure id=&quot;Dle5&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/6c/aa6c6852-24a7-43bd-943b-20ae3f402560.png&quot; width=&quot;638&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mcRU&quot;&gt;То есть нужно, чтобы &lt;strong&gt;a&lt;/strong&gt; по модулю была меньше цены самого дешевого предмета.&lt;/p&gt;
  &lt;p id=&quot;pLs4&quot;&gt;В какой-то момент, я понял, что будет лучше всего работать не с абстрактным коэффициентом, который нужно подгонять каждый раз под ситуацию, а с каким-то более осмысленным. Поэтому я ввел понятие Grouping.&lt;/p&gt;
  &lt;p id=&quot;GpJU&quot;&gt;Grouping — это расстояние от минимальной цены предметов до асимптоты функции.&lt;/p&gt;
  &lt;figure id=&quot;kO42&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ef/21/ef214a75-2253-441a-905c-c5ce20ee1e97.png&quot; width=&quot;391&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Qaa8&quot;&gt;В свою очередь коэффициент &lt;strong&gt;a&lt;/strong&gt; выразил так:&lt;/p&gt;
  &lt;figure id=&quot;7N6s&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4b/21/4b21d0ff-0b54-40aa-8326-b59fad4bd604.png&quot; width=&quot;486&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;EtGB&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/36/2f/362fc439-eaf5-432a-b23e-4b85a2bc96da.png&quot; width=&quot;449&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fpby&quot;&gt;По-русски я назвал бы этот новый коэффициент «кучностью». Потому что чем больше Grouping, тем более пологая будет кривая за пределами минимальной цены. То есть как бы веса у предметов будут кучковаться или группироваться и быть более похожими.&lt;/p&gt;
  &lt;figure id=&quot;4beL&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/95/92/959226de-b5dd-40ef-8b5b-f0b7d358b535.png&quot; width=&quot;622&quot; /&gt;
    &lt;figcaption&gt;Низкий Grouping. Малая кучность. W1 далеко от W2&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Hv1R&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/28/ba/28ba0de4-8d7c-4815-9893-e0a8f6d61fb5.png&quot; width=&quot;681&quot; /&gt;
    &lt;figcaption&gt;Высокий Grouping. Большая кучность. W1 близко к W2&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;m5KH&quot;&gt;Первая версия модели&lt;/h2&gt;
  &lt;p id=&quot;M7JB&quot;&gt;С этими рассуждениями получилось создать первую версию модели.&lt;/p&gt;
  &lt;figure id=&quot;XLhM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cf/21/cf21bf45-a0d2-4083-94ee-a0f8f0d309ba.png&quot; width=&quot;580&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;GSY6&quot;&gt;В таблице можно указать:&lt;/p&gt;
  &lt;ul id=&quot;BqB3&quot;&gt;
    &lt;li id=&quot;j3wG&quot;&gt;Стоимость лутбокса.&lt;/li&gt;
    &lt;li id=&quot;k6Pw&quot;&gt;House edge (комиссия).&lt;/li&gt;
    &lt;li id=&quot;ZHxz&quot;&gt;Кучность призов (Grouping). В зависимости от призов нужно подбирать,  можно экспериментировать с разной кучностью.&lt;/li&gt;
    &lt;li id=&quot;cJM1&quot;&gt;Строчки с ценами призов. Можно добавлять новые строчки или удалять лишние. Но обязательно продлевайте формулы из строчек на новые строчки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;Y2jI&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e7/eb/e7ebe507-1e02-450d-a60a-974b0c077af5.png&quot; width=&quot;991&quot; /&gt;
    &lt;figcaption&gt;После добавления строчки потяните ячейки с формулами вниз&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;UZRC&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/66/81/66819bd0-87a7-4972-862e-6b8865aaf293.png&quot; width=&quot;977&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;182L&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/5c/c15c8ce5-0ec9-4b89-9246-38130efa8a8a.png&quot; width=&quot;930&quot; /&gt;
    &lt;figcaption&gt;Вбейте цену нового предмета&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MihD&quot;&gt;&lt;strong&gt;Автоматически&lt;/strong&gt; рассчитываются шансы призов в строчках.&lt;/p&gt;
  &lt;p id=&quot;4H3A&quot;&gt;Могут выдаваться следующие ошибки, которые очевидно как исправлять:&lt;/p&gt;
  &lt;figure id=&quot;bvJJ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a2/b2/a2b27f02-b45b-440b-ae3d-cc6ac218cd95.png&quot; width=&quot;363&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;9Sj1&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d9/3e/d93eafd9-5389-4610-845e-ee0334caa5ef.png&quot; width=&quot;375&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;eCdf&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e6/75/e675ac7f-cf97-4a3a-95c1-d684b5e853b8.png&quot; width=&quot;636&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CypQ&quot;&gt;Псевдокод модели:&lt;/p&gt;
  &lt;pre id=&quot;k0sv&quot;&gt;// Constants
power = -1
b = 1

// Input
LootboxPrice
HouseEdge // От 0 до 1
Grouping // Строго &amp;gt; 0
List PriceList // Список цен

// Calculations
SumOfPrices = Sum of elements from PriceList
ExpectedPriceValue = LootboxPrice * (1 - HouseEdge)
MinPrice = Minimum from PriceList
MaxPrice = Minimum from PriceList
If MinPrice &amp;gt;= ExpectedPriceValue then Print(Error: Price of lootbox is too low)
If MaxPrice &amp;lt;= ExpectedPriceValue then Print(Error: Price of lootbox is too high)
a = Grouping - MinPrice
List XList
XList[i] = (PriceList[i] + a) ^ power
SumX = Sum of elements from XList
SumProdX = Sum of (XList[i] * PriceList[i])
Denominator = ExpectedPriceValue * SumX - SumProdX
If Denominator &amp;lt;= 0 then Print(Error: Value of grouping is too high))
k = b * (SumOfPrices - PriceList.Length * ExpectedPriceValue) / Denominator
List WeightList
WeightList[i] = k * (PriceList[i] + a) ^ power + b
SumOfWeights = Sum of elements from WeightList
List ChanceList
ChanceList[i] = WeightList[i] / SumOfWeights
ExpectedPriceValueForVerification = Sum of (PriceList[i] * ChanceList[i])

// Output
ChanceList
ExpectedPriceValueForVerification
&lt;/pre&gt;
  &lt;h2 id=&quot;9hZT&quot;&gt;Вторая версия&lt;/h2&gt;
  &lt;p id=&quot;myua&quot;&gt;Полученная модель хорошо работает не для всех случаев.&lt;/p&gt;
  &lt;p id=&quot;wNvX&quot;&gt;Мне не понравилось как работает модель в случае, если у нас несколько дешевых предметов, которые несильно отличаются в цене, при этом у нас есть очень дорогие предметы.&lt;/p&gt;
  &lt;p id=&quot;SpU9&quot;&gt;Вот пример:&lt;/p&gt;
  &lt;figure id=&quot;tB7r&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e1/9c/e19cc136-154f-4de9-95c5-e393e48145eb.png&quot; width=&quot;539&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cO5W&quot;&gt;Шансы у почти одинаковых предметов (8 и 9 долларов) слишком разные. Я бы хотел, чтобы они были примерно одинаковые. Увеличение кучности в этом случае не сильно помогает.&lt;/p&gt;
  &lt;p id=&quot;v4Wq&quot;&gt;Я подумал, что в такой ситуации есть смысл упаковать все дешевые предметы в одну оболочку, и уже внутри нее решать, какой предмет из нее выпадет.&lt;/p&gt;
  &lt;figure id=&quot;OL26&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a2/45/a2457aa3-aaa2-4f5d-b14e-c3cb51311cd9.png&quot; width=&quot;532&quot; /&gt;
    &lt;figcaption&gt;Упаковываем первые предметы в Internal box&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mPDZ&quot;&gt;Модифицировал таблицу, изменив первый предмет на ссылку на матожидание от internal box:&lt;/p&gt;
  &lt;figure id=&quot;3l8I&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/98/e7/98e7ad89-15b7-4072-9c36-6b5d59cefd03.png&quot; width=&quot;760&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LUsM&quot;&gt;С помощью такого внутреннего бокса можно модифицировать гиперболу, добавляя в нее начальную ступеньку, настраивая ее вручную.&lt;/p&gt;
  &lt;figure id=&quot;RLiV&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/61/07/610798b2-1e62-4778-8ac8-fec7c6d34617.png&quot; width=&quot;824&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;5i22&quot;&gt;Ссылка на таблицу&lt;/h2&gt;
  &lt;p id=&quot;PS4S&quot;&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1kVMa3sadsIP7ehYju5Seq0WoTvBv9lY_DQlrLIOByos/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;https://docs.google.com/spreadsheets/d/1kVMa3sadsIP7ehYju5Seq0WoTvBv9lY_DQlrLIOByos/edit?usp=sharing&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>ig0rstepan0v:UFO-50-Bug-hunter</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/UFO-50-Bug-hunter?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Обзор Bug hunter (UFO 50)</title><published>2025-02-23T15:08:30.068Z</published><updated>2025-12-25T22:26:14.469Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/62/a7/62a7f72b-5ba6-4e80-8261-6b9da1ad0adf.png"></media:thumbnail><category term="dekonstrakty" label="Деконстракты"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/27/3c/273c07a6-b38a-4905-a9d2-f4e01246ed9c.png&quot;&gt;Осенью в Steam вышел UFO 50. Это сборник из ретро-игр для выдуманного компьютера, который по «сюжету» нашли в чьем-то гараже. Если пропустили этот релиз, то советуете обратить на него внимание.</summary><content type="html">
  &lt;p id=&quot;I44r&quot;&gt;Осенью в Steam вышел &lt;a href=&quot;https://store.steampowered.com/app/1147860/UFO_50/&quot; target=&quot;_blank&quot;&gt;UFO 50&lt;/a&gt;. Это сборник игр в ретро-стилистике для выдуманного компьютера, который по «сюжету» нашли в чьем-то гараже. Если пропустили этот релиз, то советую обратить на него внимание.&lt;/p&gt;
  &lt;p id=&quot;0nbC&quot;&gt;Все игры сделаны в одной палитре и в одном разрешении. Игры даже расставлены в хронологическом порядке, в котором они «выходили». Проходя их последовательно, можно проследить эволюцию в дизайне игр.&lt;/p&gt;
  &lt;figure id=&quot;AU7O&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/3c/273c07a6-b38a-4905-a9d2-f4e01246ed9c.png&quot; width=&quot;1526&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;YAqG&quot;&gt;Число 50 в названии — это количество игр в сборнике. Причем каждая игра уникальна и интересна своими особенностями, механиками. На прохождение каждой игры может уйти от 5 до 20 часов. Большая концентрация игрового опыта в одном флаконе.&lt;/p&gt;
  &lt;p id=&quot;QUvR&quot;&gt;Здесь есть аркады, пазлы, рпг, стратегии, рогалики, квесты. Полное разнообразие жанров. Можно познакомиться с новыми механиками, с которыми вы возможно ранее не сталкивались, без лишней обвязки, в духе ретро-минимализма. Игры, как и полагается ретро-геймингу, достаточно сложные, но увлекательные.&lt;/p&gt;
  &lt;figure id=&quot;ruSd&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a0/e5/a0e5818c-1797-4597-8d8b-89d6d0298408.png&quot; width=&quot;1758&quot; /&gt;
    &lt;figcaption&gt;Barbuta — первая игра из сборника. Ретро-метроидвания, в которой вам придется самим рисовать карту на листе бумаги&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MjNw&quot;&gt;Я полноценно пока поиграл в восемь игр, но мне уже понравилось все то, что сборник смог мне предложить.&lt;/p&gt;
  &lt;p id=&quot;AN8L&quot;&gt;Для примера, я хотел бы отдельно остановиться на одной игре из сборника и рассмотреть ее подробнее.&lt;/p&gt;
  &lt;p id=&quot;eCYr&quot;&gt;Игра к рассмотрению: &lt;strong&gt;Bug Hunter&lt;/strong&gt;, она идет на сборнике вторым номером. Это упрощенный тактический пазл-рогалик про истребление жуков.&lt;/p&gt;
  &lt;h2 id=&quot;ILhw&quot;&gt;Цель игры&lt;/h2&gt;
  &lt;p id=&quot;QpI7&quot;&gt;У нас есть игровое поле размером 5×6 клеток. Некоторые клетки являются &lt;strong&gt;платформами&lt;/strong&gt;, и таким образом в игре есть два уровня высоты. Также на поле могут быть &lt;strong&gt;ямы&lt;/strong&gt;, в которые может провалиться герой или враги, если их туда столкнуть.&lt;/p&gt;
  &lt;p id=&quot;NAQs&quot;&gt;Героем у нас выступает космический &lt;strong&gt;десантник&lt;/strong&gt;. В качестве врагов — инопланетные &lt;strong&gt;жуки&lt;/strong&gt; разных видов. Миссия проста: истребить 30 жуков за 10 игровых дней. Если не успеем, то миссия будет провалена. Если успеем — нам дадут новую миссию с чуть более сложными условиями (например, нужно будет справиться с жуками уже за меньшее количество дней).&lt;/p&gt;
  &lt;p id=&quot;q882&quot;&gt;Глобальная задача: сохранить как можно большую цепочку успешно выполненных миссий без проигрышей.&lt;/p&gt;
  &lt;figure id=&quot;plQq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ea/d5/ead5efda-89cc-48d2-8119-50807f9e19cf.png&quot; width=&quot;1879&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rLso&quot;&gt;Каждый день на поле появляется 5 жуков. Если жука не убивать, то он начинает эволюционировать и получает дополнительные свойства, мешающие его убить, например, на нем появляется дополнительная броня или способность контратаковать.&lt;/p&gt;
  &lt;p id=&quot;RrdE&quot;&gt;В конце концов, жук может эволюционировать до яйца. Если оставить &lt;strong&gt;яйцо&lt;/strong&gt; в живых, то на следующий день из него вылупится «орда» жуков. Это событие приведет к проигрышу.&lt;/p&gt;
  &lt;figure id=&quot;Vr3R&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/e4/9ae485ac-e125-415f-b961-7fbedbf97f24.png&quot; width=&quot;979&quot; /&gt;
    &lt;figcaption&gt;Ситуация критическая&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;jmPq&quot;&gt;Есть усложняющая механика: Когда прибывают новые жуки, то они будут находиться уже в той фазе эволюции, в которой находятся существующие жуки на поле. Поэтому важно каждый день стараться зачищать все поле от жуков.&lt;/p&gt;
    &lt;p id=&quot;gZZf&quot;&gt;Механика позволяет держать темп игры, оказывая постоянное давление на игрока.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;0DUw&quot;&gt;Есть вид жука, который контратакует нас после своей смерти, распыляя осколки в соседние клетки. В этом случае, нужно быть осторожнее и убивать жука либо с расстояния, либо находясь на платформе.&lt;/p&gt;
  &lt;p id=&quot;5cTm&quot;&gt;На поле случайно появляются кубы энергии, которые можно подбирать или взрывать. Десантник может убить себя сам, сделав неудачный ход, и устроив взрыв рядом с собой.&lt;/p&gt;
  &lt;p id=&quot;P9YI&quot;&gt;У кубов есть цепная детонирующая реакция. Взрыв одного куба приводит к такому же взрыву соседнего куба.&lt;/p&gt;
  &lt;p id=&quot;dCJt&quot;&gt;Взрывы распространяются только в пределах одной высоты. Если находиться на платформе под взрывом, то будешь в безопасности.&lt;/p&gt;
  &lt;figure id=&quot;tuu3&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0d/5a/0d5a2e8d-a59e-4f54-9412-811508286746.png&quot; width=&quot;975&quot; /&gt;
    &lt;figcaption&gt;Появление новых кубов&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;0rEE&quot;&gt;Итак, есть следующие варианты проигрыша:&lt;/p&gt;
    &lt;ul id=&quot;KQyw&quot;&gt;
      &lt;li id=&quot;sFw2&quot;&gt;Заканчивается количество дней на миссию.&lt;/li&gt;
      &lt;li id=&quot;cVTv&quot;&gt;В конце дня на поле осталось яйцо.&lt;/li&gt;
      &lt;li id=&quot;yj7D&quot;&gt;Быть убитым осколком от жука.&lt;/li&gt;
      &lt;li id=&quot;9ezs&quot;&gt;Взорвать куб энергии рядом с собой.&lt;/li&gt;
      &lt;li id=&quot;ooq6&quot;&gt;Еще можно убить себя своей же специфичной атакой, атаковав клетку, на которой стоит герой.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;arFa&quot;&gt;Модули&lt;/h2&gt;
  &lt;p id=&quot;eEiG&quot;&gt;В начале дня у игрока есть 8 определенных действий (модулей или карточек), которые можно выполнить в любом порядке. Можно переместиться на 2 клетки по прямой линии, перепрыгнуть на ближайшую клетку (в том числе запрыгнуть на подъем), атаковать по прямой или по навесной траектории.&lt;/p&gt;
  &lt;figure id=&quot;b9dc&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ea/42/ea425c78-ee8a-42ee-b4f5-8788b95d28a3.png&quot; width=&quot;877&quot; /&gt;
    &lt;figcaption&gt;Модуль прыжка&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xLEx&quot;&gt;В течении дня игрок может подобрать энергию. И обменять один из своих модулей на другой, купив его в магазине. Причем можно сначала потратить старый модуль, а только потом его поменять на новый. Модуль, полученный из магазина, можно применять в тот же день. Таким образом, за день можно выполнить не 8, а 9 или больше действий.&lt;/p&gt;
  &lt;p id=&quot;eI6G&quot;&gt;Так в игре появляется некоторый декбилдинг, когда по ходу истребления жуков, мы прокачиваем свою «колоду» модулей. Например, можно заменить обычный выстрел на снайперский выстрел, который бьет дальше, или заменить атакующий модуль на вспомогательный, который даст сильную синергию с другим модулем.&lt;/p&gt;
  &lt;figure id=&quot;qr7b&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d4/92/d492ac42-fa74-4048-be82-67946f6960e0.png&quot; width=&quot;885&quot; /&gt;
    &lt;figcaption&gt;Герой собирается выстрелить снайперкой по энергии и устроить взрыв.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mtAX&quot;&gt;Есть три типа модулей:&lt;/p&gt;
  &lt;ul id=&quot;bvba&quot;&gt;
    &lt;li id=&quot;SeX9&quot;&gt;Перемещения. Отличаются свойствами:&lt;/li&gt;
    &lt;ul id=&quot;i9ph&quot;&gt;
      &lt;li id=&quot;f9fC&quot;&gt;Дальность&lt;/li&gt;
      &lt;li id=&quot;oIax&quot;&gt;Можно ли перемещаться по диагонали&lt;/li&gt;
      &lt;li id=&quot;4O4n&quot;&gt;Перемещаться прыжком или по прямой линии. В случае прямой линии, герой будет толкать жуков, если такое возможно. Но взобраться на подъем можно только прыжком.&lt;/li&gt;
      &lt;li id=&quot;xpbG&quot;&gt;Перезаряжается ли модуль убийствами жуков.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;Q1Bb&quot;&gt;Атаки. Отличаются свойствами:&lt;/li&gt;
    &lt;ul id=&quot;HywE&quot;&gt;
      &lt;li id=&quot;GvvY&quot;&gt;Дальность&lt;/li&gt;
      &lt;li id=&quot;oLqW&quot;&gt;Можно ли атаковать по диагонали&lt;/li&gt;
      &lt;li id=&quot;sncz&quot;&gt;Стрелять навесом или по прямой линии. Снаряды являются простреливающими, то есть, если стрелять по прямой линии, то можно убить несколько жуков. Но чтобы убить жука на подъеме, находясь внизу, нужно стрелять навесом.&lt;/li&gt;
      &lt;li id=&quot;WBtv&quot;&gt;Перезаряжается ли модуль убийствами жуков.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;pZGo&quot;&gt;Вспомогательный. Некоторые из таких модулей:&lt;/li&gt;
    &lt;ul id=&quot;lSGf&quot;&gt;
      &lt;li id=&quot;lUf7&quot;&gt;Добавить куб энергии на одну клетку.&lt;/li&gt;
      &lt;li id=&quot;NESp&quot;&gt;Опустить одну платформу, при этом поднять другую клетку.&lt;/li&gt;
      &lt;li id=&quot;U8sd&quot;&gt;Собрать куб энергии удаленно.&lt;/li&gt;
      &lt;li id=&quot;I12f&quot;&gt;Перезарядить все модули атаки или движения.&lt;/li&gt;
      &lt;li id=&quot;I1Ln&quot;&gt;Выкопать яму, рядом с другой ямой. При этом можно копать прямо под жуком и платформой.&lt;/li&gt;
      &lt;li id=&quot;A9b1&quot;&gt;Сделать всех жуков взрывающимися.&lt;/li&gt;
      &lt;li id=&quot;4uEs&quot;&gt;Отменить эволюцию жука на одну стадию.&lt;/li&gt;
      &lt;li id=&quot;3um3&quot;&gt;Опылить клетки спреем. На таких клетках жуки не будут появляться. (Довольно неплохой способ контролировать позиции новых жуков).&lt;/li&gt;
      &lt;li id=&quot;aPrv&quot;&gt;Поменять все платформы и обычные клетки местами.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;bu2D&quot;&gt;Способы убийства врагов&lt;/h2&gt;
  &lt;ul id=&quot;zwiz&quot;&gt;
    &lt;li id=&quot;x7LE&quot;&gt;Жука можно уничтожить атакой.&lt;/li&gt;
    &lt;li id=&quot;8zTK&quot;&gt;Можно толкнуть в яму.&lt;/li&gt;
    &lt;li id=&quot;OaST&quot;&gt;Можно раздавить его, если спуститься с платформы рядом с ним. (При этом жук не будет контратаковать и его броня не сработает.)&lt;/li&gt;
    &lt;li id=&quot;bBjB&quot;&gt;Можно взорвать рядом с жуком куб энергии.&lt;/li&gt;
    &lt;li id=&quot;J3n1&quot;&gt;Можно толкнуть жука на куб. Куб и жук исчезнут. При этом куб не взорвется, то есть толкать жуков в кубы безопасно.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;LCAw&quot;&gt;Энергия&lt;/h2&gt;
  &lt;ul id=&quot;bdnT&quot;&gt;
    &lt;li id=&quot;e1SN&quot;&gt;Энергия на клетках спаунится каждый день случайно.&lt;/li&gt;
    &lt;li id=&quot;LYdT&quot;&gt;В клетку, в которой уже есть куб, может заспаунится еще один, и их на клетке уже станет два.&lt;/li&gt;
    &lt;li id=&quot;IZwm&quot;&gt;Но если той же клетке появится третий куб энергии, то кубы взорвутся, оставив после себя яму.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;mWeR&quot;&gt;Помимо кубов энергии есть еще &lt;strong&gt;кубы антиэнергии&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure id=&quot;0jb1&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e7/52/e752a5f4-555a-42ac-972b-e8db2013997b.png&quot; width=&quot;1080&quot; /&gt;
    &lt;figcaption&gt;Опасная эволюция жука&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0djr&quot;&gt;Обычная энергия превращается в антиэнергию, если рядом находится особый вид жука.&lt;/p&gt;
  &lt;p id=&quot;PsWv&quot;&gt;Как и у обычной энергии у антиэнергии много свойств, фишек:&lt;/p&gt;
  &lt;ul id=&quot;NN0K&quot;&gt;
    &lt;li id=&quot;5AOY&quot;&gt;При ее подборе она опустошает заряды энергии у героя.&lt;/li&gt;
    &lt;li id=&quot;dCi5&quot;&gt;Антиэнергия не взрывается при атаке, вместо этого она создает еще один куб на той же клетке. Если кубов будет три — они превратятся в яйцо.&lt;/li&gt;
    &lt;li id=&quot;BItl&quot;&gt;Толкание жука на антиэнергию увеличивает его уровень эволюции.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;Ji8R&quot;&gt;Другие особенности игры&lt;/h2&gt;
  &lt;ul id=&quot;9cOp&quot;&gt;
    &lt;li id=&quot;JdEe&quot;&gt;Яйца не считаются за жуков, и их уничтожение не идет в счетчик убийств.&lt;/li&gt;
    &lt;li id=&quot;mg7D&quot;&gt;В игре есть мультиплеер PVP.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;1KuM&quot;&gt;Один объект = Много функций&lt;/h2&gt;
  &lt;p id=&quot;WzfJ&quot;&gt;Мне нравится как игра, используя небольшое поле и набор объектов, создает интересный тактический геймплей, с множеством решений и ситуаций.&lt;/p&gt;
  &lt;p id=&quot;0hxY&quot;&gt;В первую очередь это достигается за счет того, что большинство объектов имеют несколько функций. Например, много функций досталось обычному кубу энергии, который одновременно является и валютой, и способом убийства, самоубийства, и объектом, который еще может создать новые ямы. А еще куб может стать антикубом. И в этом случае его поведение полностью меняется.&lt;/p&gt;
  &lt;p id=&quot;lU9K&quot;&gt;Ямы — это не только препятствия, но и способ убийства.&lt;/p&gt;
  &lt;p id=&quot;uafe&quot;&gt;Платформы могут как мешать, так и помогать.&lt;/p&gt;
  &lt;p id=&quot;Dkvb&quot;&gt;В общем, наверно, это самое интересное, что можно подчерпнуть из игры: умение населять игровые объекты множеством смыслом. В этом и было проявление мастерства геймдизайнера.&lt;/p&gt;
  &lt;p id=&quot;w8E3&quot;&gt;Этот подход с многофункциональными объектами и действиями прослеживается в другой отличной игре &lt;a href=&quot;https://store.steampowered.com/app/360740/Downwell/&quot; target=&quot;_blank&quot;&gt;Downwell&lt;/a&gt;. Про этот подход есть такое неплохое видео на английском:&lt;/p&gt;
  &lt;figure id=&quot;E6t1&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/i5C1Uj7jJCg?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
    &lt;figcaption&gt;Двойственность в дизайне на примере игры Downwell&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;G54E&quot;&gt;Мне очень нравится, что жуков можно убивать разными способами, особенно классно их давить и толкать в ямы. Очевидно, что на игру повлиял известный рогалик &lt;a href=&quot;https://store.steampowered.com/app/590380/Into_the_Breach/&quot; target=&quot;_blank&quot;&gt;Into the breach&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;t4PN&quot;&gt;Ну, и в игре довольно неплохая синергия модулей, которая позволяет строить некоторые билды. Например, для меня хорошо работала комбинация: «Поднять жуков на платформы» + «Атаковать все, что на платформах».&lt;/p&gt;
  &lt;h2 id=&quot;b68L&quot;&gt;Более полная справка по игре&lt;/h2&gt;
  &lt;p id=&quot;qtIF&quot;&gt;Подробно о каждом модуле и жуке можно прочитать здесь:&lt;/p&gt;
  &lt;p id=&quot;6WUL&quot;&gt;&lt;a href=&quot;https://ufo50.miraheze.org/wiki/Bug_Hunter&quot; target=&quot;_blank&quot;&gt;https://ufo50.miraheze.org/wiki/Bug_Hunter&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>ig0rstepan0v:Four-boxes</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/Four-boxes?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Разработка и баланс ивента «Четыре шкатулки»</title><published>2024-09-24T11:36:51.362Z</published><updated>2024-09-24T11:36:51.362Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/ce/07/ce07916d-bf5c-4346-a219-062521dcf73a.png"></media:thumbnail><category term="matchast" label="Матчасть"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/09/03/09036bdc-acff-49db-8f03-1248c78038b5.png&quot;&gt;Статья-руководство, как спроектировать и сбалансировать ивент «Четыре шкатулки».</summary><content type="html">
  &lt;p id=&quot;leqr&quot;&gt;Статья-руководство, как спроектировать и сбалансировать ивент «Четыре шкатулки».&lt;/p&gt;
  &lt;figure id=&quot;SeMA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/09/03/09036bdc-acff-49db-8f03-1248c78038b5.png&quot; width=&quot;853&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xfvG&quot;&gt;Многие встречались с таким типом ивентов в казуальных играх. В одной &lt;strong&gt;попытке&lt;/strong&gt; такого ивента нам предлагают выбрать одну из четырех закрытых «&lt;strong&gt;шкатулок&lt;/strong&gt;», в одной из которых лежит «&lt;strong&gt;бомба&lt;/strong&gt;». В других трех — призы. Если мы выбираем приз, нам вновь предлагают четыре шкатулки (второй &lt;strong&gt;этап&lt;/strong&gt;), мы можем продолжить или уйти с заработанными призами. Если натыкаемся на бомбу, то теряем все награды и проигрываем попытку. Бомбу можно отменить и спасти заработанное, заплатив хардвалюту.&lt;/p&gt;
  &lt;figure id=&quot;uqYT&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/uFltBx1-NvU?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
    &lt;figcaption&gt;Lao&amp;#x27;s treasure event in Homescapes&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;sQk3&quot;&gt;Вариации ивента&lt;/h2&gt;
  &lt;ul id=&quot;UjPZ&quot;&gt;
    &lt;li id=&quot;u0fV&quot;&gt;Некоторые ивенты обставлены в виде карты с этапами. Каждый этап — это четыре шкатулки.&lt;/li&gt;
    &lt;li id=&quot;xirh&quot;&gt;Встречаются &lt;strong&gt;Safe-этапы&lt;/strong&gt;. На таких этапах в выборе не участвует бомба. Такие этапы работают как маячки, к которым стремится игрок.&lt;/li&gt;
    &lt;li id=&quot;Ex4K&quot;&gt;На некоторых этапах может быть не четыре, а две шкатулки. Например, в последнем. Главный приз против бомбы.&lt;/li&gt;
    &lt;li id=&quot;YbKv&quot;&gt;Все ивенты после сыгранной попытки закрываются на кулдаун (например, на сутки), в некоторых ивентах его можно отменить, заплатив деньги.&lt;/li&gt;
    &lt;li id=&quot;nIfZ&quot;&gt;В некоторых ивентах можно встретить понятие «&lt;strong&gt;жизней&lt;/strong&gt;» на одну попытку. В этом случае «отменить» бомбу можно только определенное количество раз. Как правило в таких ивентах, награды в шкатулках более ценные.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;nnuH&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/93/ea/93ea1ad6-b57b-4946-9dbe-fb15ca29dcc3.png&quot; width=&quot;1280&quot; /&gt;
    &lt;figcaption&gt;Из игры Gin Rummy Rush&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;uUlp&quot;&gt;
    &lt;li id=&quot;5nno&quot;&gt;Некоторые ивенты построены из нескольких карт с разным количеством этапов. Сначала проходим ивент на 5 этапов, потом такой же, но на 8, 15, 20... То есть структура ивента такая:&lt;/li&gt;
    &lt;ul id=&quot;FpHK&quot;&gt;
      &lt;li id=&quot;OKco&quot;&gt;Ивент.&lt;/li&gt;
      &lt;li id=&quot;qUuf&quot;&gt;В ивенте есть 3-4 карты. Последняя карта повторяется после прохождения или ивент считается пройденным.&lt;/li&gt;
      &lt;li id=&quot;JdTr&quot;&gt;В каждой карте несколько этапов.&lt;/li&gt;
      &lt;li id=&quot;KhCK&quot;&gt;На каждом этапе нужно выбрать одну из четырех шкатулок.&lt;/li&gt;
      &lt;li id=&quot;iuLe&quot;&gt;Проигрывая попытку, мы остаемся на той же карте, где были.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;sWgH&quot;&gt;Логика реализации&lt;/h2&gt;
  &lt;p id=&quot;Jk8l&quot;&gt;Будем придерживаться простой логики.  Нет необходимости делать под капотом имитацию шкатулок с их реальным поведением.&lt;/p&gt;
  &lt;p id=&quot;jy69&quot;&gt;Для каждого этапа определим следующие параметры:&lt;/p&gt;
  &lt;ul id=&quot;HqUE&quot;&gt;
    &lt;li id=&quot;zx1g&quot;&gt;Шанс выпадения бомбы на этапе&lt;/li&gt;
    &lt;li id=&quot;4r81&quot;&gt;Список остальных &lt;strong&gt;призов&lt;/strong&gt; и их &lt;strong&gt;весов&lt;/strong&gt;. В списке не менее трех призов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;VQtJ&quot;&gt;Когда игрок выбирает шкатулку, сначала мы проверяем шанс на выпадение бомбы. Если бомба не выпала, то мы должны определить какой приз выпадет из списка на основе весов. Чем больше вес, тем больше вероятность такого приза.&lt;/p&gt;
  &lt;p id=&quot;boNT&quot;&gt;Оставшиеся шкатулки после открытия мы заполняем уже постфактум бомбой и другими призами из нашего списка.&lt;/p&gt;
  &lt;h2 id=&quot;oCI3&quot;&gt;Расчеты&lt;/h2&gt;
  &lt;p id=&quot;ExQM&quot;&gt;Нам нужно сбалансировать:&lt;/p&gt;
  &lt;ul id=&quot;wseG&quot;&gt;
    &lt;li id=&quot;KRmg&quot;&gt;Какие призы с какими весами лежат в каждом этапе.&lt;/li&gt;
    &lt;li id=&quot;WK1D&quot;&gt;Сколько будет стоить защита от бомбы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;BRsB&quot;&gt;Нам нужно контролировать несколько сценариев поведения игрока и высчитывать &lt;strong&gt;матожидание выигрыша игрока&lt;/strong&gt; при каждом сценарии. Все призы для удобства мы будем оценивать в той же валюте, что и стоимость защиты от бомбы.&lt;/p&gt;
  &lt;p id=&quot;lsda&quot;&gt;Какие сценарии поведения могут быть. Я предлагаю рассматривать пока только следующие:&lt;/p&gt;
  &lt;ul id=&quot;Foox&quot;&gt;
    &lt;li id=&quot;WhGW&quot;&gt;1-й сценарий: Игрок &lt;strong&gt;не платит&lt;/strong&gt; за защиту от бомб и стремится к N-му этапу. Дойдя до целевого этапа, он не рискует и забирает накопленные награды. Если он натыкается на бомбу, то проигрывает попытку. В этих сценариях мы должны будем проконтролировать, что матожидание от одной попытки будет лежать в пределах допустимой нам нормы. Например, мы можем позволить давать игрокам 500 монет в день с ивента бесплатно.&lt;/li&gt;
    &lt;li id=&quot;1FrN&quot;&gt;2-й сценарий: Игрок &lt;strong&gt;готов платить&lt;/strong&gt; за все защиты от бомб и идти до конца. Нам нужно будет уравнять стоимости потраченных защит и полученных наград в завершенном ивенте.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;0LXn&quot;&gt;В действительности, сценариев поведения пользователя будет больше. Например, игрок может соглашаться на использование защиты, если у него случилась удачная попытка и он продвинулся довольно далеко. Игрок может действовать по ситуации и вести более выгодную стратегию.&lt;/p&gt;
  &lt;p id=&quot;3W6W&quot;&gt;Поэтому считайте баланс с запасом в пользу стоимости бомб. Немного завышайте их стоимость.&lt;/p&gt;
  &lt;h2 id=&quot;d1Fg&quot;&gt;Таблица&lt;/h2&gt;
  &lt;p id=&quot;85Tz&quot;&gt;Получилась следующая таблица для расчета:&lt;/p&gt;
  &lt;p id=&quot;D7qO&quot;&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1CUDBcRjsAc1rFlVBLELLwrlfka5omJn7Bi2xKjcRHj0/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;https://docs.google.com/spreadsheets/d/1CUDBcRjsAc1rFlVBLELLwrlfka5omJn7Bi2xKjcRHj0/edit?usp=sharing&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;svA4&quot;&gt;Как пользоваться:&lt;/p&gt;
  &lt;ul id=&quot;6omo&quot;&gt;
    &lt;li id=&quot;If45&quot;&gt;На вкладке «Конфигурация» мы настраиваем призы и их веса, и также шансы бомб.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;akSM&quot; class=&quot;m_column&quot;&gt;
      &lt;img src=&quot;https://img4.teletype.in/files/7e/d0/7ed0a8dd-8bf2-41a4-a3f4-f42040cf40cc.png&quot; width=&quot;1494&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;n8n8&quot;&gt;Используемые формулы:&lt;/p&gt;
    &lt;ul id=&quot;kdVd&quot;&gt;
      &lt;li id=&quot;bxH5&quot;&gt;Шанс выпадения приза = Вес приза / Сумма весов всех призов на этапе&lt;/li&gt;
      &lt;li id=&quot;d9Lp&quot;&gt;Матожидание при несработавшей бомбе = Сумма произведений ценностей призов на их веса / Сумма весов всех призов в этапе&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;ul id=&quot;AQ1s&quot;&gt;
    &lt;li id=&quot;Uanp&quot;&gt;На вкладке «Сценарий 1» мы можем увидеть посчитанное матожидание на одну попытку для разных поведений игрока при отказе от защит. Также тут можем отметить какой сценарий наиболее оптимален с точки зрения выигрыша.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;LUH9&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img4.teletype.in/files/ff/92/ff92dd5e-1e41-4b80-b811-931b2304bd5e.png&quot; width=&quot;742&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;i25B&quot;&gt;Используемые формулы:&lt;/p&gt;
    &lt;ul id=&quot;zMWO&quot;&gt;
      &lt;li id=&quot;movn&quot;&gt;Шанс не встретить бомбу = Произведение шансов не встретить бомбу на каждом этапе = (1 - шанс бомбы в первом этапе) * (1 - шанс бомбы во втором этапе) * ...&lt;/li&gt;
      &lt;li id=&quot;pEzl&quot;&gt;Матожидание попытки = Шанс не встретить бомбу * Матожидание от собранных призов к этому этапу&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;ul id=&quot;LnSG&quot;&gt;
    &lt;li id=&quot;tRgf&quot;&gt;На вкладке «Сценарий 2» мы можем увидеть среднее количество денег, которые нужно потратить на бомбы, чтобы дойти до определенного этапа. Здесь мы можем соотнести стоимость бомб и наград.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;7J9I&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img2.teletype.in/files/d3/7a/d37ad417-064b-45c5-822f-f047475fa32c.png&quot; width=&quot;801&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;fS8f&quot;&gt;Используемые формулы:&lt;/p&gt;
    &lt;ul id=&quot;1QZG&quot;&gt;
      &lt;li id=&quot;EodR&quot;&gt;Количество использованных защит = Сумма шансов бомб на этапах&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Tlpy&quot;&gt;Больше материалов о математике и геймдизайне — в &lt;a href=&quot;http://t.me/SecretRoom_Gamedesign&quot; target=&quot;_blank&quot;&gt;телеграмм-канале&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>ig0rstepan0v:Logic-for-gamedesigners</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/Logic-for-gamedesigners?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Матлогика для геймдизайнеров</title><published>2024-08-22T15:42:47.989Z</published><updated>2025-01-23T15:55:41.801Z</updated><category term="matchast" label="Матчасть"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/aa/dd/aadd5bb1-24ba-4b7f-a9af-acecd01ed951.png&quot;&gt;Логические выражения, синтакис</summary><content type="html">
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#2UQD&quot;&gt;Синтаксис&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#nEl5&quot;&gt;Сравнение&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#wDOi&quot;&gt;Логические операторы&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#7MdF&quot;&gt;Примеры&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#enZo&quot;&gt;Приоритет операторов&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#pqCV&quot;&gt;Как сделать исключающее ИЛИ?&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#srC0&quot;&gt;Рефакторинг условий&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#JUDa&quot;&gt;Скобки&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#4bm5&quot;&gt;Избавляемся от отрицаний&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#Si3Q&quot;&gt;Законы Де Моргана&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#N8jh&quot;&gt;Задания&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#Akw1&quot;&gt;Бонус-загадка&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;p id=&quot;ferq&quot;&gt;Базовая шпаргалка, которая может помочь в работе геймдизайнера, если он сталкивается с написанием условий для описании работы фич или настройкой конфигов.&lt;/p&gt;
  &lt;h2 id=&quot;2UQD&quot;&gt;Синтаксис&lt;/h2&gt;
  &lt;p id=&quot;SAU7&quot;&gt;В основном, для описаний условий используется Си-подобный синтаксис.&lt;/p&gt;
  &lt;h3 id=&quot;nEl5&quot;&gt;Сравнение&lt;/h3&gt;
  &lt;figure id=&quot;EdWM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d2/13/d21352f8-7c21-4450-baee-327307cfc2d0.png&quot; width=&quot;527&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;wDOi&quot;&gt;Логические операторы&lt;/h3&gt;
  &lt;figure id=&quot;3F1B&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/79/fb/79fb9bc3-f6e4-4dfb-90a0-c7c750cf0323.png&quot; width=&quot;359&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;7MdF&quot;&gt;Примеры&lt;/h3&gt;
  &lt;figure id=&quot;1S4k&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/85/e0/85e00d6a-9e73-49f4-b7d8-9fc77b1ccbf6.png&quot; width=&quot;693&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;enZo&quot;&gt;Приоритет операторов&lt;/h2&gt;
  &lt;p id=&quot;PJW4&quot;&gt;Если не ставить скобки, то операции выполняются в порядке:&lt;/p&gt;
  &lt;ol id=&quot;KR5O&quot;&gt;
    &lt;li id=&quot;ieVs&quot;&gt;Отрицание.&lt;/li&gt;
    &lt;li id=&quot;huNI&quot;&gt;Умножение и деление.&lt;/li&gt;
    &lt;li id=&quot;Wzyd&quot;&gt;Сложение и вычитание.&lt;/li&gt;
    &lt;li id=&quot;8EFI&quot;&gt;Равенство, неравенство, сравнение.&lt;/li&gt;
    &lt;li id=&quot;5XqK&quot;&gt;Союз И (&amp;amp;&amp;amp;).&lt;/li&gt;
    &lt;li id=&quot;i00v&quot;&gt;Союз ИЛИ (||).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;rJkg&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c6/3e/c63ed399-8dfb-4d3f-9867-94707c5f4c31.png&quot; width=&quot;306&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;j5vs&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b7/58/b7580ad6-efea-4b57-9bf2-92e979382cc7.png&quot; width=&quot;449&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;pqCV&quot;&gt;Как сделать исключающее ИЛИ?&lt;/h2&gt;
  &lt;p id=&quot;0qxZ&quot;&gt;&lt;strong&gt;XOR&lt;/strong&gt; или, другими словами, &lt;strong&gt;исключающее ИЛИ&lt;/strong&gt; можно сделать через базовые операторы. В этом случае нам нужно чтобы сработало только одно условие. Либо то, либо это, но не оба вместе.&lt;/p&gt;
  &lt;figure id=&quot;Qb3m&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/e5/abe5cd17-cde6-4529-ad4b-99c8c4b7d2d3.png&quot; width=&quot;526&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;HINN&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8e/a3/8ea37855-5f8f-46b0-b182-7f6793349c4c.png&quot; width=&quot;174&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;srC0&quot;&gt;Рефакторинг условий&lt;/h2&gt;
  &lt;h3 id=&quot;JUDa&quot;&gt;Скобки&lt;/h3&gt;
  &lt;p id=&quot;bTlw&quot;&gt;Иногда добавление скобок добавляет читабельности, так как делит условие на некоторые блоки, но старайтесь ими не увлекаться.&lt;/p&gt;
  &lt;figure id=&quot;hIgq&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a3/73/a373f563-f2e6-42e5-88ef-8e2f344c1c8f.png&quot; width=&quot;560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;4bm5&quot;&gt;Избавляемся от отрицаний&lt;/h3&gt;
  &lt;p id=&quot;pWx9&quot;&gt;Старайтесь избавляться от лишних отрицаний и делать условие чище и читабельнее.&lt;/p&gt;
  &lt;figure id=&quot;HKhE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f4/a0/f4a07525-c235-4186-9cbf-83a696f6366b.png&quot; width=&quot;246&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;izdN&quot;&gt;Отрицание сравнений:&lt;/p&gt;
  &lt;figure id=&quot;OvkA&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/76/e7/76e7f6a1-03c6-4920-8b78-98bb7bf25687.png&quot; width=&quot;605&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;Si3Q&quot;&gt;Законы Де Моргана&lt;/h3&gt;
  &lt;p id=&quot;LQY1&quot;&gt;Полезно знать, что:&lt;/p&gt;
  &lt;ul id=&quot;Lwun&quot;&gt;
    &lt;li id=&quot;xgBa&quot;&gt;(&lt;strong&gt;не&lt;/strong&gt; А &lt;strong&gt;или&lt;/strong&gt; &lt;strong&gt;не&lt;/strong&gt; Б) это то же самое, что (&lt;strong&gt;не&lt;/strong&gt; (А &lt;strong&gt;и&lt;/strong&gt; Б))&lt;/li&gt;
    &lt;li id=&quot;NmYC&quot;&gt;(&lt;strong&gt;не&lt;/strong&gt; А &lt;strong&gt;и&lt;/strong&gt; &lt;strong&gt;не&lt;/strong&gt; Б) это то же самое, что (&lt;strong&gt;не&lt;/strong&gt; (А &lt;strong&gt;или&lt;/strong&gt; Б))&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;BpNj&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/04/58/04581e4d-e3d7-49d7-963b-9e4909a425bc.png&quot; width=&quot;464&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;x9cK&quot;&gt;Может в некоторых случаях улучшить читаемость условий.&lt;/p&gt;
  &lt;p id=&quot;bzdm&quot;&gt;Применим закон к сравнениям:&lt;/p&gt;
  &lt;figure id=&quot;F2al&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d3/f6/d3f6ebf0-7d2a-4aac-abbf-d98797495862.png&quot; width=&quot;339&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;N8jh&quot;&gt;Задания&lt;/h2&gt;
  &lt;p id=&quot;KMU0&quot;&gt;1. Упростите конструкцию:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;iKZN&quot;&gt;(featureIsActive == true) &amp;amp;&amp;amp; (!(cooldown &amp;lt;= 0) || (state == &amp;#x27;locked&amp;#x27;))&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;5QEw&quot;&gt;Ответ:&lt;/p&gt;
  &lt;p id=&quot;wPfz&quot;&gt;↓&lt;/p&gt;
  &lt;p id=&quot;AbJU&quot;&gt;↓&lt;/p&gt;
  &lt;p id=&quot;ANRx&quot;&gt;↓&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Oz3R&quot;&gt;featureIsActive &amp;amp;&amp;amp; (cooldown &amp;gt; 0 || state == &amp;#x27;locked&amp;#x27;)&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;M3nl&quot;&gt;2. Переделайте условие:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;cJkB&quot;&gt;!((monster == &amp;#x27;ghost&amp;#x27;) || (monster == &amp;#x27;vampire&amp;#x27;) || (monster == &amp;#x27;skelet&amp;#x27;))&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;34pY&quot;&gt;Вариант ответа:&lt;/p&gt;
  &lt;p id=&quot;zgeO&quot;&gt;↓&lt;/p&gt;
  &lt;p id=&quot;IR3S&quot;&gt;↓&lt;/p&gt;
  &lt;p id=&quot;a5Ed&quot;&gt;↓&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;UHdi&quot;&gt;monster != &amp;#x27;ghost&amp;#x27; &amp;amp;&amp;amp; monster != &amp;#x27;vampire&amp;#x27; &amp;amp;&amp;amp; monster != &amp;#x27;skelet&amp;#x27;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;Akw1&quot;&gt;Бонус-загадка&lt;/h2&gt;
  &lt;p id=&quot;AZx2&quot;&gt;Разгадайте парадокс Критянина:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;YVXr&quot;&gt;Критянин сказал, что «Критяне всегда говорят ложь».&lt;/p&gt;
    &lt;p id=&quot;tIDw&quot;&gt;Если он сказал правду, то так как он критянин, то он должен, по его уже утверждению, сказать ложь.&lt;/p&gt;
    &lt;p id=&quot;Jclq&quot;&gt;Если он солгал, то значит он должен сказать правду.&lt;/p&gt;
    &lt;p id=&quot;fKyk&quot;&gt;Как может быть такое противоречие?&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Xsq8&quot;&gt;Ответ:&lt;/p&gt;
  &lt;p id=&quot;lgQg&quot;&gt;↓&lt;/p&gt;
  &lt;p id=&quot;dwhx&quot;&gt;↓&lt;/p&gt;
  &lt;p id=&quot;KsK3&quot;&gt;↓&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;EPtp&quot;&gt;Критянин солгал.&lt;/p&gt;
    &lt;p id=&quot;USDe&quot;&gt;Автор парадокса хочет вас запутать и убедить, что если критянин сказал ложь, то это теперь значит, что «Критяне всегда говорят правду».&lt;/p&gt;
    &lt;p id=&quot;YMg2&quot;&gt;Но отрицание фразы в действительности будет такое: «Критяне не всегда говорят ложь». Что по сути ничего не значит. Поэтому следствие «Если он солгал, то значит он должен сказать правду» &lt;strong&gt;не работает&lt;/strong&gt;.&lt;/p&gt;
    &lt;p id=&quot;gzJP&quot;&gt;Другой похожий пример отрицания фразы:&lt;/p&gt;
    &lt;p id=&quot;Fjjk&quot;&gt;Отрицание для фразы «Все вороны черные» — «Не все вороны черные».&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>ig0rstepan0v:Target-logistics</id><link rel="alternate" type="text/html" href="https://teletype.in/@ig0rstepan0v/Target-logistics?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ig0rstepan0v"></link><title>Механика: Влияние порядка выполнения целей на результат</title><published>2024-08-14T15:31:43.727Z</published><updated>2024-08-14T15:31:43.727Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f5/10/f510d420-4eda-4d6b-a87f-2211df2afbc7.png"></media:thumbnail><category term="dekonstrakty" label="Деконстракты"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/17/b6/17b67b52-76ee-4d8f-8df1-a15becec9a26.png&quot;&gt;Небольшая заметка о любопытной механике, встреченной в паре аркадных игр. Может пригодиться в других жанрах.</summary><content type="html">
  &lt;p id=&quot;Z1nW&quot;&gt;Небольшая заметка о механике, которая встретилась мне в паре аркадных игр.&lt;/p&gt;
  &lt;p id=&quot;dMZz&quot;&gt;Допустим у нас есть геймплей, который ставит перед игроком сразу несколько целей одновременно. Например, на карте раскиданы предметы и нам нужно их все собрать. Можно это делать в любом порядке. Но некоторый порядок будет являться менее рискованным, например, за счет некоторых опасностей на карте.&lt;/p&gt;
  &lt;figure id=&quot;Ybpe&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/17/b6/17b67b52-76ee-4d8f-8df1-a15becec9a26.png&quot; width=&quot;825&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8jaW&quot;&gt;Но, допустим, порядок сбора будет на что-то влиять. Например, на &lt;strong&gt;бонусную награду&lt;/strong&gt;. И пусть есть некоторый порядок, который даст больше всего финальной награды. Если следовать этому порядку, то игрок будет больше рисковать.&lt;/p&gt;
  &lt;figure id=&quot;5ag7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7d/0a/7d0a51a0-cc72-4119-8797-e073fd6ac3a9.png&quot; width=&quot;705&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;d7R9&quot;&gt;Перед игроком будет стоять выбор того, насколько он будет готов рисковать и сколько награды он получит.&lt;/p&gt;
  &lt;p id=&quot;Y5B8&quot;&gt;Далее идут два примера.&lt;/p&gt;
  &lt;h2 id=&quot;qjtQ&quot;&gt;Donut Dodo&lt;/h2&gt;
  &lt;p id=&quot;wuCZ&quot;&gt;В игре &lt;a href=&quot;https://store.steampowered.com/app/1779560/Donut_Dodo/&quot; target=&quot;_blank&quot;&gt;Donut Dodo&lt;/a&gt; нужно собрать все пончики на уровне. На уровне всегда есть один мигающий пончик, который даст больше всего очков и начнет комбо. После сбора мигающего пончика начнет мигать другой пончик на уровне. Каждый собранный мигающий пончик в комбо дает все больше и больше очков. Оптимально собирать только мигающие пончики, пока не соберем все — это даст больше всего очков. Но быстрее и проще собирать, конечно сразу всё подряд.&lt;/p&gt;
  &lt;figure id=&quot;DXPU&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/48/c9/48c94e01-2742-4dd4-818e-92ac7ed5b12d.png&quot; width=&quot;538&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;VQ9Y&quot;&gt;Нужно отметить, что структура уровня сделана так, что в любую точку экрана можно добраться очень быстро, взяв на себя определенный риск.&lt;/p&gt;
  &lt;h2 id=&quot;vJDe&quot;&gt;Ball und Panzer Golf&lt;/h2&gt;
  &lt;p id=&quot;w3my&quot;&gt;В &lt;a href=&quot;https://www.youtube.com/watch?v=Nwte3wm6lzo&quot; target=&quot;_blank&quot;&gt;другой игре&lt;/a&gt; у нас есть танк, на котором мы играем в гольф. На поле 15 лунок и все они пронумерованы.&lt;/p&gt;
  &lt;figure id=&quot;hFGm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/62/e4/62e4833b-af43-4dd4-919e-7547d936b2ff.png&quot; width=&quot;917&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qf4O&quot;&gt;Процесс игры такой:&lt;/p&gt;
  &lt;ul id=&quot;peW1&quot;&gt;
    &lt;li id=&quot;jPIg&quot;&gt;Оказываемся на танке в некоторой точке поля&lt;/li&gt;
    &lt;li id=&quot;4EfU&quot;&gt;Выбираем лунку с некоторым номером N (например, 6) и стреляем в нее&lt;/li&gt;
    &lt;li id=&quot;jjgz&quot;&gt;Если попали, то получаем N x 100 очков (например, 6 x 100 = 600)&lt;/li&gt;
    &lt;li id=&quot;2O4K&quot;&gt;Стартует комбо. Комбо становится = 1&lt;/li&gt;
    &lt;li id=&quot;JdkS&quot;&gt;Доезжаем на танке до лунки с мячом, забираем мяч и, не отъезжая, выцеливаем новую лунку&lt;/li&gt;
    &lt;li id=&quot;jKS7&quot;&gt;Если попадаем, то комбо становится уже = 2. И очков уже дают = Номер лунки x 100 x Combo. Например, если попали в 1-ю лунку, то очков = 1 x 100 x 2 = &lt;strong&gt;200&lt;/strong&gt;. А если в 15-ю, то = 15 x 100 x 2 = &lt;strong&gt;3000&lt;/strong&gt;.&lt;/li&gt;
    &lt;li id=&quot;tH9t&quot;&gt;Если же промахиваемся, то счетчик комбо сбрасывается.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;YYdp&quot;&gt;Это дает следующий стратегический момент. Проще и без риска стрелять в лунки в том порядке, в каком они расставлены на поле. Тогда после первой лунки может идти, например, сразу 15-я. (Так как лунки раскиданы на карте случайно.) Но если второй лункой в комбо будет идти сразу 15-я, то мы от нее получим всего &lt;strong&gt;3000&lt;/strong&gt; очков. А вот если бы 15-я лунка шла в комбо последней, то мы бы получили уже 15 x 100 x 15 = &lt;strong&gt;22500&lt;/strong&gt; очков. Но это, конечно, если мы сможем удержать такое комбо.&lt;/p&gt;
  &lt;figure id=&quot;2LdU&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ee/01/ee01629a-33fe-4507-bfc0-2f93a23bd9fa.png&quot; width=&quot;677&quot; /&gt;
    &lt;figcaption&gt;100 + 800 + 600 + 1200 = 2700&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;X0xg&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/64/cb/64cba189-b76f-42b0-bd5d-60defa376907.png&quot; width=&quot;664&quot; /&gt;
    &lt;figcaption&gt;100 + 400 + 900 + 1600 = 3000&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tlfB&quot;&gt;Игрок сам определяет степень риска и желаемую награду. Механика дает вариативность прохождения одного уровня.&lt;/p&gt;

</content></entry></feed>