Отлов ответов в меню

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Ребят направьте в нужную сторону пожалуйста.
C-подобный:
public void OnPluginStart()
{
    //RegServerCmd("sm_testing", Menu_Testing);
    RegAdminCmd("sm_testing", Menu_Testing, ADMFLAG_ROOT);
}

public Action Menu_Testing(int iClient, int args)
{
    Handle hMenu = new Menu(MenuHandler_Basic);
    SetMenuTitle(hMenu, "Базовое меню");
    AddMenuItem(hMenu, "iItem", "Начать тестирование");
    AddMenuItem(hMenu, "iItem2", "Начать тестирование");
    SetMenuExitButton(hMenu, true);
    SetMenuExitBackButton(hMenu, false);
    DisplayMenu(hMenu, iClient, 20);
    return Plugin_Handled;
}

public int MenuHandler_Basic(Handle menu, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            switch(GetRandomInt(0, 2))
            {
                case 0:
                {
                    Menu hMenu = new Menu(MenuHandler_Basic);
                    hMenu.SetTitle("Вопрос 1");
                    hMenu.AddItem("iItem3", "Да");
                    hMenu.AddItem("iItem4", "Второй вариант");
                    hMenu.AddItem("iItem5", "Третий вариант");
                    hMenu.AddItem("iItem6", "Скорее нет");
                    hMenu.Display(iClient, 20);
                }
                case 1:
                {
                    Menu hMenu = new Menu(MenuHandler_Basic);
                    hMenu.SetTitle("Вопрос 2");
                    hMenu.AddItem("iItem7", "Да 2");
                    hMenu.AddItem("iItem8", "Второй вариант 2");
                    hMenu.AddItem("iItem9", "Третий вариант 2");
                    hMenu.AddItem("iItem10", "Скорее нет 2");
                    hMenu.Display(iClient, 20);
                }
                case 2:
                {
                    Menu hMenu = new Menu(MenuHandler_Basic);
                    hMenu.SetTitle("Вопрос 3");
                    hMenu.AddItem("iItem11", "Да 3");
                    hMenu.AddItem("iItem12", "Второй вариант 3");
                    hMenu.AddItem("iItem13", "Третий вариант 3");
                    hMenu.AddItem("iItem14", "Скорее нет 3");
                    hMenu.Display(iClient, 20);
                }
            }
        }
        case MenuAction_End:
        {
            delete menu;
        }
    }
}

Идея сделать:
1. Экзамен в 50 вопросов
2. Отображает меню рандомные вопросы допустим 10 из 50, по очереди
3. По окончании сообщает какое количество верных и не верных ответов

Собственно вопрос:
1. Как сделать отлов ответов
2. Как сделать что бы шли по очереди только 10 из 50
3. Как сделать что бы были верные и ошибочные ответы

И к стати закомментированое меню не отображает, просто пишет нет такой команды, не знаю что делать. Пришлось делать админскую команду.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
сделать двухмерный массив с вопросами и ответами, из которого генерить менюшки и массив с правильными вариантами ответов для первого массива.
отсылать игроку меню со случайным индексом (и запоминать какой вариант вопроса был отправлен), а потом сравнивать выбранный вариант с тем что прописано во втором массиве для этого варианта.
Ну а массивы можно с помощью конфигов подгружать
 

Патриот Анархии

Чиполлино
Сообщения
113
Реакции
68
Ребят направьте в нужную сторону пожалуйста.
C-подобный:
public void OnPluginStart()
{
    //RegServerCmd("sm_testing", Menu_Testing);
    RegAdminCmd("sm_testing", Menu_Testing, ADMFLAG_ROOT);
}

public Action Menu_Testing(int iClient, int args)
{
    Handle hMenu = new Menu(MenuHandler_Basic);
    SetMenuTitle(hMenu, "Базовое меню");
    AddMenuItem(hMenu, "iItem", "Начать тестирование");
    AddMenuItem(hMenu, "iItem2", "Начать тестирование");
    SetMenuExitButton(hMenu, true);
    SetMenuExitBackButton(hMenu, false);
    DisplayMenu(hMenu, iClient, 20);
    return Plugin_Handled;
}

public int MenuHandler_Basic(Handle menu, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            switch(GetRandomInt(0, 2))
            {
                case 0:
                {
                    Menu hMenu = new Menu(MenuHandler_Basic);
                    hMenu.SetTitle("Вопрос 1");
                    hMenu.AddItem("iItem3", "Да");
                    hMenu.AddItem("iItem4", "Второй вариант");
                    hMenu.AddItem("iItem5", "Третий вариант");
                    hMenu.AddItem("iItem6", "Скорее нет");
                    hMenu.Display(iClient, 20);
                }
                case 1:
                {
                    Menu hMenu = new Menu(MenuHandler_Basic);
                    hMenu.SetTitle("Вопрос 2");
                    hMenu.AddItem("iItem7", "Да 2");
                    hMenu.AddItem("iItem8", "Второй вариант 2");
                    hMenu.AddItem("iItem9", "Третий вариант 2");
                    hMenu.AddItem("iItem10", "Скорее нет 2");
                    hMenu.Display(iClient, 20);
                }
                case 2:
                {
                    Menu hMenu = new Menu(MenuHandler_Basic);
                    hMenu.SetTitle("Вопрос 3");
                    hMenu.AddItem("iItem11", "Да 3");
                    hMenu.AddItem("iItem12", "Второй вариант 3");
                    hMenu.AddItem("iItem13", "Третий вариант 3");
                    hMenu.AddItem("iItem14", "Скорее нет 3");
                    hMenu.Display(iClient, 20);
                }
            }
        }
        case MenuAction_End:
        {
            delete menu;
        }
    }
}

Идея сделать:
1. Экзамен в 50 вопросов
2. Отображает меню рандомные вопросы допустим 10 из 50, по очереди
3. По окончании сообщает какое количество верных и не верных ответов

Собственно вопрос:
1. Как сделать отлов ответов
2. Как сделать что бы шли по очереди только 10 из 50
3. Как сделать что бы были верные и ошибочные ответы

И к стати закомментированое меню не отображает, просто пишет нет такой команды, не знаю что делать. Пришлось делать админскую команду.

Можно пробовать сделать так:

C++:
public void OnPluginStart()
{
    // RegServerCmd("sm_testing", Menu_Testing); - зачем Servercmd ??
    RegConsoleCmd("sm_testing", Menu_Testing);

}


int trueans, falseans, Count;


public Action Menu_Testing(int iClient, int args)
{
    Menu hMenu = new Menu(MenuHandler_Basic, MENU_ACTIONS_ALL);
    SetMenuTitle(hMenu, "Базовое меню");
    AddMenuItem(hMenu, "iItem", "Начать тестирование");
    AddMenuItem(hMenu, "iItem2", "Начать тестирование");
    SetMenuExitButton(hMenu, true);
    SetMenuExitBackButton(hMenu, false);
    DisplayMenu(hMenu, iClient, 20);
    return Plugin_Handled;
}



public int MenuHandler_Basic(Handle menu, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            switch(GetRandomInt(0, 1))
            {
                case 0:
                {
                    Var1(iClient);
                }
                case 1:
                {
                    Var2(iClient);
                }                       
            }
        }
        case MenuAction_End:
        {
            delete menu;
        }
    }
}

void Var1(int iClient)
{
    Menu Var1_task1_mn = new Menu(MenuHandler_Var1_mn, MENU_ACTIONS_ALL);
    SetMenuTitle(Var1_task1_mn, "Вопрос № 1");
    AddMenuItem(Var1_task1_mn, "iItem", "True Answ");
    AddMenuItem(Var1_task1_mn, "iItem2", "False Answ");
    SetMenuExitButton(Var1_task1_mn, true);
    SetMenuExitBackButton(Var1_task1_mn, false);
    DisplayMenu(Var1_task1_mn, iClient, 30);
}

public int MenuHandler_Var1_mn(Handle Var1_task1_mn, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            if(param == 0){
                ++trueans;
            }
            if(param == 1){
                ++falseans;
            }                   
        
            Var1_task2(iClient);
        }
        case MenuAction_End:
        {
            delete Var1_task1_mn;
        }
    }
}

// и т.д. 10 вопросов...


void Var1_task10(int iClient)
{
    Menu Var1_task10_mn = new Menu(MenuHandler_Var1_task10_mn, MENU_ACTIONS_ALL);
    SetMenuTitle(Var1_task10_mn, "Вопрос № 10");
    AddMenuItem(Var1_task10_mn, "iItem", "True Answ");
    AddMenuItem(Var1_task10_mn, "iItem2", "False Answ");
    SetMenuExitButton(Var1_task10_mn, true);
    SetMenuExitBackButton(Var1_task10_mn, false);
    DisplayMenu(Var1_task10_mn, iClient, 30);
}

public int MenuHandler_Var1_task10_mn(Handle Var1_task10_mn, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            if(param == 0){
                ++trueans;
            }
            if(param == 1){
                ++falseans;
            }                   
        
            switch(GetRandomInt(1, 40))
            {
                case 0:
                {
                    Var1_task11
                }
                case 1:
                {
                    Var1_task11
                }           
                // и т.д.....
            
            }
        }
        case MenuAction_End:
        {
            delete Var1_task10_mn;
        }
    }
}

// Вот уже почти всё... и тип каждый раз, когда будет позже вопросы ( те 40, которые не по порядку, можно сделать ++Count  и ArrayList  с - тех, что уже были ...


void Var1_task50(int iClient)
{
    Menu Var1_task50_mn = new Menu(MenuHandler_Var1_task50_mn, MENU_ACTIONS_ALL);
    SetMenuTitle(Var1_task50_mn, "Вопрос № 10");
    AddMenuItem(Var1_task50_mn, "iItem", "True Answ");
    AddMenuItem(Var1_task50_mn, "iItem2", "False Answ");
    SetMenuExitButton(Var1_task50_mn, true);
    SetMenuExitBackButton(Var1_task50_mn, false);
    DisplayMenu(Var1_task50_mn, iClient, 30);
}

public int MenuHandler_Var1_task50_mn(Handle Var1_task50_mn, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            if(param == 0){
                ++trueans;
            }
            if(param == 1){
                ++falseans;
            }               
            ++Count
            if(Count == 40){
                PrintToChat(iClient, "У вас %d правильных и %d не правильных ответов.", trueans, falseans);
            }else{
                switch(GetRandomInt(1, 40))
                {
                    case 0:
                    {
                        Var1_task11
                    }
                    case 1:
                    {
                        Var1_task11
                    }           
                    // и  т.д...
                
                }
            }
        }
        case MenuAction_End:
        {
            delete Var1_task50_mn;
        }
    }
}
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Упаси боже такое делать, проще @iLoco попросить склепать на Menu Builder тогда уж...
Можно пробовать сделать так:

C++:
public void OnPluginStart()
{
    // RegServerCmd("sm_testing", Menu_Testing); - зачем Servercmd ??
    RegConsoleCmd("sm_testing", Menu_Testing);

}


int trueans, falseans, Count;


public Action Menu_Testing(int iClient, int args)
{
    Menu hMenu = new Menu(MenuHandler_Basic, MENU_ACTIONS_ALL);
    SetMenuTitle(hMenu, "Базовое меню");
    AddMenuItem(hMenu, "iItem", "Начать тестирование");
    AddMenuItem(hMenu, "iItem2", "Начать тестирование");
    SetMenuExitButton(hMenu, true);
    SetMenuExitBackButton(hMenu, false);
    DisplayMenu(hMenu, iClient, 20);
    return Plugin_Handled;
}



public int MenuHandler_Basic(Handle menu, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            switch(GetRandomInt(0, 1))
            {
                case 0:
                {
                    Var1(iClient);
                }
                case 1:
                {
                    Var2(iClient);
                }                    
            }
        }
        case MenuAction_End:
        {
            delete menu;
        }
    }
}

void Var1(int iClient)
{
    Menu Var1_task1_mn = new Menu(MenuHandler_Var1_mn, MENU_ACTIONS_ALL);
    SetMenuTitle(Var1_task1_mn, "Вопрос № 1");
    AddMenuItem(Var1_task1_mn, "iItem", "True Answ");
    AddMenuItem(Var1_task1_mn, "iItem2", "False Answ");
    SetMenuExitButton(Var1_task1_mn, true);
    SetMenuExitBackButton(Var1_task1_mn, false);
    DisplayMenu(Var1_task1_mn, iClient, 30);
}

public int MenuHandler_Var1_mn(Handle Var1_task1_mn, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            if(param == 0){
                ++trueans;
            }
            if(param == 1){
                ++falseans;
            }                
     
            Var1_task2(iClient);
        }
        case MenuAction_End:
        {
            delete Var1_task1_mn;
        }
    }
}

// и т.д. 10 вопросов...


void Var1_task10(int iClient)
{
    Menu Var1_task10_mn = new Menu(MenuHandler_Var1_task10_mn, MENU_ACTIONS_ALL);
    SetMenuTitle(Var1_task10_mn, "Вопрос № 10");
    AddMenuItem(Var1_task10_mn, "iItem", "True Answ");
    AddMenuItem(Var1_task10_mn, "iItem2", "False Answ");
    SetMenuExitButton(Var1_task10_mn, true);
    SetMenuExitBackButton(Var1_task10_mn, false);
    DisplayMenu(Var1_task10_mn, iClient, 30);
}

public int MenuHandler_Var1_task10_mn(Handle Var1_task10_mn, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            if(param == 0){
                ++trueans;
            }
            if(param == 1){
                ++falseans;
            }                
     
            switch(GetRandomInt(1, 40))
            {
                case 0:
                {
                    Var1_task11
                }
                case 1:
                {
                    Var1_task11
                }        
                // и т.д.....
         
            }
        }
        case MenuAction_End:
        {
            delete Var1_task10_mn;
        }
    }
}

// Вот уже почти всё... и тип каждый раз, когда будет позже вопросы ( те 40, которые не по порядку, можно сделать ++Count  и ArrayList  с - тех, что уже были ...


void Var1_task50(int iClient)
{
    Menu Var1_task50_mn = new Menu(MenuHandler_Var1_task50_mn, MENU_ACTIONS_ALL);
    SetMenuTitle(Var1_task50_mn, "Вопрос № 10");
    AddMenuItem(Var1_task50_mn, "iItem", "True Answ");
    AddMenuItem(Var1_task50_mn, "iItem2", "False Answ");
    SetMenuExitButton(Var1_task50_mn, true);
    SetMenuExitBackButton(Var1_task50_mn, false);
    DisplayMenu(Var1_task50_mn, iClient, 30);
}

public int MenuHandler_Var1_task50_mn(Handle Var1_task50_mn, MenuAction action, int iClient, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            if(param == 0){
                ++trueans;
            }
            if(param == 1){
                ++falseans;
            }            
            ++Count
            if(Count == 40){
                PrintToChat(iClient, "У вас %d правильных и %d не правильных ответов.", trueans, falseans);
            }else{
                switch(GetRandomInt(1, 40))
                {
                    case 0:
                    {
                        Var1_task11
                    }
                    case 1:
                    {
                        Var1_task11
                    }        
                    // и  т.д...
             
                }
            }
        }
        case MenuAction_End:
        {
            delete Var1_task50_mn;
        }
    }
}
 
Последнее редактирование:

Патриот Анархии

Чиполлино
Сообщения
113
Реакции
68
Упаси боже такое делать, проще @iLoco попросить склепать на Menu Builder тогда уж...
Я не заставляю использовать мой говно-код, а просто предложил схематично, как это может быть сделано.
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Лол, проще сделать парсер в 50-100 строчек и брать данные с конфига, при этом редачить исходник что бы поправить что-то не прийдётся, ибо есть конфиг
Сообщения автоматически склеены:

Вот за полтора часа (вместе с тестами) можно написать такой плагин, с возможностями:
- авто-открытие меню если оно было закрыто другим меню
- динамический конфиг, вопросов и тестов бесконечно
- возможность продолжить тест (в рамках сессии)
- система баллов

и всё это всего-лишь ~300 строчек кода 😅
Залит в ресурсы.
Screenshot_7.png
Screenshot_8.png
Screenshot_9.png

Screenshot_10.png
 

Вложения

  • simple_tests.smx
    6 КБ · Просмотры: 1
  • simple_tests.txt
    697 байт · Просмотры: 4
  • simple_tests.sp
    6.2 КБ · Просмотры: 4
Последнее редактирование:
Сверху Снизу