Русская виртуальная вселенная

Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.
Русская виртуальная вселенная

Форум пользователей Active Worlds


    Туториал по Python_BOT

    main_spirit
    main_spirit


    Сообщения : 12
    Дата регистрации : 2014-06-04

    Туториал по Python_BOT Empty Туториал по Python_BOT

    Сообщение автор main_spirit Вт Июн 10, 2014 7:39 pm

    Помощь по программированию на Python в боте PYTHON_BOT, руководство по взаимодействию с системой AW.
     
    Основные принципы работы бота, в простой структурной схеме.
    (Технически схема для простоты понимания построена не совсем правильно, но логически верно)

    [img]Туториал по Python_BOT 2my8adx[/img]
    ОСНОВНАЯ ПРОГРАММА (собственно сам бот) обменивается данными с сервером AW  через посредника, библиотеку AW.DLL, которая функционирует в области неуправляемого кода. В классе AWDLL (который уже работает в режиме управляемого кода) и осуществляется трансферт из неуправляемого кода в управляемый и наоборот. Сами процедуры трансферта исполняет УПРАВЛЯЮЩИЙ КОД. Все взаимодействие с мирами, как самого бота, так и программы, написанной на питоне (для интерпретатора питона), непосредственно осуществляется только через КЛАСС AWDLL.
                   
                    Это основной базовый принцип работы всей программы БОТа. Его надо четко понимать.
                    Пойдем дальше..


    [img]Туториал по Python_BOT 70wd9v[/img]

    ОСНОВНАЯ ПРОГРАММА лежит в области видимости пространства имен pythonbot
    Поэтому, чтобы иметь возможность из интерпретатора питона вообще хоть чем либо управлять в программе, надо питону это пространство имен ОБЪЯВИТЬ, чтобы он мог видеть и работать со всеми компонентами, объектами и классами, находящимися в этом пространстве имен.
    Делается это одной простой строкой в самом начале программы: import pythonbot


    Далее мы создаем (для удобства обращения к форме) наш объект MAIN_FORM, которому присваиваем указатель на нашу единственную форму.  Сигнатура указателя следующая: pythonbot – заходим в пространство имен бота =>THIS_FORM – обращаемся к классу THIS_FORM, в котором храниться объект CurrentForm. А вот объекту CurrentForm уже присвоен указатель на нашу форму в коде C#.

    MAIN_FORM=pythonbot.THIS_FORM.CurrentForm



    Среду для работы нашего бота мы подготовили, теперь осталось выполнить вход (подключить бота к серверу AW и войти в нужный нам мир)...


    MAIN_FORM.RUN_BOT("Имя бота", "Пароль привилегий", "Номер гражданства", "Мир, куда логиниться", Координаты бота Х, Координаты бота Y, Координаты бота Z, Угол поворота, Номер типа аватара для бота)
    ПРИМЕР: MAIN_FORM.RUN_BOT("MY_BOT", "45774", "15487", "Terra", 0, 0, 0, 0, 70)


    Дальше просто Smile


    pythonbot.AWDLL.aw_wait(5)                                  # Просто пишем, в дальнейшем расскажу об этой команде подробнее
    pythonbot.AWDLL.aw_say("Привет мир !")                 # Выводим в чат сообщение "Привет мир !"
    MAIN_FORM.SCRYPT_PLAY=False                             # Сообщаем программе что поток нам больше не нужен (обязательно)
    MAIN_FORM.SetTextSafe('БОТ ВЫШЕЛ ИЗ МИРА')       #Сообщение о выходе ()
    MAIN_FORM.STOP_BOT()                                        #Остановка и уничтожение бота (освобождаем память, обязательно)

    ПОЛНЫЙ КОД СКРИПТА:

    import pythonbot
    MAIN_FORM=pythonbot.THIS_FORM.CurrentForm
    MAIN_FORM.RUN_BOT("mybot", "12345", "54321", "stroybat", 0, 0, 0, 0, 70)
    pythonbot.AWDLL.aw_wait(5)
    pythonbot.AWDLL.aw_say("Привет мир !")
    MAIN_FORM.SCRYPT_PLAY=False
    MAIN_FORM.SetTextSafe('БОТ ВЫШЕЛ ИЗ МИРА')
    MAIN_FORM.STOP_BOT()
    main_spirit
    main_spirit


    Сообщения : 12
    Дата регистрации : 2014-06-04

    Туториал по Python_BOT Empty Re: Туториал по Python_BOT

    Сообщение автор main_spirit Вт Июн 10, 2014 9:02 pm

    Теперь поговорим о базовых операторах языка питон.
    Рассмотрим, как можно поставить условие, и как это правильно записать.


    [img]Туториал по Python_BOT Wstsf9[/img]



    1.      Х=10
    2.      Цикл для n лежащей в диапазоне от 0 до 100
    3.      Если n<х:
    4.      Печатать «Х меньше n»
    5.      Или если n равно х
    6.      Печатать «Х равен n»
    7.      Или если n больше х
    8.      Печатать «Х больше n»
    9.      Если n равно 20
    10.  Печатать 'N достигло максимально заданного значения',n
    11.  Остановить программу
     
    Особенно нужно обратить внимание на визуальное строение кода скрипта!
    Я вот о чем: явного объявления конца цикла или конца выполнения условия, как видите нет. То есть нет типа
    IF

    ENF IF
     
    Или
     
    IF
     {
     …
     }
    Так же и с циклом. Но как он определяет, какой фрагмент кода в каком цикле лежит ?

    Тут дело вот в чем, он считает количество пробелов с новой строки до первого вступления части кода в цикл или условие, т.е.


    [img]Туториал по Python_BOT 24phvk5[/img]



    Я пробелы заменил на звездочки, чтобы было нагляднее, и раскрасил уровни взаимодействия разными цветами. Опять же для наглядности поставил пробелы между разными условиями
     
    Цикл от 0 до 100 действует тут для всех строк (нулевой уровень)
    Зеленые звездочки – 1 уровень, синие звездочки – 2 уровень.
    main_spirit
    main_spirit


    Сообщения : 12
    Дата регистрации : 2014-06-04

    Туториал по Python_BOT Empty Re: Туториал по Python_BOT

    Сообщение автор main_spirit Вт Июн 10, 2014 9:26 pm

    Используемые симбиозные процедуры (МЕТОДЫ)
     
    Для некоторой помощи в написании скриптов, мы используем так называемые "симбиозные процедуры", которые по сути являются методами, написанными на C#. Их вашего скрипта на питоне их можно вызывать и использовать. Например, рассмотрим создание объекта в мире сначала обычным способом, затем при помощи использования готового метода.
     
    Обычный способ:
     
    import pythonbot
     
    MAIN_FORM=pythonbot.THIS_FORM.CurrentForm            #Создание доступного объекта текущей формы
     
    MAIN_FORM.RUN_BOT("aaa", "11111", "22222", "Terra", 0, 0, 0, 0, 70)
     
    X=pythonbot.AWDLL.AW_OBJECT_X                 
    Y=pythonbot.AWDLL.AW_OBJECT_Y
    Z=pythonbot.AWDLL.AW_OBJECT_Z
    model=pythonbot.AWDLL.AW_OBJECT_MODEL
    OWNER_OBJ=pythonbot.AWDLL.AW_OBJECT_OWNER
    AW_BUILD_OBJ=pythonbot.AWDLL.AW_OBJECT_BUILD_TIMESTAMP
     
    pythonbot.AWDLL.aw_int_set(X,0)
    pythonbot.AWDLL.aw_int_set(Y,0)
    pythonbot.AWDLL.aw_int_set(Z,0)
    pythonbot.AWDLL.aw_string_set(model,"10x10zastil.rwx")
    pythonbot.AWDLL.aw_int_set(OWNER_OBJ,22945)
    pythonbot.AWDLL.aw_int_set(AW_BUILD_OBJ,0)
     
    rc=pythonbot.AWDLL.aw_object_load()
    print (rc)
     
    MAIN_FORM.SCRYPT_PLAY=False
    MAIN_FORM.STOP_BOT()                                                    #Остановка и уничтожение бота
    MAIN_FORM.SetTextSafe('БОТ ВЫШЕЛ ИЗ МИРА')       #Сообщение о выходе
     
    Разберем код:
    X=pythonbot.AWDLL.AW_OBJECT_X                        Переменной X присваиваем значение константы, которая храниться в классе AWDLL, и для сервера обозначает занесение данных о координате объекта по оси Х. Мы читаем значение константы оттуда, потому что так удобнее, а можно было просто написать в именно этом случае X=232, ибо эта константа AW_OBJECT_X и равна 232 (см. выше список констант).
    Т.е. все это -
    X=pythonbot.AWDLL.AW_OBJECT_X                 
    Y=pythonbot.AWDLL.AW_OBJECT_Y
    Z=pythonbot.AWDLL.AW_OBJECT_Z
    model=pythonbot.AWDLL.AW_OBJECT_MODEL
    OWNER_OBJ=pythonbot.AWDLL.AW_OBJECT_OWNER
    AW_BUILD_OBJ=pythonbot.AWDLL.AW_OBJECT_BUILD_TIMESTAMP
    Это всего лишь константы.
    Иными словами можно и так:
    X=232
    Y=233
     Z=234
     model=238
    OWNER_OBJ=244
    AW_BUILD_OBJ=246
    Это тоже верно, и будет работать J Идем далее..
     
    Заполняем некоторые поля, необходимые для создания объекта, уже в структуре, которая будет понятна серверу AW, устанавливаем координаты X,Y,X,тип модели, принадлежность объекта гражданину, в данном случае меня, и время существования объекта по-моему в секундах, в данном случае 0 – это означает – постоянный объект.
    pythonbot.AWDLL.aw_int_set(X,0)
    pythonbot.AWDLL.aw_int_set(Y,0)
    pythonbot.AWDLL.aw_int_set(Z,0)
    pythonbot.AWDLL.aw_string_set(model,"10x10zastil.rwx")
    pythonbot.AWDLL.aw_int_set(OWNER_OBJ,22945)
    pythonbot.AWDLL.aw_int_set(AW_BUILD_OBJ,0)
     
    rc=pythonbot.AWDLL.aw_object_load() – Посылка команды серверу (Создать объект с вышеперечисленными параметрами), почему в таком виде ? А потому что она возвращает результат создания объекта в переменную rc. Если 0 – тогда все о-кей. Если что-то другое – это ошибка, собственно, что-то другое (не ноль), это и будет код ошибки.
    print (rc) – ну тут все понятно. Показать на консоли результат загрузки объекта. Если будет 0 – то все нормально.
     
    Теперь то-же, но с использованием готового метода:
     
    import pythonbot             
     
    MAIN_FORM=pythonbot.THIS_FORM.CurrentForm     
    MAIN_FORM.RUN_BOT("aaa", "11111", "22222", "Terra", 0, 0, 0, 0, 70)
    MAIN_FORM.MY_BOT.Create_OBJ(0, 1000, 0, 900, 0, 0, "10x10zastil.rwx ", " ", comand_a+level.ToString()+'_1'+comand_c, 22945, 0)
    MAIN_FORM.SCRYPT_PLAY=False
    MAIN_FORM.MY_BOT.Delete_OBJ_All()              
    MAIN_FORM.STOP_BOT() 
    main_spirit
    main_spirit


    Сообщения : 12
    Дата регистрации : 2014-06-04

    Туториал по Python_BOT Empty Re: Туториал по Python_BOT

    Сообщение автор main_spirit Вс Июн 15, 2014 4:02 pm

    БОТ СЛОВОЕД:
    --------------------------------------------------------------------------------------------------------------------------

    import pythonbot                                                        #Импорт пространства имен всей программы в целом
    MAIN_FORM=pythonbot.THIS_FORM.CurrentForm                               #Создание доступного объекта текущей формы

    comand_a='create picture http://aw-inter.net/slovoed/'
    comand_c='.jpg mip=on, scale 1 1 1'
    slovoed_data=''
    level=0
    word=''
    len_symb=0

    slovoed_data = (['кот','шар','мяч','фрукт','вода','еда','улыбка','конфета','одежда','футбол'])

    MAIN_FORM.RUN_BOT("имя бота", "пароль привилегий", "номер гражданства", "название мира", 0, 0, 0, 0, 70)

    MAIN_FORM.MY_BOT.Create_OBJ(0, 1000, 0, 900, 0, 0, "floor02_5x5s.rwx", " ", comand_a+level.ToString()+'_1'+comand_c, 22945, 0)
    MAIN_FORM.MY_BOT.Create_OBJ(500, 1000, 0, 900, 0, 0, "floor02_5x5s.rwx", " ", comand_a+level.ToString()+'_2'+comand_c, 22945, 0)
    MAIN_FORM.MY_BOT.Create_OBJ(0, 500, 0, 900, 0, 0, "floor02_5x5s.rwx", " ", comand_a+level.ToString()+'_3'+comand_c, 22945, 0)
    MAIN_FORM.MY_BOT.Create_OBJ(500, 500, 0, 900, 0, 0, "floor02_5x5s.rwx", " ", comand_a+level.ToString()+'_4'+comand_c, 22945, 0)

    len_symb=len(slovoed_data[level])
    for n in range(0, len_symb):
        word=word+'*'
       
    MAIN_FORM.MY_BOT.Create_OBJ(0, 200, 0, 0, 0, 0, "sm_sgn2.rwx", 'Кол-во букв: '+len_symb.ToString()+'  '+ word, 'create sign face="arial" q=128 bcolor=38488b', 22945, 0) # Вот панель с количеством букв

    #MAIN_FORM.SetTextSafe(time.strftime("%H:%M:%S"))
    while MAIN_FORM.SCRYPT_PLAY==True:               #Если статус воспроизведения = ИСТИНА
            pythonbot.AWDLL.aw_wait(5)
           
            if MAIN_FORM.MY_BOT.avatar_add_status == True:
                   MAIN_FORM.MY_BOT.avatar_add_status = False
                   MAIN_FORM.SetTextSafe(MAIN_FORM.MY_BOT.chat.ToString())

            if MAIN_FORM.MY_BOT.avatar_delete_status == True:
                   MAIN_FORM.MY_BOT.avatar_delete_status = False
                   MAIN_FORM.SetTextSafe(MAIN_FORM.MY_BOT.chat.ToString())
                  
            if MAIN_FORM.MY_BOT.chat_flag == True:
                   MAIN_FORM.MY_BOT.chat_flag = False
                   otvet=MAIN_FORM.MY_BOT.chat_msg
                   if otvet == slovoed_data[level]:
                          MAIN_FORM.SetTextSafe("ВЕРНО")
                          level=level+1
                          MAIN_FORM.SetTextSafe(level.ToString())
                          MAIN_FORM.MY_BOT.Change_OBJ(0,0,MAIN_FORM.MY_BOT.OBJ_NUMBER[0],0, 1000, 0, 900, 0, 0, "floor02_5x5s.rwx", " ", comand_a+level.ToString()+'_1'+comand_c, 22945, 0)

                          MAIN_FORM.MY_BOT.Change_OBJ(500,0,MAIN_FORM.MY_BOT.OBJ_NUMBER[1],500, 1000, 0, 900, 0, 0, "floor02_5x5s.rwx", " ", comand_a+level.ToString()+'_2'+comand_c, 22945, 0)

                          MAIN_FORM.MY_BOT.Change_OBJ(0,0,MAIN_FORM.MY_BOT.OBJ_NUMBER[2],0, 500, 0, 900, 0, 0, "floor02_5x5s.rwx", " ", comand_a+level.ToString()+'_3'+comand_c, 22945, 0)

                          MAIN_FORM.MY_BOT.Change_OBJ(500,0,MAIN_FORM.MY_BOT.OBJ_NUMBER[3],500, 500, 0, 900, 0, 0, "floor02_5x5s.rwx", " ", comand_a+level.ToString()+'_4'+comand_c, 22945, 0)

                          word=''
                          len_symb=len(slovoed_data[level])
                          for n in range(0, len_symb):
                              word=word+'*'
                          MAIN_FORM.MY_BOT.Change_OBJ(0,0,MAIN_FORM.MY_BOT.OBJ_NUMBER[4],0, 200, 0, 0, 0, 0, "sm_sgn2.rwx", 'Кол-во букв: '+len_symb.ToString()+'  '+ word, 'create sign face="arial" q=128 bcolor=38488b', 22945, 0)

                   else:
                          MAIN_FORM.SetTextSafe("НЕ ВЕРНО")
                          MAIN_FORM.SetTextSafe(slovoed_data[level].ToString())

    MAIN_FORM.SetTextSafe('БОТ ВЫШЕЛ ИЗ МИРА')       #Сообщение о выходе
    MAIN_FORM.MY_BOT.Delete_OBJ_All()                #Удаление всех созданных объектов
    MAIN_FORM.STOP_BOT()                             #Остановка и уничтожение бота

    -------------------------------------------------------------------------------------------------------------------------
    Выкладываю код скрипта для демонстрации и понимания механизма работы с объектами с помощью Python_Bot.
    Это совсем конечно не тот бот, который сейчас работает в AWNETе, а можно сказать это шаблон, который быстро,
    не прикладывая каких-то усилий можно переделать под свои цели. Скрипт рабочий, т.е. можно просто скопировать, вставить в бота и запустить. Конечно еще необходимо указать свои параметры входа в мир.

      Текущее время Вт Май 07, 2024 2:34 am