Russian AI Cup

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

Автор Тема: пакет для Go  (Прочитано 1227 раз)

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
пакет для Go
« : Ноября 08, 2017, 05:07:23 pm »

пишу пакет для Go, но он не работает с локалранером, прошу помощи
https://github.com/WETErokAI/raic2017startbot

в файле client.go в функции ReadPlayerContext сразу получаю сообщение GameOver

за основу был взят код Irioth с прошлого чемпионата
« Последнее редактирование: Ноября 08, 2017, 05:13:46 pm от weterok_ai »
Записан

dreddsa

  • Newbie
  • *
  • Сообщений: 2
Re: пакет для Go
« Ответ #1 : Ноября 08, 2017, 07:18:18 pm »

+ 1 звезда Github
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #2 : Ноября 09, 2017, 01:15:55 am »

5 копеек от себя:

https://github.com/1stborn/go-codewars

пакет с реюзом обьектов,  дабы не заставлять страдать GC каждый тик, возможно есть еще баги
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #3 : Ноября 09, 2017, 05:53:29 pm »

5 копеек от себя:

https://github.com/1stborn/go-codewars

пакет с реюзом обьектов,  дабы не заставлять страдать GC каждый тик, возможно есть еще баги

спасибо помогло найти ошибки.  Но у меня твой код при подключении к локалранеру вываливается в панику.

Свою версию кода на git обновил, всё еще возможны ошибки сильно не тестил, кто что найдет пишите.
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #4 : Ноября 09, 2017, 09:06:50 pm »

я на нем уже пару страт написал, все норм )), а вываливается в панику наверное потому что я забыл в примере сделать создание инстанса world
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #5 : Ноября 09, 2017, 09:07:16 pm »

в репе уже всё поправил
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #6 : Ноября 10, 2017, 01:04:22 am »

в итоге столкнулся с проблемой вложенности папок и пришлось сделать по аналогии с прошлым годом
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #7 : Ноября 10, 2017, 06:40:27 am »

в итоге столкнулся с проблемой вложенности папок и пришлось сделать по аналогии с прошлым годом

Нужно решить некоторые моменты и можно будет просить админов включить пакет в доступные.

1. Чей языковой пакет брать. Думаю взять нужно твой т.к. вижу что он быстрее обновляется и код более в стиле Go. Хотя мне мой больше нравиться :)
2. Считаю что нужно привести имена констант к кому виду как они описаны в документации. Например ActionType у тебя в коде синоним Run в документации он Move. Можно сделать как у меня Action_Move. То есть все значения Action начинаются со слова Action а дальше часть Move как она в документации, код будет понятней и соответствовать документации.
3. В файле mystrategy.go добавит:
func (m *MyStrategy) Move(player *Player, world *World, game *Game, move *Move) {
   // put your code here
   if world.TickIndex == 0 {
      move.Action = ClearAndSelect
      move.Right = world.Width
      move.Bottom = world.Height
   }

   if world.TickIndex == 1 {
      move.Action = Run
      move.X = world.Width / 2.0
      move.Y = world.Height / 2.0
   }
}
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #8 : Ноября 10, 2017, 10:44:39 am »

вот такой код приводит к зависанию локалранера.  При чем как в моем так и твоем языковом пакете, в питоне зависания нет

func (m *MyStrategy) Move(player *Player, world *World, game *Game, move *Move) {
// put your code here

fmt.Println(world.TickIndex)

if world.TickIndex == 0 {
move.Action = ClearAndSelect
move.Right = world.Width
move.Bottom = world.Height

fmt.Println("ClearAndSelect 1")
}

if world.TickIndex == 1 {
move.Action = Assign
move.Group = 1
fmt.Println("Assign")
}

if world.TickCount == 2 {
move.Action = Deselect
fmt.Println("Deselect")
}

if world.TickCount == 3 {
move.Action = ClearAndSelect
move.Group = 1
fmt.Println("ClearAndSelect 2")
}

if world.TickIndex == 4 {
//if world.TickIndex == 1 {
move.Action = Run
move.X = world.Width / 2.0
move.Y = world.Height / 2.0
fmt.Println("Run")
}
}
силы меня покидают, а ведь до стратегии еще не добрался
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #9 : Ноября 10, 2017, 02:33:06 pm »

исправил баги, проверил что все команды работают и клиент не виснет, привел имена констант в соответствии с документацией - пробуйте, тестируйте, но походу всё ок

https://github.com/1stborn/go-codewars/archive/master.zip
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #10 : Ноября 10, 2017, 03:16:25 pm »

исправил баги, проверил что все команды работают и клиент не виснет, привел имена констант в соответствии с документацией - пробуйте, тестируйте, но походу всё ок

https://github.com/1stborn/go-codewars/archive/master.zip


не виснет, отличная работа! Спасибо.
Можно админам писать
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #11 : Ноября 10, 2017, 08:41:15 pm »

Обновил до версии 2, обновите локалраннер, а то будет GameOver
Записан

ewgraf

  • Jr. Member
  • **
  • Сообщений: 14
Re: пакет для Go
« Ответ #12 : Ноября 11, 2017, 02:01:35 am »

Взял за основу вариант firstborn, все взлетело. Большое спасибо.
Записан

ewgraf

  • Jr. Member
  • **
  • Сообщений: 14
Re: пакет для Go
« Ответ #13 : Ноября 11, 2017, 02:19:35 am »

Обновил до версии 2, обновите локалраннер, а то будет GameOver

Чуть-чуть поторопился, начал дальше стратегию писать, наткнулся на баг

Надо сделать:

   Vehicle_Arrv VehicleType = iota - 1

Иначе типы техники неправильные значения принимают, так как None забирает ноль и дальше все с единицы начинается.
Записан

ewgraf

  • Jr. Member
  • **
  • Сообщений: 14
Re: пакет для Go
« Ответ #14 : Ноября 11, 2017, 02:39:20 am »

Это фича или баг, что world.MyPlayer() доступен только в нулевом тике, а потом он nil?
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #15 : Ноября 11, 2017, 04:33:52 am »


Чуть-чуть поторопился, начал дальше стратегию писать, наткнулся на баг

Надо сделать:

   Vehicle_Arrv VehicleType = iota - 1

Иначе типы техники неправильные значения принимают, так как None забирает ноль и дальше все с единицы начинается.

да нет всё верно, техника начинается с 0, не установленный тип None в этом пакете 255

вот как в с++

namespace model {
    enum VehicleType {
        _VEHICLE_UNKNOWN_ = -1,
        VEHICLE_ARRV = 0,
        VEHICLE_FIGHTER = 1,
        VEHICLE_HELICOPTER = 2,
        VEHICLE_IFV = 3,
        VEHICLE_TANK = 4,
        _VEHICLE_COUNT_ = 5
    };
}

в питоне
class VehicleType:
    ARRV = 0
    FIGHTER = 1
    HELICOPTER = 2
    IFV = 3
    TANK = 4

Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #16 : Ноября 11, 2017, 04:39:17 am »

Это фича или баг, что world.MyPlayer() доступен только в нулевом тике, а потом он nil?

тут что то странное world.Players то содержит данные то не содержит, от тика не зависит, нужно разбирать
в питоне проверил данные есть на каждом тики, значит это не ошибка локалранера
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #17 : Ноября 11, 2017, 05:47:16 am »

Нашел ошибку. Дело в том что Players и Facilities обновляются не каждый тик а когда изменяются в них данные.

Исправленный файл client.go https://yadi.sk/d/dyzD8MV53PbWwg пока firstborn спит
добавлено

type CodeWars struct {
*AiCup

previousPlayers    []*Player
previousFacilities []*Facility

функции readPlayers и readFacilities заменены
Записан

ewgraf

  • Jr. Member
  • **
  • Сообщений: 14
Re: пакет для Go
« Ответ #18 : Ноября 11, 2017, 11:07:22 am »

да нет всё верно, техника начинается с 0, не установленный тип None в этом пакете 255

да, но константы там определяются группой:

const (
   NONE=255 -> iota 0
   Vehicle_X -> iota 1
)

в итоге у танка сейчас type = 5
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #19 : Ноября 11, 2017, 11:33:43 am »

да действительно так, ошибся, надо править
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #20 : Ноября 11, 2017, 11:41:58 am »

- nil на своем игроке поправил.
- vehicle_type исправил

по поводу 255:
var a int8 = -1 // byte in Java

func main() {
   fmt.Println(uint8(a)) // byte in real world = 255
}

- исправил игроков/постройки
« Последнее редактирование: Ноября 11, 2017, 12:01:12 pm от firstborn »
Записан

ewgraf

  • Jr. Member
  • **
  • Сообщений: 14
Re: пакет для Go
« Ответ #21 : Ноября 11, 2017, 09:31:29 pm »

Добавьте пожалуйста Go, хотелось бы уже немного покатать стратегию в песочнице.
Записан

dreddsa

  • Newbie
  • *
  • Сообщений: 2
Re: пакет для Go
« Ответ #22 : Ноября 12, 2017, 10:55:07 am »

Добавьте пожалуйста Go, хотелось бы уже немного покатать стратегию в песочнице.
+
Записан

ewgraf

  • Jr. Member
  • **
  • Сообщений: 14
Re: пакет для Go
« Ответ #23 : Ноября 12, 2017, 02:47:11 pm »

А кто-нибудь пробовал Scale команду? Работает? У меня что-то не заводится.
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #24 : Ноября 12, 2017, 02:59:52 pm »

А кто-нибудь пробовал Scale команду? Работает? У меня что-то не заводится.
да работает, только в логику не вникал, и с коэффициентами в документации что то напутано

if world.TickIndex == 0 {
move.Action = Action_ClearAndSelect
move.Right = world.Width
move.Bottom = world.Height
}

if world.TickIndex == 1 {
move.Action = Action_Scale
move.Factor = 2.0
move.X = -world.Width / 4.0
move.Y = -world.Height / 4.0
}
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #25 : Ноября 12, 2017, 05:49:43 pm »

Обновил до версии 3
Записан

kveselkov

  • Newbie
  • *
  • Сообщений: 3
Re: пакет для Go
« Ответ #26 : Ноября 13, 2017, 07:33:46 pm »

Ждем добавления пакета  :)
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #27 : Ноября 13, 2017, 08:56:50 pm »

нас игнорируют ((
Записан

SladeThe

  • Global Moderator
  • Sr. Member
  • *****
  • Сообщений: 185
Re: пакет для Go
« Ответ #28 : Ноября 16, 2017, 07:49:02 pm »

Мы просмотрели оба пакета. В обоих случаях структура файлов и каталогов отличается от других пакетов. Необходимо привести в соответствие. Также в одном из пакетов отличается сэмпловая стратегия.

Выберите один пакет как основной и доработайте его.
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #29 : Ноября 16, 2017, 09:06:27 pm »

https://github.com/1stborn/go-codewars

Обновил пакет, но так как формат ответа "отличается от других пакетов" не говорит ровным счетом ни о чем, сделал по своему разумению. Если скажете что конкретно не так, исправлю
Записан

SladeThe

  • Global Moderator
  • Sr. Member
  • *****
  • Сообщений: 185
Re: пакет для Go
« Ответ #30 : Ноября 16, 2017, 11:14:11 pm »

Должны быть файлы Runner.*, MyStrategy.*, RemoteProcessClient.*, Strategy.* (если в языке есть интерфейсы или абстрактные классы, то обязательно, иначе может не быть), папка model с соответствующими файлами. Т.е. одному файлу в другом пакете должен соответствовать один файл в пакете на Go. Если каждый будет делать свою собственную структуру пакетов, вычитывать код будет невозможно. Именование файлов может отличаться, если этого требуют рекомендации языка, например RemoteProcessClient может стать remote_process_client, но состав слов должен быть сохранён.
Записан

SladeThe

  • Global Moderator
  • Sr. Member
  • *****
  • Сообщений: 185
Re: пакет для Go
« Ответ #31 : Ноября 16, 2017, 11:22:36 pm »

По поводу того, что в прошлом году было не так. Тогда был ряд других трудностей со вводом языка в систему, поэтому в итоге решили поддержать хоть как-то.
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #32 : Ноября 17, 2017, 02:36:59 am »

вот-это я понимаю нормальный ответ.

привел к максимально возможной идентичности с документацией. Если вынести remote_process_client на уровень main он станет не импортируемым извне что не позволит подключить код просто склонив код себе в зависимости. Все файлы переименовал так как требуется. Даже добавил бесполезный в контексте Go PlayerContext, что бы придраться уже было не к чему. Дальнейшие изменения приводят либо к невозможности импорта, либо к импорт циклу.
Записан

Irioth

  • Newbie
  • *
  • Сообщений: 1
Re: пакет для Go
« Ответ #33 : Ноября 17, 2017, 02:15:00 pm »

@SladeThe вы не думали начать использовать формат независимый от языка c кодогенерацией моделей (protobuf/grpc, thrift, ... тысячи их)? ну хотя бы в 2018? поддержка единого протокола для каждого из десятки языков станет значительно проще, ценой лишь одной внешней зависимости в runner.
Записан

SladeThe

  • Global Moderator
  • Sr. Member
  • *****
  • Сообщений: 185
Re: пакет для Go
« Ответ #34 : Ноября 17, 2017, 03:56:19 pm »

Структура файлов и каталогов по-прежнему не полностью соответствует другим пакетам. Структура кода, разумеется, тоже. Почему remote_process_client находится в папке клиент, если во всех других пакетах он в корне? Почему код, связанный с обработкой аргументов и инициализацией стратегии, перенесён из runner в remote_process_client, если этот код не связан напрямую с сетевым взаимодействием?

Непонятно, почему mystrategy может находиться на уровне main, а remote_process_client не может.

Мы постараемся поддержать пакет в текущем виде, но в следующем году для успешной приёмки придётся всё привести в соответствие.
« Последнее редактирование: Ноября 17, 2017, 04:06:37 pm от SladeThe »
Записан

SladeThe

  • Global Moderator
  • Sr. Member
  • *****
  • Сообщений: 185
Re: пакет для Go
« Ответ #35 : Ноября 17, 2017, 04:02:28 pm »

Почему интерфейс Strategy находится в папке model?
Записан

SladeThe

  • Global Moderator
  • Sr. Member
  • *****
  • Сообщений: 185
Re: пакет для Go
« Ответ #36 : Ноября 17, 2017, 06:15:20 pm »

Добавили Go.
Записан

kveselkov

  • Newbie
  • *
  • Сообщений: 3
Re: пакет для Go
« Ответ #37 : Ноября 17, 2017, 06:48:21 pm »

спасибо  :)
а в http://russianaicup.ru/p/packs он появится?
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #38 : Ноября 17, 2017, 07:00:38 pm »

Почему интерфейс Strategy находится в папке model?

иначе получится import cycle
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #39 : Ноября 19, 2017, 05:39:23 am »

а как так игра http://russianaicup.ru/game/view/2520 8 ноября на Go когда языковой пакет добавили 17 ноября ?
Записан

kveselkov

  • Newbie
  • *
  • Сообщений: 3
Re: пакет для Go
« Ответ #40 : Ноября 19, 2017, 09:49:29 am »

Это я залил тестовую стратегию go (посмотреть скомпилится на сервере или нет) и у меня поменялась иконка на актуальной стратегии на С++. Бага :)
Записан

alexions

  • Newbie
  • *
  • Сообщений: 2
Re: пакет для Go
« Ответ #41 : Ноября 21, 2017, 12:40:38 am »

Подскажите right-way как отправить Go стратегию?

Сейчас, как я вижу, есть только единственный вариант это сделать - все писать в одном файле MyStrategy.go и потом содержимое отправлять через текстовое поле (возможно, можно залить MyStrategy.go через upload). Но это же вообще не удобно весь код пихать в один файл!

Я еще только написал "базовую версию", но уже суммарно за 500 строк перевалило. Дальше только хуже.
Есть возможность залить архив (как в Python, например), или скомпилить бинарник (что-то похожее на Jar в Java) под Linux? (хотя опять ограничение, бинарник не должен быть больше 2Mb, а базовая версия весит примерно 2.5Mb). Очень не хочется все делать в одном файле.
Записан

ewgraf

  • Jr. Member
  • **
  • Сообщений: 14
Re: пакет для Go
« Ответ #42 : Ноября 21, 2017, 03:18:13 am »

можешь складывать файлы рядом с MyStrategy.go

все файлы *.go которые лежат рядом с MyStrategy.go пакуешь в zip и отправляешь.

client, model, бинарники отправлять не надо

веcит это буквально килобайты
Записан

firstborn

  • Jr. Member
  • **
  • Сообщений: 13
Re: пакет для Go
« Ответ #43 : Ноября 21, 2017, 01:38:52 pm »

как вариант, что бы не таскать файлы из репы в свою стратегию : клонишь репу куда нибудь, потом создаешь директорию со стратегией, в ней создаешь файл runner.go с кодом:

import "client"

func main() {
  client.Start(New())
}

$ cd /path/to/mystrategy  && GOPATH="`pwd`:/path/to/cloned/client" go build -o mystrategy

для отправки пакуешь все файлы кроме своего runner.go в zip и шлешь
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #44 : Ноября 21, 2017, 03:01:11 pm »

для визуализатора https://github.com/kswaldemar/rewind-viewer клиента не писали ?
Записан

weterok_ai

  • Jr. Member
  • **
  • Сообщений: 32
Re: пакет для Go
« Ответ #45 : Ноября 23, 2017, 04:31:14 am »

написал клиента для визуализатора если кому надо https://yadi.sk/d/UfCol8LH3PuoEr
в репозиторий проекта пока времени нет добавить
Записан
Страницы: [1]