Перебор значений в массиве

Описание: Основы скриптинга
Модератор: SJplayer

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 24 апреля 2013, 11:32

Перебор значений в массиве
Автор Cloud

Что если нужно узнать, если определенное число в массиве или нет. Но функции поиска по массиву в Pawn нет. Что делать? Поможет только перебор значений. Для этого нам нужен сам массив и цикл for. Сейчас я на простом примере покажу, как сделать перебор значений в массиве. И при появлении совпадения, должен выполниться скрипт. Допустим у нас есть большой одномерный массив совсеми ID машин, т.е только легкового транспорта. Но сначала нам нужна новая автовызываемая функция, допустим, она будет
называться IsPlayerInAuto. В скобках пишем два параметра – playerid и vehicleid. Функция будет выглядеть следующим образом:

Код: Выделить всё

public IsPlayerInAuto(playerid,vehicleid)
{
return 0;
}


Внутрь этой функции добавляем одномерный массив.

Код: Выделить всё

public IsPlayerInAuto(playerid,vehicleid)
{
new IsCarA[141] = {
445,602,416,485,568,429,433,499,424,536,496,504,422,609,498,401,575,518,402,
541,482,431,438,457,527,483,524,415,542,589,437,532,480,596,599,597,598,578,
486,507,562,585,427,419,587,490,528,533,544,407,565,455,530,526,466,604,492,
474,588,434,502,503,494,579,545,411,546,559,508,571,400,517,410,551,500,418,
572,423,414,516,582,467,443,470,404,603,600,413,426,436,547,489,441,594,564,
479,534,432,505,442,440,475,543,605,495,567,428,405,535,458,580,439,561,409,
560,550,506,601,574,566,549,420,459,576,525,531,408,583,451,558,552,540,491,
412,478,421,529,555,456,554,477};
return 0;
}


У нас есть параметр vehicleid надо присвоить ему id машины в которой сидит игрок. Под массивом добавляем такую строку:

Код: Выделить всё

vehicleid = GetPlayerVehicleID(playerid);


После этой строки пишем проверку на нахождение игрока в любом транспорте. Функция проверки называется IsPlayerInVehicle – проверяет игрока, находится ли он в любом транспорте. Внутри этой условной конструкции пишем цикл for.

Код: Выделить всё

if(IsPlayerInVehicle(playerid,vehicleid))
{
for(
new i = 0; i < 141; i++)
{
if(
GetVehicleModel(vehicleid) == IsCarA[i])
{
return true;
}
}
}


141 – это количество ячеек в массиве. Ставим такое условие если ID машины в которой сидит игрок, равен значению в ячейке массива. Цикл перебирает каждую ячейку и как только находится совпадение условие выполняется. Принцип работы этого цикла следующий:
1. Допустим, игрок сидит в машине Infernus. GetVehicleModel – становится равным 411. Цикл проверяет ячейку ссылка, на которую IsCarA[0], потому что i по умолчанию равно 0. А IsCarA[0] = 445.
2. 445 не равно 411, условие не выполняется и цикл повторяется.
3. Цикл проверяет следующую ячейку ссылка на которую IsCarA[1], а она = 602.
4. 602 не равно 411, условие не выполняется и цикл повторяется.
5. Так продолжается по кругу пока i не станет равным 65, а IsCarA[65] = 411.
6. Условие выполняется, так как 411 = 411.
Код функции проверки будет выглядеть в целом так:

Код: Выделить всё

public IsPlayerInAuto(playerid,vehicleid)
{
new IsCarA[141] = {
445,602,416,485,568,429,433,499,424,536,496,504,422,609,498,401,575,518,402,
541,482,431,438,457,527,483,524,415,542,589,437,532,480,596,599,597,598,578,
486,507,562,585,427,419,587,490,528,533,544,407,565,455,530,526,466,604,492,
474,588,434,502,503,494,579,545,411,546,559,508,571,400,517,410,551,500,418,
572,423,414,516,582,467,443,470,404,603,600,413,426,436,547,489,441,594,564,
479,534,432,505,442,440,475,543,605,495,567,428,405,535,458,580,439,561,409,
560,550,506,601,574,566,549,420,459,576,525,531,408,583,451,558,552,540,491,
412,478,421,529,555,456,554,477};
return 0;
}
vehicleid = GetPlayerVehicleID(playerid);
if(
IsPlayerInVehicle(playerid,vehicleid))
{
for(
new i = 0; i < 141; i++)
{
if(
GetVehicleModel(vehicleid) == IsCarA[i])
{
return true;
}
}
}
return 0;
}


Но он не будет работать если его не вызвать в нужный момент. Также не забудьте, указать для него forward в начале скрипта, т.е объявить данную функцию как новую.

Код: Выделить всё

forward IsPlayerInAuto(playerid,vehicleid);


Проверку можно вызвать, например, с помощью команды. Для начала создаем переменную getthecar, которая будет хранить ID машины, в которую сел игрок. Затем пишем такое условие:

Код: Выделить всё

new getthecar;
if(
IsPlayerInAuto(playerid,getthecar)){
}


Т.е. игрок садится в машину. Переменная Getthecar – принимает значение ID машины, в которую сел игрок и это значение отправляет в функцию IsPlayerInAuto. А функция начинает перебор значений до тех пор пока не найдет совпадения. Перебор происходит моментально. После перебора значений, результат возвращается и если есть совпадение, то условие выполняется.
[center]i love you [s]mxIni[/s] Mysql[/center]


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Основы скриптинга»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя