[Из песочницы] Игра для программистов FuncBall
Многие, как и я, любят футбольные симуляторы и многие увлекаются программированием. Когда-то, в далёком 2004 году, наигравшись в ФИФУ я подумал, что было бы неплохо совместить два моих увлечения в одной игре, в которой игроки управлялись бы не вручную, а написанным для них скриптом. Этакая игра для программистов, а-ля «RoboCup Simulation Soccer», только на свой лад. Я тогда был начинающим программистом и написал уже несколько простеньких игр, но реализовать свою задумку в полной мере не смог, так как не придумал, как написать подходящий интерпретатор языка программирования игроков. Игр для программистов сейчас стало больше, но такую, как я хотел не нашёл, и спустя много лет и тонны написанного кода, я решил вернуться к своей давней задумке.
Игра получилась такой, как я и хотел — funcball.com.
- Для каждого из 4 игроков пишется код из условий и действий, который выполняется каждые 50 мс.
- Каждый игрок управляет только собой и не имеет доступа к памяти других, но может подавать им сигналы. Память реализуется флагами.
- Все игроки движутся с одинаковой постоянной скоростью, но тот, который с мячом чуть медленнее. Вратарей нет.
- Коды игроков выполняются в случайном порядке. Код вводящего мяч с центра выполняется первым.
- Скорость и продолжительность игры можно менять. Есть возможность записи матчей.
- Язык постарался сделать максимально понятным для новичков. Писать свои функции не требуется, т.к. встроенные позволяют программировать практически любое поведение игрока.
- Есть возможность соревноваться с другими командами на сайте игры.
Синтаксис языка традиционный:
Есть форма записи без скобок, более привычная для непрограммистов:
Вот ещё пример:
Символ доллара производит выход из скрипта. В данном случае проверяется, что если мяч не у третьего игрока, то бежать в 10-й квадрат поля.
Вложенность поддерживается и приветствуется:
Это функция с включением аргумента (3 — номер игрока) в имя, что на мой взгляд понятно и удобочитаемо. В этом примере есть условие «игрок3_открыт».
Пример паса на ход игроку 4: В коде можно использовать так называемые макросы, вместо которых во время выполнения подставляются соответствующие значения.
Перед выполнением этой команды, макросы в квадратных скобках будут заменены на конкретные значения, и она будет выглядеть, например, так: отправить_мяч:254,190. [X4+50] это увеличенная на 50 координата X игрока 4, а [Y4] — его Y координата.
Пример, если расстояние от игрока до ворот противника менее 150 пикселей, то бить по воротам: В макросах могут использоваться встроенные макросные функции.
Если оно меньше 150, то весть макрос будет заменён на True (Истина), а если нет, то на False (Ложь), и получится: Если(True). X и Y заменятся на координаты игрока, а D(X,Y,559,188) будет заменено на вычисленное расстояние от этой точки до точки с координатами 559,188 (координаты ворот).
Начало координат стандартное — левый верхний угол. Поле я решил оставить в привычном горизонтальном виде. Номера своих игроков 1-4, а чужих 5-8. При программировании игроков надо считать, что они начинают на левой половине поля. команда будет играть точно так же как и на левой половине. При игре справа все координаты, номера квадратов, углы и номера игроков отражаются, т.е.
Для каждой функции есть справка. Редактор позволяет не писать весь код руками, а вставлять нужные функции по клику.
После этого она будет участвовать в регулярном чемпионате. Когда команда готова, её можно загрузить на сервер (делается из редактора в игре). Как часто будут чемпионаты, зависит от заинтересованности участников. Все загруженные команды будут играть между собой, а результаты и записи игр публиковаться на сайте. Команды сразу автоматически отправляются на отдельный сервер, где матчи играются, и обратно высылаются их записи, которые потом можно скачать и посмотреть. Пока ведётся набор команд для первого чемпионата.
На сайте также можно в любое время заказать матчи с выбранными командами.
Думаю, что есть немало людей, кому может быть интересен такой проект, и надеюсь, что эта статья поможет найти их. Так что, приглашаю всех желающих поиграть!