Начнём с переменных. Переменные - это такие ящички в которых мы можем хранить информацию о чём-либо на время работы сервера, переменную можно приравнять, уменьшить, увеличить, разделить, умножить, сравнить.
Переменные объявляются с помощью оператора new, переменная обязательно должна иметь какое то имя по которому мы будем к ней обращаться имя переменной может состоять из некоторых знаков, латинских букв и цифр, но с цифр начинаться не должна напишем небольшой пример что бы понять как это работает на практике, создайте в павно новый документ и впишите следующий код.
Code #include <a_samp>
//------------------------------------------------------------------------------
main()
{
new x1 = 2;/*После объявления переменных всегда ставится ; можно объявлять в одном new сколько угодно переменных через запятую new x1,x2,x3,x4;*/
new x2 = 3;
x1 = x1 + x2;
printf("x1 = %d",x1);//в коце так же ставятся ; рекомендую запоминать сразу
}
//------------------------------------------------------------------------------
public OnGameModeInit()
{
return 1;
}
//------------------------------------------------------------------------------
Исчем сверху на панели с кнопками у павно шестерёнку жмём если ошибок нет радуемся и едем дальше.
Теперь запускаем этот скрипт на сервере как GM.
В данном примере мы создали 2 переменные x1 мы приравняли сразу к 2 x2 к 3 и прибавили к x1 x2 затем вывели на экран.
Переменные имеют типы в разных типах переменных хранятся разные типы данных и обычно в переменные одного типа мы не можем положить данные переменной другого типа, это как пытаться засунуть апельсины в упаковку для куриных яиц.
Рассмотрим типы переменных встречающихся в Pawno: без типа переменная целого типа в неё мы можем положить переменную вещественного типа, но потеряем дробную часть, Float - вещественная переменная с дробью (пример new Float:fx = 23.1), Menu - переменная хранящая идентификатор меню, Text - переменная хранящая идентификатор Текст драва.
В примере мы использовали функцию printf - это функция форматированного вывода на экран серверной консоли, эта функция имеет один обязательный параметр и любое колличество не обязательных (как-то так), параметры - это данные которые мы даём функции для их обработки.
printf(const format[],{Float,...}:...);
Первый параметр это строка строки в павно как и в С++(павно является си-образным интерпритатором) записываются в кавычках "", строка эта отвечает за формат вывода запись %d означает что мы хотим вывести на экран целое число если вы например подставите мнесто этого %s то получите кракозябрину, а если %c - символ кодом которого будет являться число содержащееся в переменной x1.
Обозначения вывода переменных всех типов:
%s - строка
%d - целое число
%f - переменная с дробной частью %.2f - тоже самое, но двойка после точки означает колличество цифр после точки
%c - символ
Справочный материал по функциям рекомендую поискать в учебниках если попадётся на глаза дам ссылку.
Теперь перейдём к тому без чего не обходится ни один скрипт и программа это ветвления, без них алгоритм будет линейным и всегда будет выполнять одно и то же действие.
Для этого используется if и else, синтаксис
if(логическое выражение(условие тобиш))
{//Если условие является истиной(true) то выполняется код между скобками ложью является 0, истиной всё остальное
}
else /*else без if не бывает так как то что записано в else выполняется в тех случаях когда в if стоящем выше ложь(false) так же else может содержать в себе if*/
{
}
Если у вас между скобок всего одно выражение (выражения заканчиваются то скобки можно не ставить если скобок нет то на выполнение возмётся выражение стоящее после if или else.
Цепочка проверок у нас может быть бесконечной.
Code
if(x1 == 1)
{
x1 = 2;
}
else if(x1 ==2)
{
x1 = 3
x1 = x1*3;
}
else if(x1 < 4)
{
x1 = 5;
}
else //и так далее
Код просто для того что бы показать как это записывается.
Логические выражения в качестве логического выражения пойдёт любое значение например просто можно поставить переменную
Code
if(x1)
{
//...
}
или сравнить переменную или число с чем либо. Список возможнах сравнений:
< > - меньше больше употребляются отдельно друг от друга "<" ">"
== - равно, сравнивает не равны ли значения
!= - не равно почти то же что и выше, только наоборот
Вообще о приставке !(не) поподробнее, использовать её можно не только в логических выражениях, суть её в следующем если за ней стоит ложь, то она поменяет её на истину(0 на 1), если истина то на ложь (заменит на 0), использовать можно и вот так x1 = !x1; В случаях когда переменная у вас по алгоритму принимает значения только 0 или 1 можно использовать такую вот короткую запись что бы не расписывать условия.
В одном операторе if может быть несколько логических выражений, но их необходимо скреплять логическими связками && - (читается как и) и || - (читается как или), суть проста, думаю в школе проходили, распишу на примере.
Code
if(x1 < 5 && x1 > 0)//условие выполняется когда икс1 имеет значение в диапазоне от 1 до 4 это если у нас переменная не вещественная(дробная Float)
Теперь пример про или
Code
if(x1 < 0 || x1 > 5)//тоже что и первое тоько наоборот условие выполнится если икс1 вне диапазона от 0 до 4
Теперь объясняю по другому, ложно выражение после себя даст 0 истинное 1 можно расписать так
при x1 = 3;
заменяем сразу беру первый пример
if(1 && 1)//итог 1
Вообще связка && даст истину если только оба выражения истина, а || даст ложь только в том случае когда оба значения 0
Теперь напишем небольшой пример основываясь на выше предоставленном материале.
Code
#include <a_samp>
//------------------------------------------------------------------------------
main()
{
new x = random(10);
if(x < 5)
{
printf("X < 5, x = %d",x);
}
}
//------------------------------------------------------------------------------
public OnGameModeInit()
{
return 1;
}
//------------------------------------------------------------------------------
random(max); //После выполнения вернёт после себя случайное значение от 0 до max, max в диапазон не входит, вернёт значение тоесть вместо этой функции на месте кода подставится цифра.
Счёт у компьютера начинается не как у людей с 1, а с 0
Позапускав этот скрипт вы увидете что значения x принимает почти каждый раз разные.
Дальше мы будем рассмтривать циклы без них так же как и без ветвлений необходится почти ни один алгоритм. Ветвления входят так же в состав циклов, тоесть в цикле задаётся условие при не выполнии которого цикл останавливается и код выполняется дальше. Есть грубо говоря 2 вида циклов это циклы которые сначала проверяют истина ли условие, а затем уже выполняют тело цикла (то что заключено ниже в фигурные скобки), и есть цикл который сначала делает, а уже потом проверят условие называется он цикл с пост условием, первые циклы с пред условием, цикл с пост условием как вы уже наверное догадались выполняется как минимум 1 раз.
И так рассмотрим циклы с пред условием начнём с цикла while:
Синтаксис: while(Логическое выражение(условие тобиш)) и ниже тело цикла как у оператора if, теперь рассматриваем на примере, в качестве примера можно написать скрипт выводящий на экран символы и их коды, в кодировка DOS это консоль на которой мы выполняем примеры отличается от win и русские буквы там будут заменены каракульками, но они там есть, и сечас мы их пожалуй найдём
Code
main()
{
new i = 128;
while(i<158)
{
printf("%c = %d",i,i);
i++;
}
}
Возможно вас смутила запись "i++" это тоже самое что и i = i + 1; увеличение переменной на 1, так же можно сделать и такую запись i += 1; это прибавить к i 1, вместо одного вы можете прибавить и переменную, так же есть -= *= /=, думаю догадываетесь что они означают.
Данный код можно записать и по другому
Code
main()
{
new i = 128;
while(i<159)
printf("%c = %d",i,i++);
}
Сдесь мы выводим значения i и увеличиваем её на 1, можно записать по другому
Code
main()
{
new i = 127;
while(i<159)
printf("%c = %d",++i,i);
}
Здесь мы сначала увеличиваем значение i на единицу, а затем выводим.
Следующий цикл с пред условием for
Синтаксис for(Действие выполяемое 1 раз перед запуском;условие;действие выполняемое каждый цикл)
В работе с while всё понятно, проверяем > выполняем > проверяем > выполняем и так далее...
for работает несколько по другому выполняем действие > проверяем > выполняется тело цикла > выполняем действие цикла > проверка > тело цикла > действие цикла > проверка и так далее...
Тепрь перепишем наш код с оператором for
Code
main()
{
for(new i=128;i<160;i++)
printf("%c = %d",i,i);
}
В качестве первого действия мы создали переменную i и приравняли её к 128 (Коду символа А в консоли), замечание переменная была создана только на время выполнения цикла, если вы попытаетесь использовать после цикла компилятор выдаст вам ошибку "error 017: undefined symbol "i""
переменная не была найдена, ведь она была уничтожена после выполнения цикла, на цикле с пост условием внимания заострять не будем так как это тоже что и while
синтаксис
do
{
}while();//Вот и всё
Коментарий это некий текст который не компилируетс и служит для пояснения назначения переменных, функций и кусков кода, конечно когда вы пишите свой мод то думаете что будете держать всё в голове до конца жизни, но через недельку когда возникает надобность чтото поменять вы открываете мод и "** твою мать!" говорите вы себе так как нихрена не понятно, благодаря коментариям вы можете достаточно быстро разобратся в собственном коде и уж тем более помочь в этом другому кодеру который посчитает нужным ваш код дорабатывать, так же вы можете коментировать те строки которые вы считаете не нужными на данный период времени, но которые могут понадобится после, что бы закоментировать строку ставим в начале строки "//" и всё что идет после будет выделено зелёным, так же вы можете использовать "/*" и "*/", первый открывает коментарии и всё что идёт дальше будет закоментированно до "*/" рекомендуется не ставить коментарии где попало например в строках на подобие "x1 += 2;" так как это и так понятно, а вот при описании собственных функций лучше ими воспользоватся не рекомендуется создавать вложенные коментарии так как это может привести к ошибкам приведу пример вложенного коментария
Code
/* Коментарий
/*
Вложеный коментарий
*/
*/
Поясняю как это приводит к ошибкам дело в том что когда вы ставите "/*" коментарий открывается когда идёт второй такой символ ничего не происходит затем идёт закрытие "*/", а следующий знак не смотря что это у вас в редакторе кода не отобразилось уже не будет опознан как закрывающий и будет выдана ошибка.
И так в этом посте я собирался поведать о массивах, собсна начнём повествование:
И так мы уже знаем что переменная это у нас некое подобие ящика, ну так вот массив можно назвать некоторым подобием склада ящиков одного типа объявляется он почти так же как и переменная тоесть даётся имя по которому мы сможем к нему обращаться и указывается колличество хранимых в нём ящиков, выполнять какие действия с самим массивом мы как бы не можем, нас интересуют его ячейки(ящики) к ячейке мы обращаемся по её индексу, помните что счёт в компьютере начинается с 0 поэтому первая ячейка всегда будет иметь индекс 0, а последняя n-1, значения всех элементов массива(ячеек) вы можете задать при его инициализации(создании, объявлении), теперь пример:
Code
main()
{
new mass[10];
for(new i=0;i<sizeof(mass);i++)
mass[i] = 128 + random(30);
for(new i=0;i<sizeof(mass);i++)
printf("%d = %c",mass[i],mass[i]);
}
И так в этом примере мы создали массив из 10 элементов затем задали случайные значения всем его элементам и вывели на консоль все его элементы в виде цифр и символов, наверное вас заинтересовало что это за функция такая sizeof, ну так вот эта функция позволяет узнать колличество элементов массива. Вообще все массивы могут иметь только фиксированный размер тоесть если я задал массив из 20 элементов, то он никак не может содержать 50 элементов, есть ещё одно несколько неприятное ограничение это то что в ходе выполнения вашего скрипта вы не можете создать массив не изместного вам колличества элементов так скажем, тоесть колличеством элементов может являтся только константа, а никак не число возращённое например функцией рандом, или указано какой нибуть переменной. Кстати код который я написал будет несколько неудачным и вообще будет является несколько заторможенным в выполнении конечно при двух головом атлоне это не заметно, но страйтесь писать код как можно менее требовательным к ресурсам это поможет вам развить соображалку . И так я сказал что код тормазнутый тперь разберёмся в чём, во первых я создаю для каждого массива одну и ту же переменную создание переменной тоже отнимает время как и её приравнивание, но приравнивание всё же меньше времени отнимет, так почему бы её не объявить выше (заметка при создании переменной в павно она автоматически получает значение 0, это встречается далеко не во всех языках например в С/С++ этого нет) таким образом мы будем создавать её всего лишь однажды и в дальнейшем просто приравняем её к 0, теперь вторая промажка это использование в условии функции sizeof дело в том что каждый раз при проверке условия она будет высчитывать размер массива(ну я так думаю) это время да и память она тоже потратит, давайте перепишем этот код заново:
Code
new mass[10];
new sizemass = sizeof(mass);
new i;
while(i < sizemass)
mass[i++] = 128 + random(30);
for(new i=0;i<sizemass;i++)
printf("%d = %c",mass[i],mass[i]);
Думаю так код будет смотреться немного лучше.
Говоря о массивах нельзя не упомянуть о строках, строки сами по себе являются массивами на подобие массива mass. Используя массивы вы можете очень сильно сократить код и повысить его функциональность что избавит вас от лишней писанины.
По мимо массивов существуют ещё и списки enum используется следующим образом:
Code
enum inf
{
X,
Y,
Z
}
new mass[10][inf];
Массивы могут иметь до 3 измерений, одномерный массив вы можете представить в виде строки, двухмерный в виде квадрата или прямоугольника ну, а трёхмерный говорит вроде сам за себя. В этом коде был создан список с именем inf и был подставлен в массив mass. Теперь у массива на каждой полочке к которой мы обращаемся по индексу есть 3 ячейки к которым мы обращаемся по имени состоящему из символов X Y Z, список может содержать в себе различные типы данных, использование списков и массивов вы можете увидеть в стандартных модах которые есть в сервере ГТА СА.