Просмотр полной версии : [Вопрос] Оптимизирован и правильный код? Если можно то какие вариант ещё есть ?
phpadmin
16.06.2017, 17:45
if(response)
{
switch(dialogid)
{
case 969:
{
if(!strlen(inputtext))
{
spd(playerid,969,dsi,"Введите сумму","Пополнение счета IT сообщества (пустая строка)","Скрыть","Выход");
}
#define dengi strval(inputtext)
if(dengi < 1 || dengi > 1000000)
{
scm(playerid,-1,"Нельзя пополнить счет меньше 1 и больше 1000000 вирт");
spd(playerid,969,dsi,"Введите сумму","Пополнение счета IT сообщества","Скрыть","Выход");
return true;
}
if(s_player[playerid][pDollar] < dengi) return scm(playerid,-1,"У вас нет столько денег");
s_player[playerid][pDollar] -= dengi;
s_internet[idollar] += dengi;
SavePlayer();
return true;
#undef dengi
}
}
}
#define dengi strval(inputtext)
Что это? Зачем?
Переменная создаётся не только для того, чтоб код был более опрятный, но и для того, чтоб по 100 раз не вызывать одну и ту же функцию. С макросом же функция всё равно будет вызываться каждый раз.
И что это за коверканье стандартных функций? Что за "spd", "scm"? Самому же потом будет неудобно работать с таким кодом, если вдруг решишь сделать поиск по названию функции (будут совпадения с названиями других переменных/функций), не говоря уже о том, что ты этим убиваешь совместимость с чужим кодом. Куда вы так спешите, что вам лень написать полное название функции? Не нужно быдлокодить
ID диалогов в виде чисел - тоже такая себе идея. Заведи enum под диалоги и прописывай их там в виде членов перечисления. Так и обезопасишь себя от повтора ID, и найти нужный диалог будет проще.
И вот это что ещё такое?
if(response)
{
switch(dialogid)
{
Ты разделяешь код кнопок диалога по разным switch? Самому потом удобно будет выискивать код одного диалога по двум разным участкам OnDialogResponse?
Вот эту проверку лучше перенести в начало диалога
if(s_player[playerid][pDollar] < dengi) return scm(playerid,-1,"У вас нет столько денег");
Ибо какой смысл проводить все те махинации с "dengi", если всё упирается в количество денег у игрока?
Оптимизировать с помощью макросов - самый эффективный способ (сарказм)
Впрочем, я посоветовал бы вам создать новую переменную, в которую необходимо занести возвращаемое значение функции strval, а не "оптимизировать" это дело макросом. Можно ещё передавать строки с помощью оператора "!" перед кавычками, однако из-за непонятных мне функций, это будет очень сомнительно; поскольку это могут быть функции-обработчики, которые выполняют дополнительный код при каждом вызове, либо же это могут макро-функции, которые просто сокращают названия функций. Поэтому в следующий раз, если вы используете макро-функции, то лучше уточнить их функцию.
phpadmin
16.06.2017, 18:08
Можете описать правильный код? по вашему мнению. А то я не понимаю. Мне дефайн ундев чем заменить new?
Можете описать правильный код? по вашему мнению. А то я не понимаю. Мне дефайн ундев чем заменить new?
Тебе же его уже описали. Даже два человека. Нужно лишь чуть-чуть подумать и осмыслить написанное
Можете описать правильный код? по вашему мнению. А то я не понимаю. Мне дефайн ундев чем заменить new?
Абсолютно верно. Директива define и undef - части препроцессора, определяющие новый макрос (undef - удаляет макрос), значение которого будет подставлена при компиляции. В вашем случае это множество обращений к функции strval. Если же использовать оператор new, то вам не нужно будет множество раз вызывать одну и ту же функцию, для одного и того же результата, поскольку возвращаемое значение уже будет хранится в этой переменной.
new money = strval(inputtext);
phpadmin
16.06.2017, 18:27
Теперь я это написав ко всем new, мне потом всего лишь надо использовать "money" когда угодно? и всё? именно в в инпуттекстах?
- - - Updated - - -
Сори за мои знания павно мизерное. Просто стало интересно что-то мутить.
- - - Updated - - -
Или ты имеешь виду использовать по такому типу?
case 0..73:
if(s_player[playerid][pBox]>0)
{
new String[250];
s_player[playerid][pBox] -=1;
format(String, sizeof(String), "%s {FFFFFF}Вы открыли элитную коробку (осталось: %d .шт)\n\n",String,s_player[playerid][pBox]);
new rand = Vaper[random(sizeof Vaper)];
new patr = Vaper1[random(sizeof Vaper1)];
GivePlayerWeapon(playerid,rand,patr);
format(String, sizeof(String), "%s {FFFFFF}Оружие: {CC8DEC}%s\n",String,gname(rand));
new skin = Spinner[random(sizeof Spinner)];
SetPlayerSkin(playerid,skin);
format(String,sizeof(String), "%s {FFFFFF}Временная одежда: (id одежды: {708DEB}%d{FFFFFF})\n",String,skin);
new dollar = Gibby[random(sizeof Gibby)];
s_player[playerid][pDollar]+=dollar;
format(String,sizeof(String), "%s {FFFFFF}Бонусные доллары: {79D26D}%d$\n",String,dollar);
spd(playerid,9903,dsm,"{FFFFFF}Elite BOX",String,"Закрыть","");
}
- - - Updated - - -
Если что код не кривой тут так стал
- - - Updated - - -
Вот так?
case 969:
{
new dengi = strval(inputtext);
if(s_player[playerid][pDollar] < dengi) return scm(playerid,-1,"У вас нет столько денег");
if(!strlen(inputtext))
{
spd(playerid,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");
}
if(dengi < 1 || dengi > 1000000)
{
scm(playerid,-1,"Сумма неверная, повторите попытку!");
spd(playerid,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");
return true;
}
if(s_player[playerid][pDollar] < dengi) return scm(playerid,-1,"У вас нет столько денег");
s_player[playerid][pDollar] += dengi;
s_internet[idollar] -= dengi;
SavePlayer();
return true;
Да. Я очень настоятельно рекомендую вам прочитать как можно больше документации по данному ЯП. Более того, вы можете прочитать статьи на этом форуме.
scm
Почему бы не продолжить оптимизацию?
Можно оптимизировать названия некоторых функций, операторов и переменных:
strval -> sv
strlen -> sl
s_player -> s_p
s_internet -> s_i
SavePlayer -> SP
playerid -> p
pDollar -> pD
idollar -> id
inputtext -> i
return -> r
Код получается более короткий, а, значит, более понятный и оптимизированный:
case 969:
{
#define r return
#define p playerid
#define pD pDollar
#define id idollar
#define t true
new d = sv(i);
if(s_p[p][pD] < d) r scm(p,-1,"У вас нет столько денег");
if(!sl(i))
{
spd(p,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");
}
if(d < 1 || d > 1000000)
{
scm(p,-1,"Сумма неверная, повторите попытку!");
spd(p,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");
r t;
}
if(s_p[p][pD] < d) r scm(p,-1,"У вас нет столько денег");
s_p[p][pD] += d;
s_i[id] -= d;
SP();
r t;
Но ещё можно оптимизировать, убрав ненужные пробелы и отступы:
case 969: {
#define r return
#define p playerid
#define pD pDollar
#define id idollar
#define t true
new d=sv(i);if(s_p[p][pD]<d)r scm(p,-1,"У вас нет столько денег");
if(!sl(i)){spd(p,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");}
if(d<1||d>1000000){scm(p,-1,"Сумма неверная, повторите попытку!");spd(p,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");r t;}
if(s_p[p][pD]<d)r scm(p,-1,"У вас нет столько денег");s_p[p][pD]+=d;s_i[id]-=d;SP();r t;
P.S. Если кто не понял - это "шутка"...
phpadmin
16.06.2017, 20:16
Сарказм принят)
Лучше скажи функцию что бы в виртуальном мире нельзя было использовать кнопки.
Типа
if (newkeys == KEY_WALK)
{
if(IsPlayerInRangeOfPoint(playerid,0.9,1542.6599,-1362.4591,329.4587))
{
if(s_player[playerid][pLic] == 1)
{
new string[500];
strins(string,"{FFFFFF}Голодные коробки\t{FFFFFF}Наименование\t{FFFFFF}Количество призов\t{FFFFFF}Цена\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFFFFF}Разное\t{FFFFFF}1 приз\t{79D26D}250$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFFFFF}Стандарт\t{FFFFFF}1 приз\t{79D26D}600$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{73E8FF}Ice(ледяной)\t{FFFFFF}2 приза\t{79D26D}1100$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFBB5C}Elite(элитное)\t{FFFFFF}3 приза\t{D8945F}30€\n",strlen(string));
strins(string,"{BCBCBC}«Hungry Music»\t{FFFFFF}Своя музыка\t{FFFFFF}Нет приза\t{D8945F}5€\n",strlen(string));
strins(string,"{BCBCBC}«Hungry Code»\t{FFFFFF}Code\t{FFFFFF}Нет приза\t{79D26D}Free\n",strlen(string));
spd(playerid,777,dls,"{1CD91F}H{FFFFFF}ungry {1CD91F}G{FFFFFF}ames BOX",string,"Открыть","Закрыть");
}
else
{
spd(playerid,776,dsm,"{1CD91F}H{FFFFFF}ungry {1CD91F}G{FFFFFF}ames BOX","\t\n\n{FFFFFF}Автомат с коробками Вам недоступен.\t\n\
Причина: вы не приняли условия лицензионного соглашения\n\n","Закрыть","");
}
}
Какая функция нужна или как сделать что бы этот раздел работал например в виртуальном мире определенном?
dch1hff1
16.06.2017, 20:35
Сарказм принят)
Лучше скажи функцию что бы в виртуальном мире нельзя было использовать кнопки.
Типа
if (newkeys == KEY_WALK)
{
if(IsPlayerInRangeOfPoint(playerid,0.9,1542.6599,-1362.4591,329.4587))
{
if(s_player[playerid][pLic] == 1)
{
new string[500];
strins(string,"{FFFFFF}Голодные коробки\t{FFFFFF}Наименование\t{FFFFFF}Количество призов\t{FFFFFF}Цена\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFFFFF}Разное\t{FFFFFF}1 приз\t{79D26D}250$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFFFFF}Стандарт\t{FFFFFF}1 приз\t{79D26D}600$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{73E8FF}Ice(ледяной)\t{FFFFFF}2 приза\t{79D26D}1100$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFBB5C}Elite(элитное)\t{FFFFFF}3 приза\t{D8945F}30€\n",strlen(string));
strins(string,"{BCBCBC}«Hungry Music»\t{FFFFFF}Своя музыка\t{FFFFFF}Нет приза\t{D8945F}5€\n",strlen(string));
strins(string,"{BCBCBC}«Hungry Code»\t{FFFFFF}Code\t{FFFFFF}Нет приза\t{79D26D}Free\n",strlen(string));
spd(playerid,777,dls,"{1CD91F}H{FFFFFF}ungry {1CD91F}G{FFFFFF}ames BOX",string,"Открыть","Закрыть");
}
else
{
spd(playerid,776,dsm,"{1CD91F}H{FFFFFF}ungry {1CD91F}G{FFFFFF}ames BOX","\t\n\n{FFFFFF}Автомат с коробками Вам недоступен.\t\n\
Причина: вы не приняли условия лицензионного соглашения\n\n","Закрыть","");
}
}
Какая функция нужна или как сделать что бы этот раздел работал например в виртуальном мире определенном?
GetPlayerVirtualWorld. (http://wiki.sa-mp.com/wiki/GetPlayerVirtualWorld)
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot