Фото Markus Winkler на Unsplash

Мотивация

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

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

Игра

Предмет исследования — групповая настольная игра в кости. Основные инструменты и механика:

  • четыре вида фруктов;
  • цветной кубик с джокером (корзинка) и злодеем (ворон);
  • пазл, который ворон медленно, но верно собирает — визуальный отсчет времени, который повышает градус эмоционального состояния малышей: «О нет, ворон приближается!»;
  • задача: собрать фрукты быстрее, чем ворон сложит пазл.

Это совершенно замечательная задумка: дети все вместе либо выигрывают, либо проигрывают. Группа против ворона. Давид против Голиафа. Малыш против птицы.

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

Исследовательский вопрос

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

  • сохранить их мотивацию;
  • не довести до слез из-за того, что ворон снова победил?

Мое интуитивное, основанное на внутреннем чувстве предположение было таким: малыши должны выигрывать примерно в 70% раундов.

Почему 70%?

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

Методология

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

Как профессиональный дата-сайентист, я видел только один выход из этой ситуации: симулировать. Много симулировать.

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

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

  1. Случайный выбор — представленный нашей дочерью:
  • бери что угодно;
  • лишь бы было ярко и красочно.
  1. Сбалансированный выбор — представленый нами, взрослыми:
  • выбирай так, чтобы все виды фруктов оставались примерно в равном количестве;
  • минимизируй последующие «холостые броски».

Я столкнул эти две стратегии в симуляции.

Симуляция

Вот код симуляции:

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% вероятность победы.

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

Наблюдения

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

Стратегия помогает — но лишь немного. Разница между хаотичной детской игрой и стремлением взрослых к оптимизации составляет всего пять процентных пунктов.

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

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Georg Vetter: Game Design for Toddlers: More Fruit, Less Frustration

Предыдущая статьяКак не потерять полгода работы из-за отказа диска