Як ми Ур робили

    
 This game has no name.
 
Віктор Пєлєвін «Generation П»
 

 
 Дорога в тисячу лі починається з першого кроку.
 
Лао Цзи

 
Відносно моєї попередньої статті , Хабр-ефект спрацював несподіваним чином. Найпершим коментарем до неї, шановний Nomad1 поцікавився , чи не хочу я створити повноцінну реалізацію? Я, в той момент, за звичаєм, думав про своє і не відразу його зрозумів. Звичайно ж, мова йшла не про створення універсального ігрового движка (думку про який не дає мені спокою), а про розробку реалізації гри Ур для мобільних платформ. Хоча я слабо уявляв собі, на той момент, чим я можу опинитися корисний, я погодився допомогти.
 
Зрозуміло, всі мої напрацювання для ZoG опинилися тут зовсім марні. ZRF настільки своєрідна мова, що всі його рішення та ідіоми мають цінність лише для ZRF-розробників і ні для кого більше (здебільшого, всі вони вирішують проблеми самого ZRF). На щастя, у Олексія вже був готовий framework, що дозволив запрограмувати ігрову логіку в рекордно короткі терміни. Моїм завданням стала звірка ігрових правил і розробка принципів роботи AI, для цієї гри.
 
Ми постаралися, як можна більш точно, відтворити варіант правил , запропонований Дмитром Скірюк , оскільки вважаємо його найбільш цікавим (в ігровому відношенні) з усіх запропонованих на сьогоднішній день.
 
 Нагадаю правила
 
У вашому розпорядженні 7 бійців-новачків. Ваше завдання — провести їх через річку і повернути додому. Боги допоможуть вам в дорозі.
 
 
     
Якщо білий колір випав на одній з кісток, ви можете зробити один крок.
 Дві білих кістки означають, що будь-який з ваших бійців може переміститися на два кроки.
 Якщо білий колір випав на трьох кістках, ви можете пересунути будь-якого зі своїх бійців на три кроки.
 Три чорних кістки дають право сходити на чотири кроки вперед.
 
Якщо жоден з ваших бійців не може ходити, ви пропускаєте хід.
 
Не всі місця, через які ви пройдете однакові.
 
 Це врата Іштар — покровительки воїнів.
Зупинившись тут, ви маєте право зробити ще один хід.
 
 Тут можна розбити табір. У таборі можуть перебувати не більше 4 ваших бійців.
Поки в таборі є хоча б один боєць, ворог не може увійти в це місце.
 
 Це святе місце. Ворог не може напасти на вас тут, але і ви не можете напасти на нього. Не більше 4 бійців (ваших і вашого противника) можуть перебувати в цьому місці. Пам'ятайте, першим йде той, хто увійшов останнім!
 
 Пройшовши через це місце, бійці-новачки перетворюються на воїнів-ветеранів. Новичек не може здолати в бою ветерана, а й ветерани не нападають на новачків.
 
 Ніхто не може здолати ветерана, поки він знаходиться в цьому місці.

 
Вийшовши з табору, ви зустрінетеся з ворогом. Якщо один з ваших бійців буде убитий, ви отримаєте ще одного новачка.
 
Сім воїнів повинні перейти річку і повернутися додому.
Ворог не повинен вас випередити!
 
Однією з «родзинок» цього варіанту правил є процес «перевертання» фішок. Нагадаю, що фішки перевертаються для того, щоб гравець не заплутався в напрямку їх руху. Звичайні фішки рухаються у напрямку до «малому» блоку, перевернуті — від нього. Але «перевертання» фішок впливає і на ігровий процес. Один одного можуть «рубати» лише однакові фішки. Звичайні фішки не можуть «зрубати» перевернуті і навпаки. Це дуже різноманітить ігровий процес, але створює загрозу «заторів». Наприклад, в процесі налагодження ZoG-додатки, у мене виникла наступна ситуація:
 
 
 
Це реальна позиція, що виникла в процесі тестового прогону варіанти гри «Simple Ur», в якому поля дошки, окрім «розеток», не володіють ніякими особливими властивостями. Цей затор зовсім не просто розібрати (якби в резерві не залишалося фішок, гра б на цьому і закінчилася). Скільки б очок не викинув будь-який з гравців, жодна з заблокували один одного фішок не зможе зрушити з місця. Я думаю, це головна причина, по якій Дмитро ввів у гру спеціальні поля. Поля c2 і f2 (у шаховій нотації) покликані розвантажити «трафік».
 
На цих полях, фішки будь-якого кольору можна вибудовувати "стовпчиком" один на одного (але не більше 4 штук). При цьому, нижні фішки не повертаються в резерв, а просто залишаються блокованими, поки верхня фішка не пройде далі. Це проста зміна правил надає на ігровий процес чарівну дію. Затор перестає існувати. Що зіткнулися фішки легко розходяться! Але на цьому сюрпризи, пов'язані з перевертанням фішок, не закінчуються. Подивіться на наступну позицію:
 
 
 
За правилами Дмитра, фішка перевертається не тоді, коли вона встає на поле перетворення (h1 для білих і h3 для чорних), а проходячи через нього! В результаті, біла фішка не може зрубати чорну на h3, оскільки вона повинна бути перевернута, зробивши будь-який хід з h1. Зате вона легко б'є перевернуту чорну фішку на h2, перевертаючись в процесі ходу! Це правило, фактично, робить безпечними поля g1, h1, g3 і h3. Ці поля — ідеальне місце для «засідки».
 
Також безпечно (але з іншої причини) поле g2. На цьому полі «з очима», фішки також можна вибудовувати "стовпчиком", але тільки фішки одного кольору! Поки це поле зайнято, хоча б одній нашій фішкою, ворожа фішка не може зайти на нього. Аналогічні поля на b1, b3, d1 і d3, допомагають більш ефективно вводити в гру нові фішки.
 
Іншою важливою особливістю гри є поля з «розетками», що дозволяють, при зупинці на них, зробити додатковий хід. Введення цих полів надає грі воістину ураганний характер. Якщо ми граємо групою фішок, не обов'язково кожен раз викидати «четвірки», для того, щоб «ходити по розеток». Дуже часто вдається зробити по 2-3 ходу, до того, як хід перейде до супротивника.
 
Дещо осібно, на мій погляд, варто правило, не дозволяє «зрубати» перевернуту фішку, яка дійшла до a1. Можна довго сперечатися з приводу обгрунтованості чи корисності цього правила, але те, що воно працює — незаперечний факт. У процесі тестових прогонів гри, неодноразово виникали ситуації, коли виграш однієї зі сторін визначався тим, діє це правило чи ні. Ми реалізували його, ще й тому, що воно вносить у гру інтригу. Коли супротивник довів свою останню перевернуту фішку до a1, повинно дуже сильно повезти, для того, щоб нам вдалося у нього виграти. Зрубати цю фішку ми ніяк не можемо, а як тільки у противника випаде «одиничка», гра буде закінчена.
 
Якщо ви думаєте, що на цьому сюрпризи гри з Ура закінчуються, ви помиляєтеся! Чому для гри використовуються три «кістки» D2, а не одна D4? Ігрові кістки типу D4 (з чотирма гранями) були широко поширені в стародавньому світі. Чому в грі не була використана одна «кістка» замість трьох? Це не очевидно на перший погляд, але при використанні такої ігрової схеми, що викидаються окуляри не рівноймовірні. Одинички і двійки випадають в три рази частіше ніж трійки і четвірки.
 
Це безпосередньо впливає на ігровий процес. Позиції на видаленні 3-4 клітин, від наздоганяючої фішки супротивника, набагато безпечніші ніж відстань в 1-2 клітини. А адже нас може наздоганяти не одна, а кілька фішок, крім того, треба враховувати «безпечні» поля. Загалом, ця гра зовсім не така проста, якою здається на перший погляд.
 
Окремо варто поговорити про ігровому AI. Дуже важливо, щоб програма грала приблизно на одному рівні з людиною. ZoG-івська реалізація, наприклад, грає дуже слабо. Часто вдається виграти у неї «всуху». Грати з нею не дуже цікаво. Але якщо програма буде постійно вигравати, це також може «відлякати» користувача. Ми постаралися дотримати баланс. У грі є чотири рівні складності. На найвищому рівні, мені вдається виграти приблизно в половині партій, з відривом у 1-2 фішки. Низький рівень складності, можливо, буде цікавий для «казуальщіков».
 
Спочатку, ми хотіли використати альфа-бета алгоритм , для реалізації AI, але швидко відмовилися від цієї ідеї. Випадковий характер генерації ходів, має свою специфіку. Насправді, важливо тільки те, щоб тебе не «з'їли» (з високою ймовірністю) на наступному ходу. Заглядати далі — накладно і, в цілому, марно. Для цієї гри потрібно не «штучний інтелект», а радше «штучний інстинкт», але «інстинкт» досить-таки складний. Ось який псевдокод вийшов у мене в кінцевому підсумку:
 
 Реалізація ігрового AI
- Segment 1 вес = 0.5
  - level >= 3
    - level < 8
      - Если есть ходы на "розетки", выбрать из них ход, расположенный дальше от старта
    - level >= 8
      - Если есть ход на "розетку" не оставляющий g2 пустой, выбрать ход расположенный дальше от старта

- Segment 2 вес = 0.3
  - level >= 5
    - Если имеются ходы со срубанием перевернутых фишек, выбрать наиболее удаленный от старта
    - Если имеются ходы со срубанием обычных фишек, выбрать ближайший к старту
  - level = 4
    - Если имеются ходы со срубанием, выбрать из них ход, расположенный дальше от старта
  - level >= 8
    - Если есть возможность хода на g2 и поле пусто, идти туда
  - level >= 9
    - Если есть возможность занять g1 или h1, ходим туда
  - level >= 6
    - Если можно вывести фишку с поля, выбрать этот ход
  - level >= 5
    - Если на первых четырёх клетках нет фишек, выбрать ход со стартовой позиции
  - level >= 4
    - Если имеются ходы с блокированием, выбрать случайный из них

- Segment 3 вес = 0.2
  - level < 8
    - level >= 7
      - Если имеется ход на поле не под боем, выбрать любой из них
    - level >= 2
      - Xод фишкой, расположенной дальше от старта
    - level = 1
      - Ход случайно выбранной фишкой
  - level >= 8
    - level = 8
      - Ход на максимальном расстоянии от старта на поле не под боем, не оставляющий g2 пустой
      - Ход на максимальном расстоянии от старта, не оставляющий g2 пустой
    - level = 9
      - Ход на максимальном расстоянии от старта на поле не под боем, не оставляющий g2 пустой, не с g1 или h1
      - Ход на максимальном расстоянии от старта, не оставляющий g2 пустой, не с g1 или h1
    - Любой оставшийся ход

 
Тут визначено 9 ігрових рівнів, які враховують різні аспекти поточної позиції. Фактично, в більш складній грі, зразок Шахів, подібні евристики управляли б порядком перебору ходів (для перегляду «найкращих» ходів в першу чергу). Наша гра простіше. У ній евристики можуть використовуватися безпосередньо для вибору «кращого» ходу. Як я вже говорив вище, цього цілком достатньо, щоб програма грала, приблизно, на одному рівні з людиною.
 
Ось вона, «Забута гра Ур», яку ми отримали в результаті:
 
  
У цю гру дійсно приємно грати! Вона повертає мене в ті часи, коли ми ходили один до одного в гості не тільки для того, щоб випити і закусити. Так, тоді і трава була зеленішою і дерева вище, але справа не в цьому. Ми майже перестали грати у Шахи і Шашки. Ми не збираємося родинами, щоб зіграти в Бридж. Го і Сеги, для більшості з нас — недосяжна екзотика. Навіть старички-доміношники кудись пропали з двору. Homo Ludens — «Людина, що грає» забув про настільні ігри. Звичайно, розробка всього однієї гри під iOS і Android цього не виправить, але, можливо, в якійсь мірі, допоможе повернути інтерес до настільних ігор? Я сподіваюся на це.
 
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.