Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 7 из 7
  1. #1
    Аватар для Betta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2017
    Сообщений
    20
    Репутация:
    0 ±

    Наилучшие варианты?

    Приветствую. Задался вопросом, как и почему реализовывать данные функции:


    К примеру я хочу показать навыки какого-либо скилла игроку, приведу два примера реализации:

    PHP код:
    static const SkillPositionPoint[5][] =
    {
        {
    ""},
        {
    "|"},
        {
    "||"},
        {
    "|||"},
        {
    "||||"}
    }; 
    Или:

    PHP код:
    stock GetSkillPoint(playeridpoint)
    {
        new 
    string[5];
        switch(
    point)
        { 
             case 
    0string "";
             case 
    1string "|";
             case 
    2string "||";
             case 
    3string "|||";
             case 
    4string "||||";
        }
        return 
    string;



    И второе. У меня есть координаты территорий, я могу их записать в тот-же static const или в enum:

    PHP код:
    enum coord_p
    {
        
    Float:area_x,
        
    Float:area_y,
        
    Float:area_z,
        
    Float:area_a
    }
    new 
    area_coord[5][coord_p];

    static const 
    area_coord[5][4] =
    {
        {
    x,y,z,a},
        {
    x,y,z,a},
        {
    x,y,z,a},
        {
    x,y,z,a},
        {
    x,y,z,a}
    }; 
    Потом уже обращаться к этим ячейкам для определения позиции игрока (к примеру).

    И вопрос, который требует ответа: какие варианты лучше и по каким причинам?

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1) Первый, так как в первом случае ты вносишь информацию в сегмент данных и напрямую с ним работаешь, а во втором случае ты сначала вносишь информацию в сегмент данных, после создаёшь в стэке массив, извлекаешь из сегмента данных записанную ранее информацию и только потом обращаешься к информации в массиве.

    2) Первый, так как читаемость такого кода:
    PHP код:
    area_coord[area_x], area_coord[area_y], area_coord[area_z], area_coord[area_a
    гораздо выше, нежели у
    PHP код:
    area_coord[0], area_coord[1], area_coord[2], area_coord[3
    ибо без лишних затруднений понятно какая ячейка какую информацию хранит
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для Betta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2017
    Сообщений
    20
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    2) Первый, так как читаемость такого кода:
    PHP код:
    area_coord[area_x], area_coord[area_y], area_coord[area_z], area_coord[area_a
    гораздо выше, нежели у
    PHP код:
    area_coord[0], area_coord[1], area_coord[2], area_coord[3
    ибо без лишних затруднений понятно какая ячейка какую информацию хранит
    А если у меня нет проблем с читаемостью кода? Ведь в первом примере мне нужно загружать данные о территориях в эти переменные, а во втором варианте они сразу прописаны и к ним нужно лишь обратиться. Читаемость кода меня не смущает, тем более в таком варианте. Меня больше интересует скорость выполнения и легкость обращения для машины.

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Betta Посмотреть сообщение
    Ведь в первом примере мне нужно загружать данные о территориях в эти переменные
    Эмм, с чего ты так решил? Принцип работы с массивом в первом варианте совершенно такой же
    PHP код:
    enum coord_p 

        
    Float:area_x
        
    Float:area_y
        
    Float:area_z
        
    Float:area_a 

    new 
    area_coord[5][coord_p] = 

        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33
    }; 
    enum не делает ничего сверхъестественное и не меняет логику работы массива. В нём просто создаются именные константы, которые являются теми же самыми ячейками, что и во втором случае. Код из первого случая равносилен этому:
    PHP код:
    const 
        
    area_x 0,
        
    area_y 1,
        
    area_z 2,
        
    area_a 3,
        
    area_coord_sizeof 4;// Константы можно назвать как угодно. Главное - их значение, которое равносильно номерам ячеек


    new Float:area_coord[5][area_coord_sizeof] = 

        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33
    };

    printf("%f"area_coord[0][area_y]);//Обращение 
    И с макросом:
    PHP код:
    #define area_x                 0
    #define area_y                 1
    #define area_z                 2
    #define area_a                 3
    #define area_coord_sizeof     4

    new Float:area_coord[5][area_coord_sizeof] = 

        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33}, 
        {
    22.3322.3322.3322.33
    };

    printf("%f"area_coord[0][area_y]);//Обращение 
    То бишь, как я и говорил, на выходе это остаётся всё тот же двумерный массив и не более. А уже обёртка в виде enum, констант или макросов никак на его работоспособность не влияет. Она нужна лишь для тебя, дабы тебе было проще с этим кодом работать через неделю/месяц/год (не приходилось выискивать сам массив, дабы понять что же в ячейках хранится).

    Ну и enum упрощает работу в случае, если ты решишь в один массив записать данные разных типов. Но перечисление (enum) является лишь синтаксической обёрткой, которая придумана с целью упростить жизнь. На деле у тебя всегда остаётся лишь массив
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. #5
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    1) Лучше использовать одну строку, а вне всего лишь устанавливать нуль-символ там, где это необходимо.
    PHP код:
    const _MAX_POINTS 6;
    stock strcpy(dest[], const source[], maxlength sizeof dest)
    {
        
    dest[0] = EOS;
        return 
    strcat(destsourcemaxlength);
    }

    stock GetSkillPoint(dest[], point

        static const 
    _format[] = "||||||";
        
    strcpy(dest_formatpoint+1);
    }  
    main()
    {
        new 
    buffer[_MAX_POINTS];
        
    GetSkillPoint(buffer2);
        
    printf("%s"buffer);


  6. #6
    Аватар для Betta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2017
    Сообщений
    20
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, с чего ты так решил? Принцип работы с массивом в первом варианте совершенно такой же
    Имелось ввиду то, что в этом случае мне нужно будет присвоить этим ячейкам значение. Будь у меня 100 или даже 1000 территорий, мне их нужно будет сохранить в базу данных (к примеру) и потом загружать при инициализации мода записывая в них. А так спасибо, очень полезная информация. При много благодарен.

    - - - Добавлено - - -

    Цитата Сообщение от VVWVV Посмотреть сообщение
    1) Лучше использовать одну строку, а вне всего лишь устанавливать нуль-символ там, где это необходимо.
    PHP код:
    const _MAX_POINTS 6;
    stock strcpy(dest[], const source[], maxlength sizeof dest)
    {
        
    dest[0] = EOS;
        return 
    strcat(destsourcemaxlength);
    }

    stock GetSkillPoint(dest[], point

        static const 
    _format[] = "||||||";
        
    strcpy(dest_formatpoint+1);
    }  
    main()
    {
        new 
    buffer[_MAX_POINTS];
        
    GetSkillPoint(buffer2);
        
    printf("%s"buffer);

    Не знал о таком способе. Спасибо)

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Betta Посмотреть сообщение
    Имелось ввиду то, что в этом случае мне нужно будет присвоить этим ячейкам значение. Будь у меня 100 или даже 1000 территорий, мне их нужно будет сохранить в базу данных (к примеру) и потом загружать при инициализации мода записывая в них. А так спасибо, очень полезная информация. При много благодарен.
    Ну так и что? Массив остаётся массивом что в первом случае, что во втором. Просто в случае с enum ты указываешь не числовой номер ячейки, а именной. И если тебе нужно заранее хранить данные в массиве, тебе придётся в любом случае присваивать значение ячейкам.
    В общем, enum никак не влияет на сам скрипт. Он лишь изменяет принцип обращения к массиву в исходном коде. В .amx оба варианта будут работать по идентичной схеме.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •