Когда я только начинал изучать язык программирования Java, я наткнулся на интересный проект с открытыми исходными кодами разработанный программистами компании IBM Mathew Nelson и Flemming Larsen.
Проект представляет собой игру, в которой соревнуются танки, искусственный интеллект которых программируется на языке Java. Игра RoboCode относится к жанру игр для программистов. Игры данного класса представляют собой соревнование искусственных интеллектов участвующих в игровом процессе роботов\машин\танков\etc..
Основным соревновательным элементом в обучении программированию должна была стать конкуренция. Каждый участник пишет код на Java, который управляет небольшим танком, и сражается на поле с другими такими же танками, интеллект которых запрограммирован другими игроками. В поставку игры уже входит множество классов Java, описывающих искусственный интеллект танков. Игра имеет большие функциональные возможности, несмотря на кажущуюся внешнюю простоту.
Ваша конечная цель — уничтожить все остальные танки на поле, тем самым доказав превосходство искусственного интеллекта, запрограммированного Вами. Не даром девизом игры является: "Build the best, destroy the rest!". У танков большое разнообразие возможных действий: они могут двигаться по игровому полю, стрелять, узнавать месторасположение друг в друга, врезаться в стены и в других роботов, узнавать где находятся летящие пули и использовать всю мощь языка Java для реализации алгоритма искусственного интеллекта.
Очевидно, что какой-либо однозначной стратегии для выигрыша нет. Существует огромное количество различных тактик, у каждой из которых есть свои преимущества и недостатки. Размер кода у различных танков колеблется от десятка строк до нескольких тысяч. Некоторые даже умудряются прибегать к статистическому анализу и нейронному программированию.
Интересно подошли к написанию искусственного интеллекта танка в СПБгУ ИТМО. Искусственный интеллект их танка был разработан с использованием SWITCH-технологий (смесь автоматного и объектно-ориентированного программирования) и к проекту прилагается серьезная проектная документация.
Программируемый танк состоит из следующих частей: "тело" танка, пушка и радар. Визуально это выглядит следующим образом:
Разумеется, каждая из трёх составляющих робота может двигаться по часовой и против часовой стрелки независимо друг от друга. Примечательным является отличие в скоростях вращения частей танка: "тело" танка поворачивается медленнее всего, пушка движется быстрее, а радар является самым быстрым элементом танка.
Игровое поле представляет из себя прямоугольник к размерами, задаваемыми перед началом битвы. Система глобальных координат не совсем стандартна: вместо привычного из курса компьютерной графики начала координат, помещённого в левый верхний угол, центр координат в игре RoboCode находится в левом нижнем углу. Таким образом, система координат выглядит следующим образом:
На официальном сайте проекта находится огромное количество различных материалов. Если Вы хотите начать обучение — это лучшее место для старта. Сама игра распространяется в виде jar-архива, который можно скачать со страницы скачивания игры. Игра кроссплатформенная, так как она написана на Java. В нее можно играть на Windows, Linux, FreeBSD и в любой другой системе, на которую портирована Java-машина. Именно Java-машина необходима для начала игры.
Разработчики включили в игру собственный редактор. Поэтому у Вас уже есть готовая среда для разработки с подсветкой синтаксиса.
Эта программа называется Robot Editor, и она доступна в меню Robot -> Editor. Таким образом, не обязательно иметь установленным на компьютере полноценные IDE, такие как Eclipse или NetBeans. Достаточно установленной виртуальной машины Java и пакета игры для создания и боевого тестирования "интеллекта" танка.
Показательным примером программы искусственного интеллекта танка может служить следующий пример дополенный комментариями, поясняющими игровую логику программируемого танка:
// Используем пакет с Вашими инициалами. Это сделано для избежания конфликтов имен.
package sadykbaiev;
// Указывает Java, что мы собираемся использовать объекты Robocode в нашей программе.
import robocode.*;
// Указывает Java: "Класс, описываемый ниже, является расширением класса Robot.
// И называется MyFirstRobot".
public class MyFirstRobot extends Robot
{
// Игра вызывает метод run(), когда начинается битва.
public void run()
{
// Здесь идет непосредственно код Вашего робота.
// while (true) означает то, что код в скобках будет выполнятся до тех пор, пока игра не прервется.
while (true)
{
// Робот проедет вперед на 100 пикселей.
ahead(100);
// Робот повернет свою пушку на 360 градусов.
turnGunRight(360);
// Робот вернется назад на 100 пикселей.
back(100);
// Робот снова повернет свою пушку на 360 градусов.
turnGunRight(360);
// После чего код начинает выполняться снова.
}
}
// Когда радар танка находит вражеский робот, мы начинаем стрелять
public void onScannedRobot(ScannedRobotEvent e)
{
fire(1);
}
}
Для дальнейшего изучения особенностей этой игры следует ознакомиться с следующими ресурсами:
К сожалению, русских материалов про Robocode не так и много. Но я надеюсь, что английский язык для Вас не сильно большая проблема.
Желаю успехов в постижении тонкостей Robocode!