вторник, 30 октября 2012 г.

Russian AI Cup. Быстрый старт на Java

Russian AI Cup — это новая инициатива команды разработки проекта Одноклассники в рамках соревнований IT-направленности. В этом чемпионате участники состязаются в умении писать искусственный интеллект на примере игровых стратегий. Организаторами являются ООО «Одноклассники» и национальный исследовательский Саратовский государственный университет.

Решил сделать тестового бота на Java. Наш танк будет поворачивать башню к ближайшему по углу от башни врагу и стрелять в него, только если велика вероятность попасть в противника. Определить это можно, посчитав разницу угла поворота башни и угла на противника. Если абсолютная величина этого значения достаточно мала (допустим, не больше одного градуса), то вероятность попасть довольно велика. Конечно, это не самый лучший способ определения точности выстрела, но зато он простой. Стратегия для передвижения по полю следующая: танк будет ездить за ближайшим по расстоянию бонусом.


Результат работы бота на RAIC можно тут http://russianaicup.ru/



Пишем стратегию для   Russian AI Cup - CodeTanks на Java


import model.*;
import java.lang.Math;
import static java.lang.StrictMath.PI;

/**
 * Проба пера =)
 *
 * @author 0xy
 */
public final class MyStrategy implements Strategy {
    double MIN_ANGLE = PI / 180.0; // угол в один градус

    @Override
    public TankType selectTank(int tankIndex, int teamSize) {
        return TankType.MEDIUM;
    }

    @Override
    public void move(Tank self, World world, Move move) {

        Tank[] allTanks = world.getTanks();
        double minAngle2enemy = 1E20;
        int selectedTank = allTanks.length;

        for (int i = 0; i < allTanks.length; ++i) {
            Tank tank = allTanks[i];
            if (!tank.isTeammate()) {
                 double angle2enemy = Math.abs(self.getTurretAngleTo(tank));

                 if (angle2enemy < minAngle2enemy) {
                    minAngle2enemy = angle2enemy;
                    selectedTank = i;
                }
            }
        }

        if (selectedTank != allTanks.length) {
            double angle2enemy = self.getTurretAngleTo(allTanks[selectedTank]);

            if (angle2enemy > MIN_ANGLE) {
                move.setTurretTurn(2.0);
            } else if (angle2enemy < -MIN_ANGLE) {
                move.setTurretTurn(-2.0);
            } else {
                move.setFireType(FireType.PREMIUM_PREFERRED);
            }
        }

        Bonus[] allBonuses = world.getBonuses();
        double minDist2bonus = 1E20;
        int selectedBonus = allBonuses.length;

        for(int i=0; i < allBonuses.length; ++i) {
            Bonus bonus = allBonuses[i];
            double dist2bonus = self.getDistanceTo(bonus);
            if (dist2bonus < minDist2bonus) {
                minDist2bonus = dist2bonus;
                selectedBonus = i;
            }
        }

        if (selectedBonus != allBonuses.length) {
           double angle2bonus = self.getAngleTo(allBonuses[selectedBonus]);

           if (angle2bonus > MIN_ANGLE) {
             move.setLeftTrackPower(0.75);
             move.setRightTrackPower(-1.0);
           } else if (angle2bonus < -MIN_ANGLE) {
             move.setLeftTrackPower(-1.0);
             move.setRightTrackPower(0.75);
           } else {
             move.setLeftTrackPower(1.0);
             move.setRightTrackPower(1.0);
           }
        }

    }

}



Запускаем local-runner.jar, ждем пока он загрузится и выдаст сообщение о том, что ждет подключение. Запускаем нашего бота и смотрим на результат =)


Комментариев нет:

Отправить комментарий