Автор: Doctor_Yoxansen
Как многим уже известно что в pawn сушествует три типа переменных
это целочисленные значения Integer например :
Код: Выделить всё
new int;// создали переменную целочисленного типа c именем int
int = 1;//присвоили переменной значение 1
О операторах присвоения поговорим далее в ходе урока. Второй тип это так называемый Float (т.е) дробный он же вещественный, записывается вот так :
Код: Выделить всё
new Float : flt;//создали переменную вещественного типа с именем flt
flt = 0.123;//присвоили вешественное значение
Третий тип это так называемые Булевые переменные которые принимают значения только true или false (1 или 0 ) записываются следующим образом :
Код: Выделить всё
new bool:byl;//создали переменную булевого типа
Переменная может принимать лишь два значения (true = 1 , false = 0) , как оказалось в оптимизации она не помогает. Ну вот теперь мы закончили на мой взгляд с самой скучной частью урока. Далее продолжим с массивами. Тут хотелось бы начать со строк, строки это одномерные массивы с текстовой или символьной информацией. Пример использования строк следующий:
Код: Выделить всё
New string[256]//конечно название может быть любое другое . 256 – размер , имеет смысл использовать строки с меньшим разером
format(string, sizeof(string), "Имя: %s ,ид: %d.",PlayerName(playerid),playerid);
SendAdminMessage(COLOR_RED, string, 1);//выводим , все что в нашей строке
Важно знать:
Для форматирования используются следующие заполнители:
%b – двоичная система счисления
%c – один символ
%d – целое число
%f – дробное число
%i – целое число
%s – строка
%x – шестнадцатеричная система счисления
%% – знак %
В основном в pawn вы будите сталкиваться с двух мерными массивами, они похожи на матрицы в высшей математике. И вот вам пример где 3 это число строк , а 2 это число столбцов, важно помнить что нумерация массива начинаеться с 0
Код: Выделить всё
new massiveng[3][2] = {
{15,19},
{1720,16},
{23,18}
};
Пример массива в вещественными значениями:
Код: Выделить всё
new Float:aRandomCarListSpawns[3][3] = {
{-1666.6607,1237.8749,6.8201},
{-1651.8741,1223.3059,6.8160},
{-1641.7529,1213.1877,6.8159}
};
Вот вам пример рандомного заполнения массива , через цикл:
Код: Выделить всё
#define MAX 100
new test[MAX];
for(new i = 0; i < MAX;i ++)//про циклы будет в следуюшей части урока
{
test[i] = random(200);
}
sizeof - возращает количество ячеек в массиве , тоесть его размерность , для дальнейшей работы с ним
Код: Выделить всё
n < sizeof(Massive) //используется в циклах
Так же стоит рассказать о различных арифметических операторах. Есть специальные операторы, для работы с целыми числами, рассмотрим основные:
Код: Выделить всё
new x=5,y=8;
x += y; // присвоим переменной x значение x + y
// эту строку можно было записать и так: x = x + y;
// существуют аналогичные операторы например: -=,+=,*= и др.
// результат программы будет 13
// существуют оператор: -- Оператор Декрмиента
// ++ оператор инкримента x++; равносильно x = x+1;
//Декриментом аналогично
Так же есть функции для более сложных операций.
floatsqroot – возрашает квадратный корень из числа
Код: Выделить всё
(пример использования : floatsqroot(25);//вернет квадратный корень из числа 25 т.е 5)
floatpower – возращает число возведенное в степень
Код: Выделить всё
(пример использования: floatpower(5,2)//25 , где 2 число которое возводим в степень , а 2 экспонента т.е в какую степень мы возводим )
floattan – Вычисляет тангенс данного вещественного числа
Код: Выделить всё
(пример использования : printf("The tangent from 30° is %f", floattan( 30.0, способ) );//сушествует два способа
1)Радианах (radian)
2)Градусах(degrees)
floatsin - Вычисляет синус данного вещественного числа
Код: Выделить всё
(пример использования : printf("The sine from 30° is %f", floatsin( 30.0, способ) );//сушествует два способа
1)Радианах (radian)
2)Градусах(degrees)
floatcos - Вычисляет косинус данного вещественного числа
Код: Выделить всё
пример использования : printf("The cosine from 30° is %f", floatcos( 30.0, способ) );//сушествует два способа
1)Радианах (radian)
2)Градусах(degrees)
float – (внимание не путать с типом переменных Float) Эта функция конвертирует целое число в вещественное.
Код: Выделить всё
(пример использования : new Float:fVar = float(122);//переконвертировали 122 в вешественный тип)
floatround - Округляет вещественное число указанным методом.
Код: Выделить всё
Пример использования :floatround(3.3,метод)
Методы
1)floatround_round - Округляет до ближайшего целого значения , если 0.5 то округляет в большую сторону
2)floatround_floor - В любом случае округлит в меньшую сторону
3)floatround_ceil - В любом случае округлит в большую сторону
4)floatround_tozero – Округляет в меньшую сторону при положительных значениях и в большую сторону при отрицательных значениях. Пожалуй на этом хватит. Теперь функции для работы со строками , на мой взгляд очень интересные:
format- Format позволяет Вам использовать переменные в строке; так же как и в printf(), но эта функция возвращает полученную строку для дальнейшего использования .
Код: Выделить всё
ew string[256]
format(string, sizeof(string), "Имя: %s ,ид: %d.",PlayerName(playerid),playerid);
SendAdminMessage(COLOR_RED, string, 1);
strcat- Эта функция конкатенирует две строки в назначенную по ссылке строку. Говоря простым языком она склеивает две строки.
dest[] - Назначенная строка для конкатенирования.
const source[] - Исходная строка.
maxlength=sizeof dest - Максимальная длина строки-назначения.
Возвращает Длинну новой полученной строки-назначения.
Код: Выделить всё
(Пример использования: new destination[256]; strcat(destination, "Привет,кто ты?", sizeof(destination));)
strfind - Используем эту функцию для поиска подстроки в строке
const string[] - Строка, в которой будет производиться поиск (haystack).
const sub[] - Искомая строка (needle).
ignorecase=false - Игнорировать заглавные буквы, если true.
pos=0 - Смещение для начала поиска.
Возвращает Вхождение подстроки, -1 - если не найдено.
Код: Выделить всё
(пример использования: Исполненный Danger1979
if(strfind(name, "_", true) == -1 || strfind(name, "danger", true) != -1 || strfind(name, "hidden", true) != -1)//ищем нижнее подчеркивание
strcmp - Сравнивает две строки друг с другом, с такими опциями, как игнорирование заглавных букв или максимальная длина. Очень часто используется в OnPlayerCommandText.
const string1[] - Первая сравниваемая строка.
const string2[] - Строка, которую вы хотите сравнить с string1.
ignorecase=false - Игнорировать заглавные буквы, если true.
length=cellmax - Максимальное число проверяемых ячеек.
Возвращает 0 - если строки равны между собой.
Код: Выделить всё
( Пример использования : if(strcmp(cmdtext, "/me", true) == 0){)
strlen - Функция может быть использована для проверки длины указанной строки. т.е возрашает длинну строки в целых числах
const string[] - Строка, длину которой вы хотите знать.
Код: Выделить всё
(пример использования: new stringdlin = strlen(""Это строка для проверки");
Думаю теперь можно перейти далее, а именно к операторам сравнения. В языке Pawn операторы выражения сходны с языком C++
Код: Выделить всё
&& – И
|| – ИЛИ
! – НЕ
Оператор if/else:
if – при дословном переводе означает ‘если’
else – иначе
Для сравнения используются следующие знаки:
> – больше
< – меньше
>= – больше либо равно
<= – меньше либо равно
== – равно
!= – не равно
Думаю что в особо пояснение они не нуждаются но все же пару примеров:
Код: Выделить всё
new x=10,y=20;
if(x > 9 && x < y ) // дословно: если x больше 9 и меньше y , то выполняем тело условия
{
print("Успех =)");
}
else
{
Print(“не успех =(“);
}
С обычным оператором ветвления if мы разбрались , теперь идем далее else if
Код: Выделить всё
new l=random(10);//задали рандом до 10
if(x == 1)//сравнили
print("Ура, один");
else if(l == 2 || l == 3)//второе сравнение
print("Ура, два или три");
else if(l >= 4 && l <= 9)
print("Ура, от четырех до девяти включительно");
else
print("Ура, нуль");
Думаю тут все понятно , теперь более интересные функции а именно Switch case
Case позволяет нам проверять переменную на ее значение , и выполнять условие
Код: Выделить всё
new x = random(15);присваиваем рандомное значение от 0 до 15
switch(x)
{
case 0: print("x равно 0");
case 1,2: print("x равно 1 или 2");
case 3..5: print("x в диапазоне от 3 до 5");
case 4..8,196: print("x в диапазоне от 4 до 8 или 196");
default: // любое значение, не вошедшее в верхние, в данном случае это 9-15
{
printf("x равен %d",x);
}
}
Вот код на деле рабочий из мой системы ПВО , а именно переменная lox отвечает за то сколько я раз нажал на кнопку Y
Код: Выделить всё
switch(lox)
{
case 1:
{
SetPlayerCameraPos(playerid, 191.6631,1922.4348,273.5554);
PlaySoundForPlayer(playerid, 1056);
}
case 2:
{
SetPlayerCameraPos(playerid, 191.6631,1922.4348,260.5554);
PlaySoundForPlayer(playerid, 1056);
}
case 3:
{
SetPlayerCameraPos(playerid, 191.6631,1922.4348,240.5554);
PlaySoundForPlayer(playerid, 1056);
}
case 4:
{
SetPlayerCameraPos(playerid, 191.6631,1922.4348,220.5554);
PlaySoundForPlayer(playerid, 1056);
}
case 5:
{
SetPlayerCameraPos(playerid, 191.6631,1922.4348,200.5554);
PlaySoundForPlayer(playerid, 1056);
}
case 6:
{
SetPlayerCameraPos(playerid, 191.6631,1922.4348,180.5554);
PlaySoundForPlayer(playerid, 1056);
}
case 7:
{
SetPlayerCameraPos(playerid, 191.6631,1922.4348,160.5554);
PlaySoundForPlayer(playerid, 1056);
}
case 8:
{
SetPlayerCameraPos(playerid, 191.6631,1922.4348,273.5554);
PlaySoundForPlayer(playerid, 1056);
lox =0;
}
}
и для тех кто фанат оптимизации , case выполняется быстрее чем if. Ну что идем дальше , а именно идем в циклы. Начнем пожалуй с цикла While и do while, расшифровать его можно примерно таким образом - пока выполняется условие, я выполняю цикл. Различия между while и do/while лишь в том, что do/while гарантированно выполнится один раз.
Код: Выделить всё
new x=random(10);
while(x != random(10)) // пока x не равен random(10) повторяй
{
print("x != random(10)");
}
Код: Выделить всё
new x;
do // делай
{
print("x != random(10)");
}
while (x != random(10)); // пока x не равен random(10)
Оператор for:
for имеет вид:
for(действия, которые выполнятся 1 раз ; условие при котором выполняется цикл (выполняется после каждой интерации) ; какие действия будут произведены после завершения интерации)
Интерация это – один шаг цикла
Код: Выделить всё
new x;
for(x=0;x<5;x++)// выполнится 5 раз(от 0 до 4),
// после каждой интерации к x прибавляет 2
{
printf("x = %d",x);
}
Код: Выделить всё
for(new x=5;x<=8;x += 2)// выполнится 2 раза(5 потом 7)
// после каждой интерации к x прибавляет 2
{
printf("x = %d",x);
}
Если не задавать условие выполнения, то цикл будет бесконечным
Код: Выделить всё
for(new x=5; ;x++)
{
printf("x = %d",x);
}
Циклы можно прервать оператором break; или пропустить интерацию, с помощью continue;
Код: Выделить всё
for(new x=0;x<10;x++)
{
if(x == 5) continue;
if(x == 8) break;
printf("%d",x);
// результат: 0,1,2,3,4,6,7
}
А теперь как бонус , остались только PVar’ы и у них есть два плюса , это то что их можно использовать например в Фильрескриптах создовая сами пвары в моде, и второй плюс после выхода игрока они автоматом удаляються.
Ну а теперь так сказать мат часть
Код: Выделить всё
SetPVarInt(playerid,pvar[],int);//создает и редактирует PVar со значением целого числа
SetPVarFloat(playerid,pvar[],float);//создает и редактирует PVar с вещественным типом
SetPVarString(playerid,pvar[],string[]);//создает и редактирует PVar со строковым типом
DeletePVar(playerid,pvar[]);//удаление Pvar
Вот пример
SetPVarInt(playerid,"TestInt",1);//создаем PVar со значением целого числа и присваиваем ему значение 1
SetPVarFloat(playerid,"TestFloat",6.1);//создаем PVar со значением дробного числа и присваиваем ему значение 6.1
SetPVarString(playerid,"TestString","Hello World!");//создаем PVar с строковым типом и записываем в него текст Hello World!
Теперь перейдем к функциям получения значения PVar'a.
Код: Выделить всё
GetPVarInt(playerid,pvar[]);//возвращает значение PVar'a pvar[]
GetPVarFloat(playerid,pvar[]);//возвращает значение PVar'a pvar[]
GetPVarString(playerid,pvar[],output[],symbols);//здесь немного сложнее, записывает значение PVar'a pvar[] в переменную со строковым типом output[] (так как по некоторым причинам функции в pawn не должны возвращать строки), symbols - это сколько символов вы хотели бы записать в переменную output. [color=#BF0000]не возврашет русские букы [/color]
Ну а теперь возможное использование
Код: Выделить всё
/*Если значение PVar'a TestInt равно 2, выводим в консоль его значение(т.е 2)*/
new testint = GetPVarInt(playerid,"TestInt");//для удобства создаем переменную
if(testint == 2) print(testint);//делаем проверку
/*Тоже самое только с Float*/
new Float:testfloat = GetPVarFloat(playerid,"TestFloat");//для удобства создаем переменную
if(testfloat == 6.1) print(testfloat);//делаем проверку
/*А теперь немного сложнее, делаем операцию с String значением, как вы помните мы присвоили PVar'у TestString значение: Hello World!*/
new output[64];//делаем переменную в которую будет записано значением PVar'а
GetPVarString(playerid,"TestString",output,sizeof(output));//геттим значение PVar'а
if(strcmp(output,"Hello World!",true,13)) printf(output);//если находим в output Hello World! выводим в консоль output