PDA

Просмотр полной версии : [Вопрос] Сдача теста



Skyline
15.08.2016, 03:26
Всем здравствуйте. Такой вопрос, как реализовать тест через стиль DIALOG_STYLE_INPUT чтобы были верны варианты ответа.
Приведу пример. Есть Диалог

ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,"Вопрос №1","{FFDEAD}Что означает мигание зелёного сигнала светофора?\n\n1. Предупреждает о неисправности светофора.\n2. Разрешает движение и информирует о том, что вскоре будет включен запрещающий сигнал.\n3. Запрещает дальнейшее движение.","Далее","");
Как сделать если игрок написал правильный ответ - 2, тест шел дальше, а если не правильно 1 или 3, то выдавал игроку ошибку.
И можно ли сделать так, чтобы на каждом вопросе разные цифры были или же придется создать переменную, и приравнять значение 2 допустим и чтобы все ответы были 2.
Подскажите способ реализации.

BadPawn
15.08.2016, 04:08
ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,"Вопрос №1","{FFDEAD}Что означает мигание зелёного сигнала светофора?\n\n\
1. Предупреждает о неисправности светофора.\n\
2. Разрешает движение и информирует о том, что вскоре будет включен запрещающий сигнал.\n\
3. Запрещает дальнейшее движение.","Далее","");


public OnDialogResponse:

case 0://0 - dialogid
{
switch(listitem)
{
case 0: //Не верный ответ. +1 к ошибке (если есть возможность не сдать:)), выводим диалог того же вопроса
{
SendClientMessage(playerid, -1, !" Ответ не верный !");
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1",
!"{FFDEAD}Что означает мигание зелёного сигнала светофора?\n\n\
1. Предупреждает о неисправности светофора.\n\
2. Разрешает движение и информирует о том, что вскоре будет включен запрещающий сигнал.\n\
3. Запрещает дальнейшее движение.",
!"Далее",
!"");
}
case 1:
{
SendClientMessage(playerid, -1, !" Ответ верный !");
//К следующему вопросу
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1..N",
!"{FFDEAD}Обязаны ли вы пропустить пешехода, заступивший на пешеходный переход?\n\n\
1. Обязан.\n\
2. Не обязан\n",
!"Далее",
!"");
}
case 2: //Аналогично с 0
{
SendClientMessage(playerid, -1, !" Ответ не верный !");
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1",
!"{FFDEAD}Что означает мигание зелёного сигнала светофора?\n\n\
1. Предупреждает о неисправности светофора.\n\
2. Разрешает движение и информирует о том, что вскоре будет включен запрещающий сигнал.\n\
3. Запрещает дальнейшее движение.",
!"Далее",
!"")
}
}
}
case 1://1 - dialogid
{
switch(listitem)
{
case 0:
{
SendClientMessage(playerid, -1, !" Ответ верный !");
}
case 1:
{
SendClientMessage(playerid, -1, !" Ответ не верный !");
}
}
}




С меня конечно объяснитель дикий. Надеюсь поймешь. )))

Skyline
15.08.2016, 11:36
Неа, не работает. Разве такой вариант DIALOG_STYLE_INPUT а не для DIALOG_STYLE_LIST?

vovandolg
15.08.2016, 15:58
По моему такая конструкция в коде диалога куда проще и читаемой будет, не?


if(strval(inputtext) == X)//X - там где будет крыться верный ответ
{
SendClientMessage(playerid, -1, !" Ответ верный !");
//К следующему вопросу
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1..N",
!"{FFDEAD}Обязаны ли вы пропустить пешехода, заступивший на пешеходный переход?\n\n\
1. Обязан.\n\
2. Не обязан",
!"Далее", !"");
}
else
{
SendClientMessage(playerid, -1, !" Ответ не верный !");
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1",
!"{FFDEAD}Что означает мигание зелёного сигнала светофора?\n\n\
1. Предупреждает о неисправности светофора.\n\
2. Разрешает движение и информирует о том, что вскоре будет включен запрещающий сигнал.\n\
3. Запрещает дальнейшее движение.",
!"Далее", !"");
}

Sp1ke
15.08.2016, 16:27
По моему такая конструкция в коде диалога куда проще и читаемой будет, не?


if(strval(inputtext) == X)//X - там где будет крыться верный ответ
{
SendClientMessage(playerid, -1, !" Ответ верный !");
//К следующему вопросу
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1..N",
!"{FFDEAD}Обязаны ли вы пропустить пешехода, заступивший на пешеходный переход?\n\n\
1. Обязан.\n\
2. Не обязан",
!"Далее", !"");
}
else
{
SendClientMessage(playerid, -1, !" Ответ не верный !");
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1",
!"{FFDEAD}Что означает мигание зелёного сигнала светофора?\n\n\
1. Предупреждает о неисправности светофора.\n\
2. Разрешает движение и информирует о том, что вскоре будет включен запрещающий сигнал.\n\
3. Запрещает дальнейшее движение.",
!"Далее", !"")
}


Забыл в последнем диалоге ; поставить, да и вроде когда табулируешь текст еще раз смотрится приятней

return
ShowPlayerDialog(playerid, 6, DIALOG_STYLE_INPUT,
!"Вопрос №1",
!"{FFDEAD}Что означает мигание зелёного сигнала светофора?\n\n\
1. Предупреждает о неисправности светофора.\n\
2. Разрешает движение и информирует о том, что вскоре будет включен запрещающий сигнал.\n\
3. Запрещает дальнейшее движение.",
!"Далее", !""
);

Saibot
21.08.2016, 02:12
if(strval(inputtext) == X)//X - там где будет крыться верный ответ
{
SendClientMessage(playerid, -1, !" Ответ верный !");
//К следующему вопросу
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1..N",
!"{FFDEAD}Обязаны ли вы пропустить пешехода, заступивший на пешеходный переход?\n\n\
1. Обязан.\n\
2. Не обязан",
!"Далее", !"");
}
else
{
SendClientMessage(playerid, -1, !" Ответ не верный !");
return ShowPlayerDialog(playerid,6,DIALOG_STYLE_INPUT,
!"Вопрос №1",
!"{FFDEAD}Что означает мигание зелёного сигнала светофора?\n\n\
1. Предупреждает о неисправности светофора.\n\
2. Разрешает движение и информирует о том, что вскоре будет включен запрещающий сигнал.\n\
3. Запрещает дальнейшее движение.",
!"Далее", !"");
}

А если будет 20 вопросов?

Думаю так будет лучше, имхо.

//Ко всем глобальным переменным
enum e_DRIVING_SCHOOL_TEST
{
QUESTION[64],/*Длина вопроса*/
ANSWER/*Ответ*/
}

const AMOUNT_QUESTION = 2;/*Кол-во вопросов*/

static const school_test [AMOUNT_QUESTION] [e_DRIVING_SCHOOL_TEST] =
{
{!"Вопрос 1", 2/*ответ 2*/},
{!"Вопрос 2", 1/*ответ 1*/}
};

new gFollowingQuestion[MAX_PLAYER char];

//Там где начинается тест
CMD:test(playerid)
{
SCM(playerid, -1, !"Тест начался");
gFollowingQuestion{playerid} = 0;
return AskingQuestions(playerid);
}

//Диалог
case 6:
{
if(!response)
return 1;

if(strval(inputtext)) == school_test[gFollowingQuestion{playerid}][ANSWER])
{
SCM(playerid, -1, !"Ответ верный");
if(++ gFollowingQuestion{playerid} == AMOUNT_QUESTION)/*Проверка на последней вопрос*/
{
/*Выдаем игроку лицензию*/
return SCM(playerid, -1, !"Вы прошли тест");
}
AskingQuestions(playerid);//Показываем ему следующий вопрос.
}
else
{
SCM(playerid, -1, !"Ответ не верный");
AskingQuestions(playerid);//Показываем ему, этот же вопрос
}
}
//В конец мода
sotck AskingQuestions(playerid)
{
new question[11 char] = !"Вопрос №";

valstr(question, gFollowingQuestion{playerid}+1);

return ShowPlayerDialog(playerid, 6, DIALOG_STYLE_INPUT, question,
school_test[gFollowingQuestion{playerid}][QUESTION], !"Далее", "");
}

Это практически уже готовый вариант, осталось только добавить вопросы и правильные ответы на них.