Когда я только начинал изучать язык программирования 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!