Что такое настольная игра GOT?

«Игра престолов» (ASOIAF) — всемирно известная серия книг, созданная Джорджем Р. Р. Мартином.
В 2003 году Fantasy Flight создала настольную игру на основе этих книг. Игра состоит из карты, разделенной на 50 территорий (38 земель и 12 морей), по которым игроки могут перемещать свои фигуры (пешеходы, всадники, башни и корабли). в течение 10 раундов. Одна из конечных целей — закончить 10 раундов с максимальным количеством замков/крепостей, т.е.
Каждая территория может иметь замок, крепость, припас или корону.

Правил гораздо больше, и вам было бы скучно, если бы я объяснял каждое из них, но здесь следует ссылка на официальную книгу правил: https://images-cdn.fantasyflightgames.com/filer_public/30 /4f/304f72e3-4fe4-4f91-bfbe-75133161b092/va65_agot2_rulebook_web.pdf

Это форма карты с территориями:

Проект

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

ПланированиеАРХИТЕКТУРЫ представлений

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

  • Представление карты и специфики каждой территории
  • Представление фигур и их возможных ходов
  • Представление карт и их действий
  • Построение действия игры в кости
  • Программирование правил
  • Статистическое моделирование случайных событий

Планирование МОДЕЛИРОВАНИЯ

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

Карта

Поскольку каждая территория может быть связана с другими или нет, структура данных, которую я выбрал для представления карты, представляет собой график, в котором вершины содержат специфику территории, а каждое ребро является связью между территориями.

Для этого сначала я обозначил каждую территорию идентификатором, как показано на следующем изображении.

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

# 12 seas, 38 lands
n_vertices = 50

edges = [
    (1,2), (1,3), (1,39), (1,50),
    (2,1), (2,3), (2,50),
    ...
    (49,5), (49,6), (49,9), (49,12), (49,13), (49,14), (49,15), (49,20), (49,47), (49,50),
    (50,1), (50,2), (50,3), (50,5), (50,6), (50,49)

Затем мы создаем график из него

import igraph as ig
g = ig.Graph(n_vertices, edges)

Затем мы называемграф и каждый узел (территорию)

g["title"] = "GOT Map"

g.vs["name"] = ["Castle Black", "Karhold", "Winterfell", "The Stony Shore", "White Harbor", "Widow's Watch",
                "Flint's Finger", "Greywater Watch", "Moat Cailin", "Pyke", "Seagard", "The Twins", "The Fingers",
                "The Mountaisn of the Moon", "The Eyrie", "Riverrun", "Lannisport", "Stoney Sept", "Harrenhal",
                "Crackclaw Point", "Searoad Marches", "Blackwater", "King's Landing", "Dragonstone",
                "Kingswood", "The Reach", "Highgarden", "Dornish Marches", "Oldtown", "Three Towers", "Prince's Pass",
                "The Boneway", "Storm's End", "Starfall", "Yronwood", "Sunspear", "Salt Shore", "The Arbor",
                "Bay of Ice", "Sunset Sea", "Ironman's Bay", "The Golden Sound", "West Summer Sea", "Redwine Straits" , "East Summer Sea",
                "Sea of Dorne", "Shipbreaker Bay", "Blackwater Bay", "The Narrow Sea", "The Shivering Sea"]

Затем мы должны указать, является ли территория сушей или морем (верно для суши и неверно для моря).

g.vs['land'] = [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True,
                True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True,
                True, True, True, True, True, True, False, False, False, False, False, False, False, False, False,
                False, False, False]

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

g.vs['port'] = [(False,0), (False,0), (True,39), (False,0), (True,49), (False,0), (False,0), (False,0), (False,0),
                (True,41), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0), (True,42), (False,0),
                (False,0), (False,0), (False,0), (False,0), (False,0), (True,47), (False,0), (False,0), (False,0),
                (False,0), (True,44), (False,0), (False,0), (False,0), (True,47), (False,0), (False,0), (True,45),
                (False,0), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0),
                (False,0), (False,0), (False,0), (False,0), (False,0)]

Затем мы указываем, на каких территориях есть токен Supply и Crown (1, если есть, и 0, если нет).

g.vs['supply'] = [0,0,1,1,0,1,0,1,0,1,1,0,1,1,1,1,2,0,0,0,1,2,0,1,1,0,2,0,0,1,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0]

g.vs['crown'] = [1,1,1,0,0,0,0,0,0,1,1,1,0,0,1,1,0,1,1,0,0,0,2,1,1,0,0,1,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0]

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

g.vs['castle'] = [(False,0), (False,0), (True,5), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0), (True,5), (True,0), (False,0), (False,0), (False,0),
                  (False,0), (True,0), (True,5), (False,0), (False,0), (False,0), (False,0), (False,0), (True,5), (True,5), (False,0), (False,0), (True,5), (False,0),
                  (True,0), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0), (True,5), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0),
                  (False,0), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0), (False,0)]

g.vs['stronghold'] = [False, False, False, False, True, False, True, False, True, False, False, False, False,
                      False, True, False, False, False, True, True, False, False, False, False, False, True,
                      False, False, False, False, False, False, True, True, True, False, False, False, False,
                      False, False, False, False, False, False, False, False, False, False, False]

Заключение

Вот как я построил доску для этой настольной игры, следующий шаг — представить фигуры: Пехотинцы, Всадники, Башни и Корабли, их особенности и их возможные ходы на доске.

Это ссылка на этот репозиторий: https://github.com/EduuF/GOT_BG

Любая помощь или предложения всегда приветствуются, большое спасибо.

CYA скоро в моем следующем обновлении об этом проекте,
Пока, спасибо! =D