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

CodeTanks на Python. Быстрый старт в Russian AI Cup для змееводов

Продолжаем тему примеров стратегий для CodeTanks. В данном примере привожу стратегию, написанную на Python 2. Стратегия простая, являющаясая базовой основой, для тех, кто хочет быстро понять принципы программирования AI для RAIC-CT. Суть стратегии заключается в поиске бонусов и езде за ними, попутно выбирая цели для обстрела. Выиграть с такой стратегий вряд ли удастся, но это хороший базис для начинающих ботоводов.


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

from math import *
from model.FireType import FireType
from model.TankType import TankType
 
class MyStrategy:
 
    def move(self, me, world, move):
 
        minAngleToEnemy = 100
 
        for tank in world.tanks:
            if tank.teammate:
                continue
 
            angleToEnemy = abs(me.get_turret_angle_to_unit(tank))
 
            if angleToEnemy < minAngleToEnemy and tank.crew_health > 0 and tank.hull_durability > 0:
                minAngleToEnemy = angleToEnemy
                minAngleTank = tank
 
        angleToEnemy = me.get_turret_angle_to_unit(minAngleTank)
 
        if angleToEnemy > pi / 180:
            move.turret_turn = 1
 
        elif angleToEnemy < -pi / 180:
            move.turret_turn = -1
 
        else:
            if me.premium_shell_count > 0:
                move.fire_type = FireType.PREMIUM_PREFERRED
            else:
                move.fire_type = FireType.REGULAR
 
 
        minBonusAngle = pi / 180 * 5
        minBonus = 0
        minDistanceToBonus = 123456789
 
        for bonus in world.bonuses:
            distanceToBonus = me.get_distance_to_unit(bonus)
 
            if distanceToBonus < minDistanceToBonus:
                minDistanceToBonus = distanceToBonus
                minBonus = bonus
 
        if minBonus:
            angleToBonus = me.get_angle_to_unit(minBonus)
            angleToBonusDegrees = angleToBonus * 180 / pi
 
            print minDistanceToBonus
 
            trackSpeed = 1;
            trackSpeed2 = 0.3;
            if abs(angleToBonusDegrees) > 90:
                trackSpeed =  -trackSpeed
                trackSpeed2 = -trackSpeed2
 
            if angleToBonus > minBonusAngle:
                move.left_track_power = trackSpeed
                move.right_track_power = trackSpeed2
            elif angleToBonus < -minBonusAngle:
                move.left_track_power = trackSpeed2
                move.right_track_power = trackSpeed
            else:
                move.left_track_power = trackSpeed
                move.right_track_power = trackSpeed
 
    def select_tank(self, tank_index, team_size):
        return TankType.MEDIUM

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

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