Игра для программистов в футбол

Решил я как-то сделать 2D игру, в которой надо программировать футбольную команду. Такие игры называют играми для программистов. И таки сделал, правда спустя много лет, но всё же сделал.

Для меня странно, что такая интересная, на мой взгляд, идея не была реализована до этого никем в более-менее привлекательном виде. Может я просто не знаю о таких проектах... Знаю о RoboCup 2D симуляторе, но это больше для любителей робототехники. Мне же хотелось игру с более общим уровнем программирования и максимально простым языком. Видел несколько 3D игр в этом направлении, но весьма специфических и мало походящих на футбол.

Хотя футбол или, например, хоккей - не принципиально, т.к. физика взаимодействия игрока с мячом/шайбой не важна и опускается при, скажем так, схематической реализации игры, т.е. когда игроки и спортивный снаряд - точки без какой-либо формы. А важна только тактика игры, и ничего лишнего. Игроки должны завести снаряд в ворота, как в футболе, так и в хоккее. Отличие в том, что в хоккее есть борт, и шайба не уходит за пределы поля. Есть возможность игры с отскоком шайбы от борта, но появляется проблема связанная с блокировкой шайбы в случае, если несколько игроков будут пытаться завладеть ей у борта. В общем, остановился я на футболе с 4 игроками.

И так, суть игры одним предложением: написать команду (код для каждого из 4 игроков), загрузить её на сайт и соревноваться с другими командами.

<i>​Игра для программистов FuncBall</i>
​Игра для программистов FuncBall

Код (скрипт) игроков состоит из условий и действий. Писать свои функции нет необходимости. Вы просто выбираете нужные из встроенных. Программирование игроков сводится к указанию, что должен делать игрок в той или иной ситуации. Можно перечислять все условия, но правильней делать сложные разветвлённые алгоритмы с вложенными условиями.

<i>Пример кода игрока​</i>
Пример кода игрока​

Как видите, всё на русском. Для меня важно, чтобы всё было понятно даже новичкам в программировании. Я также сделал возможность писать код в более привычном для непрограммистов виде:

Игра для программистов в футбол

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

Игра для программистов в футбол

[X4+50] это увеличенная на 50 координата X игрока 4, а [Y4] - его Y координата.

Пример, если расстояние от игрока до ворот противника менее 150 пикселей, то бить по воротам:

Игра для программистов в футбол

X и Y заменятся на координаты игрока, а D(X,Y,559,188) будет заменено на вычисленное расстояние от этой точки до точки с координатами 559,188 (координаты ворот).

Отправить мяч в случайную точку, проверив открыта ли она:

Игра для программистов в футбол

R(min,max) - это функция, возвращающая случайное число. Как видите, для запоминания значений макросов в их начало добавляется id макроса и символ @. Значение первого макроса записывается в кэш с id 1, а второго c id 2. Потом они извлекаются из кэша макросами [1@] и [2@].

Чтобы не писать код руками, в редакторе можно вставлять нужные функции по клику. А если кликнуть правой кнопкой, то появится справка по интересующей функции.

<i>Редактор команд</i>
Редактор команд

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

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

110110
60 комментариев

Немного на 1С похоже, перекрестился на всякий случай

64
Ответить

У 1С своей FIFA ещё не было))

Ответить

Из недостатков как для обучения программированию:

1) Нет различия переменных и функций. мяч_у_игрока, бить_по_воротам. Как понять, что вернёт данные, что выполнит действие?

2) Нет объектов, хотя тут они просто таки напрашиваются. Тот же "игрок4_открыт" лучше записать как игрок4.открыт.

3) Или записать хотя бы функциями, которые возвращают значение: игрок_открыт(4).

4) Да и нет никакой унификации. Вот это вот бить_по_воротам. Почему не удар(ворота)? Можно было бы использовать удар(вперёд), удар(аут). Туда же пас(игрок4), пас(вперёд), игрок1.бег(мяч), игрок3.бег(вперёд).

5) При этом куча низкоуровневых координатных вычислений. Хотя стоило бы проверять зоны и направления. Если(доступно(пас(игрок3))){пас(игрок3)}, Если(!штрафная(противник)){удар(ворота)}

Это приблизит игрока к реально существующим парадигмам программирования.

40
Ответить

Яростно плюсовать нельзя, так что просто плюсую.

5
Ответить

1) мяч_у_игрока и др. условия возвращают True или False. Действия ничего не возвращают. 

2) Это не ООП. Я с вами согласен во многом, но эта игра проще... 

3) Можно было. Просто синтаксические особенности. 

4 и 5) Не уверен, что это было бы понятней для начинающих. 

2
Ответить

Я очень хочу одновременно и выразить признательность за потраченные усилия, и максимально уважительно выразить весь свой ужас разработчика при мысли о таком языке - но не знаю, как. Потому что с одной стороны, пинать инди-разработчика за то, что он сделал что-то, что мне не понравилось - гадко. Ведь человек же забесплатно трудился, старался, всё для людей! Но с другой...

Писать свои функции нет необходимости.

В языке нет переменных

R(min,max) - это функция, возвращающая случайное число. Как видите, для запоминания значений макросов в их начало добавляется id макроса и символ @. Значение первого макроса записывается в кэш с id 1, а второго c id 2. Потом они извлекаются из кэша макросами [1@] и [2@].

Чтобы не писать код руками, в редакторе можно вставлять нужные функции по клику.

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

О том, чтобы сделать язык на русском, я и вовсе молчу. Просто нет осмысленных комментариев, одни гласные.

Мой совет, всем, кто хочет разработать "игры для программистов": возьмите пример с Screeps, и вместо того, чтобы писать собственный язык, просто возьмите уже готовый, со своей экосистемой. И уж тем более не заставляйте игрока использовать ваш встроенный редактор вместо своего: всё равно нормального плагина, для, например, эмуляции vim, вы в нём не сделаете.

13
Ответить

Игра не обучает какому-то определённому языку программирования. Поэтому ваш комментарий также неуместен, как и реклама здесь других игр.

3
Ответить