Всем привет! Приятно видеть тебя с нами. Меня зовут Мартин Тайлер, его зовут Аллен Смит рядом со мной. С нетерпением жду описания акции. Прекрасный день, не правда ли? Ага. Это высококлассная игра. Поехали!

Я большой фанат футбола, а это значит, что я тоже люблю играть в ФИФА. За прошедшие годы я увидел, что детализация игры была обновлена ​​до совершенно нового уровня. То, что осталось прежним, - это игровой процесс. Я всегда размышлял, как это работает, и этот блог посвящен тому, чтобы узнать, как был бы запрограммирован игровой процесс FIFA. Я не утверждаю, что ФИФА использует упомянутый мной подход, но это просто взгляд на игру глазами разработчика. Итак, приступим.

Почесывая поле

Представьте, что футбольное поле размещено на миллиметровой бумаге, чтобы лучше понимать расстояния.

Таким образом, мы можем указать координаты земли как xϵ [-15, 15] и yϵ [-10, 10]. Таким же образом мы можем указать координаты цели.

Упомянутая ниже функция предназначена для нахождения минимального расстояния между двумя точками на этом графике. Он нам очень понадобится.

def distance(A, B):
    return |A-B|

Управление игровым процессом

Как программист, первое, что мне приходит в голову, это то, что существует класс под названием «Player» с несколькими конечными переменными, такими как имя, национальность, положение, возраст, лицо и другие визуальные особенности. Есть функции атаки и защиты.

Любой, кто играл в эту игру, мог заметить, что одна кнопка выполняет две разные задачи - например, кнопка А выполняет стрельбу и захват. Это означает, что в игре есть два различных режима управления - атака и защита.

Будет ли выполнено атакующее действие или защитное действие, зависит исключительно от того, владеете ли вы мячом. Мы можем рассматривать владение как логическую переменную.

if distance(player, ball) == 0:
    possession = True
else:
    possession = False

if possession == True:
    mode = 'Attack'
else:
    mode = 'Defense'

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

Атака

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

Защита

while(True):
    team_A_Distance = create dict of key=player and value=distance(player, ball)
    
    sortDictByValue(team_A_Distance)
    
    control_index = 0
    control = team_A_Distance[control_index]
    if switchButtonPressed:
        control_index += 1
        control = team_A_Distance[control_index]  

Гол и на выезд

Основываясь на системе координат, если координаты мяча находятся в указанном диапазоне координат цели, мы можем сказать, что это цель. Точно так же, если мяч пересекает координаты поля, мы можем сказать, что это далеко.

Угловые и штрафные

Эти ситуации можно назвать исключениями. Если вы могли заметить, результат уже предрешен после удара по мячу. Даже если кнопка не нажата, действие выполняется. Нам нужно лучше обдумать эти случаи.

ЦЕЛЬ ЦЕЛЬ ЦЕЛЬ ЦЕЛЬ ЦЕЛЬ ЦЕЛЬ ВЫПОЛНЯЕТСЯ! Что ж, с этим голом, Алан, надо подвести итог для «Барселоны». Я бы так и подумал, теперь уж точно нет!

Я нашел этот интересный блог ИИ, генерирующий комментарии FIFA - https://towardsdatascience.com/ai-generating-football-video-game-commentary-271f56f45bf