
Мотивация
В последнее время я углубляюсь в разработку игр. В основном потому, что хочу разобраться в том, как игры на самом деле работают. А кроме того, пытаюсь понять, почему некоторые из них вообще могут быть интересными. По счастливой случайности, мы всей семьей недавно записались в местную библиотеку. И какое же научное открытие мы сделали? А вот какое: ответственные родители берут игру, подходящую для детей от двух лет.
Мы тут же протестировали эту игру — в духе строгой экспериментальной серии — прямо за обеденным столом. Уже через несколько минут, пока наша дочь с энтузиазмом собирала вишенки, мы с женой осознали: «Эта игра построена практически целиком на удаче».
Игра
Предмет исследования — групповая настольная игра в кости. Основные инструменты и механика:
- четыре вида фруктов;
- цветной кубик с джокером (корзинка) и злодеем (ворон);
- пазл, который ворон медленно, но верно собирает — визуальный отсчет времени, который повышает градус эмоционального состояния малышей: «О нет, ворон приближается!»;
- задача: собрать фрукты быстрее, чем ворон сложит пазл.
Это совершенно замечательная задумка: дети все вместе либо выигрывают, либо проигрывают. Группа против ворона. Давид против Голиафа. Малыш против птицы.
Говоря математическим языком: это последовательность случайных событий с дискретным условием победы и противником, собирающим пазл.

Исследовательский вопрос
Во время игры я задался вопросом: как должна быть разработана игра для самых маленьких детей, чтобы:
- сохранить их мотивацию;
- не довести до слез из-за того, что ворон снова победил?
Мое интуитивное, основанное на внутреннем чувстве предположение было таким: малыши должны выигрывать примерно в 70% раундов.
Почему 70%?
Потому что это обеспечивает достаточно побед, не превращая ворона в безобидный реквизит. Немного риска, немного триумфа — идеально для эмоциональных качелей в раннем детстве.
Методология
После того, как мы с женой сыграли несколько партий, у нас быстро возникло подозрение, что в этой игре побеждают гораздо чаще, чем проигрывают. Гораздо чаще. Возможно, даже слишком часто. Но мы также были уверены, что наше математическое чутье и реальные вероятности редко совпадают.
Как профессиональный дата-сайентист, я видел только один выход из этой ситуации: симулировать. Много симулировать.
100 000 запусков должно хватить, чтобы статистически подрезать ворону крылья.
Однако в игре есть небольшой стратегический компонент, который на первый взгляд кажется безобидным, но имеет значение с точки зрения теории игр. Когда выпадает символ «корзинка», вы можете свободно выбрать два фрукта. Здесь формируются две конкурирующие стратегии:
- Случайный выбор — представленный нашей дочерью:
- бери что угодно;
- лишь бы было ярко и красочно.
- Сбалансированный выбор — представленый нами, взрослыми:
- выбирай так, чтобы все виды фруктов оставались примерно в равном количестве;
- минимизируй последующие «холостые броски».
Я столкнул эти две стратегии в симуляции.
Симуляция
Вот код симуляции:
ITERATIONS = 100000
DICE = ['apple', 'pear', 'plum', 'cherry', 'basket', 'raven']
INITIAL = {'apple': 10, 'pear': 10, 'plum': 10, 'cherry': 10}
def play(strategy='random'):
garden = INITIAL.copy()
raven = 0
while sum(garden.values()) > 0 and raven < 9:
throw = random.choice(DICE)
if throw in ['apple','pear','plum','cherry']:
if garden[throw] > 0:
garden[throw] -= 1
elif throw == 'raven':
raven += 1
elif throw == 'basket':
# доступные виды фруктов с >0
fruits = [f for f in garden if garden[f] > 0]
if not fruits:
continue
if strategy == 'random':
# выбрать два фрукта равномерно с заменой, но с учетом доступности
picks = []
for _ in range(2):
pick = random.choice(fruits)
if garden[pick] > 0:
picks.append(pick)
garden[pick] -= 1
if garden[pick] == 0:
fruits = [f for f in garden if garden[f] > 0]
if not fruits:
break
elif strategy == 'balanced':
# брать фрукты, чтобы сохранять баланс: выбирать два из наиболее многочисленных
# (возможны другие эвристические варианты)
for _ in range(2):
fruits_sorted = sorted([f for f in garden if garden[f] > 0],
key=lambda x: garden[x], reverse=True)
if not fruits_sorted:
break
pick = fruits_sorted[0]
garden[pick] -= 1
return sum(garden.values()) == 0 # True = win
def simulate(iterations=ITERATIONS, strategy='random'):
wins = 0
for _ in range(iterations):
if play(strategy):
wins += 1
return wins, iterations
wins_balance, n = simulate(100000, 'balanced')
wins_random, n = simulate(100000, 'random')
Результат

После 100 000 смоделированных партий для каждой стратегии вырисовывается следующая картина:
- стратегия случайного выбора (ребенок): ~63% вероятность победы;
- стратегия сбалансированного выбора (взрослые): ~68% вероятность победы.
Таким образом, ворон проигрывает примерно в двух играх из трех — и это хорошо. В конце концов, игра, в которой малыши постоянно терпят неудачу, была бы скорее курсом раннего обучения фрустрации, чем семейной игрой.
Наблюдения
Игра разработана таким образом, чтобы дети побеждали чаще среднего. Ворон — не просто черная птица, это бумажный тигр (неопасный противник).
Стратегия помогает — но лишь немного. Разница между хаотичной детской игрой и стремлением взрослых к оптимизации составляет всего пять процентных пунктов.
Таким образом, игра педагогически грамотно устроена. Маленькие дети испытывают успех, сохраняют азарт, и им даже не нужно играть особенно хорошо, чтобы не проигрывать постоянно. С точки зрения разработки, блестящее решение. Оно обеспечивает мотивацию, веру в собственные силы — и достаточно острых ощущений, чтобы ворона нельзя было просто списать со счетов как декоративный элемент.
Читайте также:
- Почему гейм-дизайнеру нужно программирование
- SIMD имеет значение
- Почему каждый разработчик должен потерпеть неудачу (хотя бы раз)
Читайте нас в Telegram, VK и Дзен
Перевод статьи Georg Vetter: Game Design for Toddlers: More Fruit, Less Frustration





