Russian AI Cup

Расширенный поиск  
Страницы: [1]

Автор Тема: Позиционирование областей на карте  (Прочитано 1527 раз)

Meltzer

  • Newbie
  • *
  • Сообщений: 3
Позиционирование областей на карте
« : Сентября 19, 2014, 07:03:22 pm »

Здравствуйте. Вопрос от зеленого новичка в программировании  :)

Я выделил для стратегии область около ворот противника 200 < X < 400 координатами и стратегия в LocalRunner'е играет как надо. Однако есть подозрения что при отправке стратегии на конкурс, она будет играть не только с правой стороны, как в раннере, но еще и с левой и хоккеисты будут вместо ворот противника кататься около своих.

Как правильно выделить некоторую область перед воротами противника?



Все что я смог придумать - это сделать толпу if-else учитывающую оба варианта игры, но кажется это как то неправильно.
Язык C#

Спасибо разработчикам за такой прекрасный способ популяризации программирования!  :)
Записан

vitsum

  • Full Member
  • ***
  • Сообщений: 62
Re: Позиционирование областей на карте
« Ответ #1 : Сентября 19, 2014, 07:10:54 pm »

world.GetOpponentPlayer().NetFront, А также NetBack, NetTop, NetBottom
Записан

NORD

  • Jr. Member
  • **
  • Сообщений: 16
Re: Позиционирование областей на карте
« Ответ #2 : Сентября 19, 2014, 07:26:38 pm »

Я использую следующий способ, если мне надо получить относительные координаты которые симметрично меняются в зависимости от стороны с которой я играю, то сначала при 1 ходе я определяю сторону,и заношу в соответствующую переменную значения, если я справа то 1 если слева то -1:
if(me.getNetFornt() > 600) side = 1;
else side = -1;

Теперь допустим я хочу получить точку напротив ворот противника, вычисляю ее так: половина ширины поля(600) + сдвиг*side, например нужна точка 350 если я справа и 850 если я слева, получаем: 600 - 250 * side, с какой бы стороны мы не находились всегда получим нужную точку.
Общий вид: 600 - (искомая_позиция_если_я_справа-600)*side.
Записан

Meltzer

  • Newbie
  • *
  • Сообщений: 3
Re: Позиционирование областей на карте
« Ответ #3 : Сентября 19, 2014, 07:35:35 pm »

Я использую следующий способ, если мне надо получить относительные координаты которые симметрично меняются в зависимости от стороны с которой я играю, то сначала при 1 ходе я определяю сторону,и заношу в соответствующую переменную значения, если я справа то 1 если слева то -1:
if(me.getNetFornt() > 600) side = 1;
else side = -1;

Теперь допустим я хочу получить точку напротив ворот противника, вычисляю ее так: половина ширины поля(600) + сдвиг*side, например нужна точка 350 если я справа и 850 если я слева, получаем: 600 - 250 * side, с какой бы стороны мы не находились всегда получим нужную точку.
Общий вид: 600 - (искомая_позиция_если_я_справа-600)*side.

Благодарю за ответ!  :)
Записан

DanilinSA

  • Jr. Member
  • **
  • Сообщений: 11
Re: Позиционирование областей на карте
« Ответ #4 : Сентября 20, 2014, 09:46:17 am »

В начале стратегии вычисли центр своих ворот и ворот противника. А далее  если Х у противника больше - ты с права и наоборот. Или с серединой поля сравнивать. Или ... есть куча вариантов
Записан

Meltzer

  • Newbie
  • *
  • Сообщений: 3
Re: Позиционирование областей на карте
« Ответ #5 : Сентября 20, 2014, 01:59:59 pm »

Вообще проблема была в конструкции принятия решений.
Например:
if (self.X < 400) //
    {
          *тут обозначен поворот к воротам противника и SpeedUP*
    }
else
    {
          *что делать в другом случае*
    }

Однако, данная конструкция будет работать только для случая, когда ворота противника слева.
Даже если заменить абсолютную координату 400 на зависимую от ворот, вроде 800, то получится вот что: if (self.X < 800)Хотя правильно бы так: if (self.X > 800)
Получается надо развернуть знак с "<" на ">", для других ворот. Я это решил путем создания еще одного if и выбора нужного путем switch-case. Пока книгу только до конструкций принятия решений дочитал  :)

Насколько понимаю - это плохой подход, и я хотел узнать как менять знаки у ифов в зависимости от стороны.
« Последнее редактирование: Сентября 20, 2014, 02:02:19 pm от Meltzer »
Записан

vitsum

  • Full Member
  • ***
  • Сообщений: 62
Re: Позиционирование областей на карте
« Ответ #6 : Сентября 20, 2014, 02:03:43 pm »

Ну можно измерять расстояние до ворот противника) Self.GetDistanceTo(..)
Либо если только для координаты X, то в начале игры записываем в переменную OpponentSide = 0 или 1200, В переменную AreaWidth = 400
if(Math.Abs(Self.X - OpponentSide) < AreaWidth)
{
     Self.Turn = Self.GetAngleTo(OpponentGate.X, OpponentGate.Y);
}
« Последнее редактирование: Сентября 20, 2014, 02:11:22 pm от vitsum »
Записан

YellowCataclysm

  • Newbie
  • *
  • Сообщений: 4
Re: Позиционирование областей на карте
« Ответ #7 : Октября 01, 2014, 06:42:56 pm »

Возможно уже не актуально, но все же.
Товарищ NORD дал вам решение, без использования дополнительных ветвлений и прочего.
Достаточно на старте определить свою сторону и сохранить в переменную -1 или 1, для одной и другой стороны.
В коде ниже принято, что если домашняя сторона левая, то my_side = 1 , иначе my_side = -1
Тогда, например, функция определения, на нашей ли стороне находится объект, будет выглядеть примерно так
bool MyStrategy::onMySide(const model::Unit & unit)
{
return ((unit.getX() - rink_center_x) * my_side < 0.0);
}
Аналогичным образом вы можете определять нужную вам область относительно чего угодно.
Такой код определит, какой из хоккеистов находится ближе к воротам противника(по координате Х)
if ((h1.getX() - h2.getX())*my_side < 0.0) // H2 ближе к воротам противника, чем H1
{
return h2;
}
Для большей понятности попробуйте нарисовать эти случаи на листке)
« Последнее редактирование: Октября 01, 2014, 06:45:51 pm от YellowCataclysm »
Записан

noop

  • Full Member
  • ***
  • Сообщений: 73
Re: Позиционирование областей на карте
« Ответ #8 : Октября 01, 2014, 09:59:35 pm »

Есть еще вариант. Конвертировать все параметры (координаты и относительные углы) к варианту, где ваша сторона все время справа, либо слева перед тем, как начинать что-либо дальше считать. Также желательно поставить начало координат в более удобное место, например в центр поля.
Записан
Страницы: [1]