PDA

Просмотр полной версии : [Вопрос] Оптимизация кода



Эдуард
12.02.2017, 19:24
Здравствуйте, подскажите пожалуйста, каким способом можно можно оптимизировать данный код:


new string[54 + MAX_PLAYER_NAME];
switch(Kills[killerid])
{
case 50: format(string,sizeof(string),"%s(%d) убил '50' человек и получает 50 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string), GivePlayerMoney(killerid,Kills[killerid]*1000);
case 100: format(string,sizeof(string),"%s(%d) убил '100' человек и получает 100 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string), GivePlayerMoney(killerid,Kills[killerid]*1000);
case 150: format(string,sizeof(string),"%s(%d) убил '150' человек и получает 150 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string), GivePlayerMoney(killerid,Kills[killerid]*1000);
case 200: format(string,sizeof(string),"%s(%d) убил '200' человек и получает 200 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 250: format(string,sizeof(string),"%s(%d) убил '250' человек и получает 250 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 300: format(string,sizeof(string),"%s(%d) убил '300' человек и получает 300 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 350: format(string,sizeof(string),"%s(%d) убил '350' человек и получает 350 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 400: format(string,sizeof(string),"%s(%d) убил '400' человек и получает 400 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 500: format(string,sizeof(string),"%s(%d) убил '500' человек и получает 500 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 600: format(string,sizeof(string),"%s(%d) убил '600' человек и получает 600 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 700: format(string,sizeof(string),"%s(%d) убил '700' человек и получает 700 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 800: format(string,sizeof(string),"%s(%d) убил '800' человек и получает 800 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 900: format(string,sizeof(string),"%s(%d) убил '900' человек и получает 900 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 1000: format(string,sizeof(string),"%s(%d) убил '1000' человек и получает 1 000 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 1500: format(string,sizeof(string),"%s(%d) убил '1500' человек и получает 1 500 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
case 2000: format(string,sizeof(string),"%s(%d) убил '2000' человек и получает 2 000 000$",PlayerInfo[killerid][pName], playerid), SendClientMessageToAll(orange,string),GivePlayerMoney(killerid,Kills[killerid]*1000);
}

Seviel
12.02.2017, 19:54
new string[54 + MAX_PLAYER_NAME];
format(string,sizeof(string),"%s(%d) убил '%d' человек и получает %d$",PlayerInfo[killerid][pName], playerid, Kills[killerid], Kills[killerid] * 1000);
SendClientMessageToAll(orange,string);
GivePlayerMoney(killerid,Kills[killerid]*1000);

Эдуард
12.02.2017, 20:05
new string[54 + MAX_PLAYER_NAME];
format(string,sizeof(string),"%s(%d) убил '%d' человек и получает %d$",PlayerInfo[killerid][pName], playerid, Kills[killerid], Kills[killerid] * 1000);
SendClientMessageToAll(orange,string);
GivePlayerMoney(killerid,Kills[killerid]*1000);


Тогда сработает при каждом убийстве, а мне нужно чтобы через определенный промежуток

Seviel
12.02.2017, 20:23
Каждые 50 убийств.


if(Kills[killerid] % 50 == 0)
{
new string[54 + MAX_PLAYER_NAME];
format(string,sizeof(string),"%s(%d) убил '%d' человек и получает %d$",PlayerInfo[killerid][pName], playerid, Kills[killerid], Kills[killerid] * 1000);
SendClientMessageToAll(orange,string);
GivePlayerMoney(killerid,Kills[killerid]*1000);
}

Daniel_Cortez
12.02.2017, 21:25
Не проверял, но, надеюсь, основную идею (список значений в одном case) поймёте:


switch(Kills[killerid])
{
case 50, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000:
{
static const fmt_str[] = "%s(%d) убил '%d' человек и получает %d$";
new string[sizeof(fmt_str) + (-2+MAX_PLAYER_NAME) + (-2+5) + (-2+4) + (-2+7)];
new kills = Kills[killerid];
new reward = kills * 1000;
format(string, sizeof(string), fmt_str, PlayerInfo[killerid][pName], killerid, kills, reward);
SendClientMessageToAll(orange, string);
GivePlayerMoney(killerid, reward);
}
}

Про подсчёт размера массива string см. здесь (http://pro-pawn.ru/showthread.php?13388).

$continue$
13.02.2017, 00:45
Ок. Я так скажем олдовый игрок: у меня 20000 убийств и ты предлагаешь всех их перечислять в ручную? Почем не через остаток от деления?


Не проверял, но, надеюсь, основную идею (список значений в одном case) поймёте:


switch(Kills[killerid])
{
case 50, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000:
{
static const fmt_str[] = "%s(%d) убил '%d' человек и получает %d$";
new string[sizeof(fmt_str) + (-2+MAX_PLAYER_NAME) + (-2+5) + (-2+4) + (-2+7)];
new kills = Kills[killerid];
new reward = kills * 1000;
format(string, sizeof(string), fmt_str, PlayerInfo[killerid][pName], killerid, kills, reward);
SendClientMessageToAll(orange, string);
GivePlayerMoney(killerid, reward);
}
}

Про подсчёт размера массива string см. здесь (http://pro-pawn.ru/showthread.php?13388).

VVWVV
13.02.2017, 01:07
Ок. Я так скажем олдовый игрок: у меня 20000 убийств и ты предлагаешь всех их перечислять в ручную? Почем не через остаток от деления?

Смысл в том, что при использовании данной операции будут считываться все числа, делящиеся на 50. Допустим, что в переменной Kills хранится значение 950 (либо любое другое число, которого нет в списке у ТС), которое также делится на 50 без остатка. Проверка сочтёт это число как правильное и вызовет все нужные функции и т.п. Однако в варианте ТС число 950 отсутствует, что говорит о нарушении логики.

$continue$
13.02.2017, 01:13
Ну это как бы логики вообще нет. Сначала идет +50, а потом +100. нормально живем =)
Та и это тоже исправляется через if

Смысл в том, что при использовании данной операции будут считываться все числа, делящиеся на 50. Допустим, что в переменной Kills хранится значение 950 (либо любое другое число, которого нет в списке у ТС), которое также делится на 50 без остатка. Проверка сочтёт это число как правильное и вызовет все нужные функции и т.п. Однако в варианте ТС число 950 отсутствует, что говорит о нарушении логики.

Seviel
13.02.2017, 01:18
Смысл в том, что при использовании данной операции будут считываться все числа, делящиеся на 50. Допустим, что в переменной Kills хранится значение 950 (либо любое другое число, которого нет в списке у ТС), которое также делится на 50 без остатка. Проверка сочтёт это число как правильное и вызовет все нужные функции и т.п. Однако в варианте ТС число 950 отсутствует, что говорит о нарушении логики.

А что мешает вам сделать так?



if((Kills[killerid] % 50 == 0 && Kills[killerid] <= 900) || Kills[killerid] % 100 == 0) // - Логика наверное понятна
{
new string[54 + MAX_PLAYER_NAME];
format(string,sizeof(string),"%s(%d) убил '%d' человек и получает %d$",PlayerInfo[killerid][pName], playerid, Kills[killerid], Kills[killerid] * 1000);
SendClientMessageToAll(orange,string);
GivePlayerMoney(killerid,Kills[killerid]*1000);
}


На все проблемы, есть свои костыли.
(с) Seviel
Когда писал это сообщение не видел что $continue$ отредактировал своё сообщение, прошу прощения

Эдуард
13.02.2017, 19:40
Спасибо ребята, реально помогли:)