В этом уроке мы рассмотрим функцию random().
Начнем.
1. Предисловие.
Для начала мы должны понять для чего предназначена данная функция. Random в переводе с английского — случайный. Следовательно, данная функция возвращает нам случайное значение.
2. Как работает?
Информация в данном пункте чисто для расширения Вашего кругозора.
Числа получаемые с помощью данной функции псевдо случайны, и вычисляются на основе формулы с некоторым начальным значением, которое может быть как функция времени.
Подробнее о алгоритме генератора случайным чисел Вы можете познакомиться здесь.
Также одним из алгоритмов генератора случайных чисел является линейный конгруэнтный метод
3. Как применять данную функцию?
Рассмотрим несколько примеров:
1) Создадим команду, которая выводит случайное число от 1 до 10 (включая 1 и 10).
if(strcmp("/random", cmdtext, true, 10) == 0)
{
new string[64]; // создаем строку, которая выведется на экран.
format(string, sizeof(string), "Случайное число: %d", random(10) + 1); /* заполняем строку. Немного объясню как все выполняется. Функция random() ведет отсчет от нуля. Т.е. random(10) вывело бы число от 0 до 9. Следовательно, мы прибавили единицу, чтобы строка заполнилась числом от 1 до 10. */
SendClientMessage(playerid, 0xFFFFFF, string); // выводим сообщение пользователю
return 1;
}
На основе этого примера можно сделать азартные игры (например бросание костей, блек-джек и многое другое).
2) Рассмотрим другой пример. Сделаем рэндомный телепорт (сейчас много тем про это):
if (strcmp("/randomtp", cmdtext, true, 10) == 0)
{
switch(random(4)) // генерируем число от 0 до 3 (включая)
{
case 0: SetPlayerPos(playerid, X1, Y1, Z1); // телепортируем игрока в координаты X1, Y1, Z1
case 1: SetPlayerPos(playerid, X2, Y2, Z2); // ...
case 2: SetPlayerPos(playerid, X3, Y3, Z3); // ...
case 3: SetPlayerPos(playerid, X4, Y4, Z4); /* аналогично. Внимание: это не действущие координаты, вы должны заменить их на свои */
}
return 1;
}
На основе этого примера можно сделать, например, телепорт в рэндомную камеру при аресте, рэндомный спавн или телепорт на рэндомную ДМ-зону.
И еще, если вы используете более 10 разных координат для телепортов лучше всего использовать массив. Например рэндомный спавн из grandlarc'a :
new Float: gRandomPos[][4] =
{
{1751.1097, -2106.4529, 13.5469, 183.1979}, // El-Corona - Outside random house
{2652.6418, -1989.9175, 13.9988, 182.7107}, // Random house in willowfield - near playa de seville and stadium
{2489.5225, -1957.9258, 13.5881, 2.3440}, // Hotel in willowfield - near cluckin bell
{2689.5203, -1695.9354, 10.0517, 39.5312}, // Outside stadium - lots of cars
{2770.5393, -1628.3069, 12.1775, 4.9637}, // South in east beach - north of stadium - carparks nearby
{2807.9282, -1176.8883, 25.3805, 173.6018}, // North in east beach - near apartments
{2552.5417, -958.0850, 82.6345, 280.2542}, // Random house north of Las Colinas
{2232.1309, -1159.5679, 25.8906, 103.2939}, // Jefferson motel
{2388.1003, -1279.8933, 25.1291, 94.3321}, // House south of pig pen
{2481.1885, -1536.7186, 24.1467, 273.4944}, // East LS - near clucking bell and car wash
{2495.0720, -1687.5278, 13.5150, 359.6696}, // Outside CJ's house - lots of cars nearby
{2306.8252, -1675.4340, 13.9221, 2.6271}, // House in ganton - lots of cars nearby
{2191.8403, -1455.8251, 25.5391, 267.9925}, // House in south jefferson - lots of cars nearby
{1830.1359, -1092.1849, 23.8656, 94.0113}, // Mulholland intersection carpark
{2015.3630, -1717.2535, 13.5547, 93.3655}, // Idlewood house
{1654.7091, -1656.8516, 22.5156, 177.9729}, // Right next to PD
{1219.0851, -1812.8058, 16.5938, 190.0045}, // Conference Center
{1508.6849, -1059.0846, 25.0625, 1.8058}, // Across the street of BANK - lots of cars in intersection carpark
{1421.0819, -885.3383, 50.6531, 3.6516}, // Outside house in vinewood
{1133.8237, -1272.1558, 13.5469, 192.4113}, // Near hospital
{1235.2196, -1608.6111, 13.5469, 181.2655}, // Backalley west of mainstreet
{590.4648, -1252.2269, 18.2116, 25.0473}, // Outside "BAnk of San Andreas"
{842.5260, -1007.7679, 28.4185, 213.9953}, // North of Graveyard
{911.9332, -1232.6490, 16.9766, 5.2999}, // LS Film Studio
{477.6021, -1496.6207, 20.4345, 266.9252}, // Rodeo Place
{255.4621, -1366.3256, 53.1094, 312.0852}, // Outside propery in richman
{281.5446, -1261.4562, 73.9319, 305.0017}, // Another richman property
{790.1918, -839.8533, 60.6328, 191.9514}, // Mulholland house
{1299.1859, -801.4249, 84.1406, 269.5274}, // Maddoggs
{1240.3170, -2036.6886, 59.9575, 276.4659}, // Verdant Bluffs
{2215.5181, -2627.8174, 13.5469, 273.7786}, // Ocean docks 1
{2509.4346, -2637.6543, 13.6453, 358.3565} // Ocean Docks spawn 2
};
public OnPlayerSpawn(playerid)
{
new rand_spawn = random(sizeof(gRandomPos));
SetPlayerPos(playerid, gRandomPos[rand_spawn][0], gRandomPos[rand_spawn][1], gRandomPos[rand_spawn][2]);
SetPlayerFacingAngle(playerid, gRandomPos[rand_spawn][3]);
return 1;
}
3) Сделаем совсем 'безобидную' функцию с помощью рэндома. Каждую секунду цвет машины в которой сидит игрок будет меняться.
Добавляем к глобальным переменным:
new changecolortimer;
Далее:
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
KillTimer(changecolortimer);
changecolortimer = SetTimerEx("changecolor",1000,1,"i",vehicleid);
return 1;
}
И добавляем фунцию смены цвета с нашим рэндомом:
forward changecolor(i);
public changecolor(i)
{
ChangeVehicleColor(i, random(120), random(120)); // меняет color1 и color2 на случайные цвета от 0 до 120
return 1;
}
Можно привести еще тысячи подобных примеров, но все равно невозможно показать все прелести рэндома, не попробовав самому составить пару функций, используя его.
4. Заключение.
Вот и подошел мой 'урок' к концу. Я думаю, Вы уже сделали вывод, что без данной функции многого было бы 'трудновато' осуществить.
Спасибо за внимание, автор урока - manok.
Вход
Регистрация
Помощь












