private void SetChoices() { foreach (ChoiceBlock choiceInstance in _choiceBlocks) { choiceInstance.Button.gameObject.SetActive(false); choiceInstance.Button.onClick.RemoveAllListeners(); } IReadOnlyList <DialogueNode> playerChildren = _conversationHandler.GetPlayerChildren(); for (int i = 0; i < playerChildren.Count; i++) { if (playerChildren[i] != null) { if (!_choiceBlocks[i].Text) { AddChoice(); } ChoiceBlock choiceInstance = _choiceBlocks[i]; choiceInstance.Text.text = playerChildren[i].Text; int index = i; choiceInstance.Button.onClick.AddListener(delegate { SelectChoice(index); }); choiceInstance.Button.gameObject.SetActive(true); _choiceBlocks[i] = choiceInstance; } } }
private MistakesCount GetChoiceBlockMistakesCount(ChoiceBlock choiceBlock, List <QuizInfoForDb> ans) { var checkedUnnecessary = ans.Count(x => !x.IsRightAnswer); var totallyTrueItemIds = choiceBlock.Items.Where(x => x.IsCorrect == ChoiceItemCorrectness.True).Select(x => x.Id); var userItemIds = ans.Select(y => y.ItemId).ToImmutableHashSet(); var notCheckedNecessary = totallyTrueItemIds.Count(x => !userItemIds.Contains(x)); return(new MistakesCount(checkedUnnecessary, notCheckedNecessary)); }
private void AddChoice() { GameObject choiceGameObject = Instantiate(_choicePrefab, _playerResponseBlock.transform); ChoiceBlock choiceInstance = new ChoiceBlock { Text = choiceGameObject.GetComponentInChildren <TextMeshProUGUI>(), Button = choiceGameObject.GetComponent <Button>() }; _choiceBlocks.Add(choiceInstance); }
private IEnumerable <QuizInfoForDb> CreateQuizInfoForDb(ChoiceBlock choiceBlock, IGrouping <string, QuizAnswer> answers) { int blockScore; if (!choiceBlock.Multiple) { var answerItemId = answers.First().ItemId; var isTrue = choiceBlock.Items.First(x => x.Id == answerItemId).IsCorrect; blockScore = isTrue ? choiceBlock.MaxScore : 0; return(new List <QuizInfoForDb> { new QuizInfoForDb { QuizId = choiceBlock.Id, ItemId = answerItemId, IsRightAnswer = isTrue, Text = null, QuizType = typeof(ChoiceBlock), QuizBlockScore = blockScore, QuizBlockMaxScore = choiceBlock.MaxScore } }); } var ans = answers.Select(x => x.ItemId).ToList() .Select(x => new QuizInfoForDb { QuizId = choiceBlock.Id, IsRightAnswer = choiceBlock.Items.Where(y => y.IsCorrect).Any(y => y.Id == x), ItemId = x, Text = null, QuizType = typeof(ChoiceBlock), QuizBlockScore = 0, QuizBlockMaxScore = choiceBlock.MaxScore }).ToList(); var isRightQuizBlock = ans.All(x => x.IsRightAnswer) && choiceBlock.Items.Where(x => x.IsCorrect) .Select(x => x.Id) .All(x => ans.Where(y => y.IsRightAnswer).Select(y => y.ItemId).Contains(x)); blockScore = isRightQuizBlock ? choiceBlock.MaxScore : 0; foreach (var info in ans) { info.QuizBlockScore = blockScore; } return(ans); }
private IEnumerable <QuizInfoForDb> CreateQuizInfoForDb(ChoiceBlock choiceBlock, IGrouping <string, QuizAnswer> answers) { int blockScore; if (!choiceBlock.Multiple) { var answerItemId = answers.First().ItemId; var isCorrect = choiceBlock.Items.First(x => x.Id == answerItemId).IsCorrect.IsTrueOrMaybe(); blockScore = isCorrect ? choiceBlock.MaxScore : 0; return(new List <QuizInfoForDb> { new QuizInfoForDb { BlockId = choiceBlock.Id, ItemId = answerItemId, IsRightAnswer = isCorrect, Text = null, BlockType = typeof(ChoiceBlock), QuizBlockScore = blockScore, QuizBlockMaxScore = choiceBlock.MaxScore } }); } var ans = answers.Select(x => x.ItemId).ToList() .Select(x => new QuizInfoForDb { BlockId = choiceBlock.Id, IsRightAnswer = choiceBlock.Items.Where(y => y.IsCorrect.IsTrueOrMaybe()).Any(y => y.Id == x), ItemId = x, Text = null, BlockType = typeof(ChoiceBlock), QuizBlockScore = 0, QuizBlockMaxScore = choiceBlock.MaxScore }).ToList(); var mistakesCount = GetChoiceBlockMistakesCount(choiceBlock, ans); var isRightQuizBlock = mistakesCount.HasNotMoreThatAllowed(choiceBlock.AllowedMistakesCount); blockScore = isRightQuizBlock ? choiceBlock.MaxScore : 0; foreach (var info in ans) { info.QuizBlockScore = blockScore; } return(ans); }
private static QuizAnswerInfo GetChoiceBlockAnswerInfo(IReadOnlyDictionary <string, List <UserQuiz> > answers, ChoiceBlock block, int questionIndex) { IEnumerable <UserQuiz> answer = new List <UserQuiz>(); if (answers.ContainsKey(block.Id)) { answer = answers[block.Id].Where(q => q.ItemId != null); } var ans = new SortedDictionary <string, bool>(); foreach (var item in block.Items) { ans[item.Id] = false; } var isRight = false; var score = 0; var maxScore = 0; foreach (var quizItem in answer.Where(quizItem => ans.ContainsKey(quizItem.ItemId))) { isRight = quizItem.IsQuizBlockScoredMaximum; ans[quizItem.ItemId] = true; score = quizItem.QuizBlockScore; maxScore = quizItem.QuizBlockMaxScore; } return(new ChoiceBlockAnswerInfo { AnswersId = ans, Id = questionIndex.ToString(), RealyRightAnswer = new HashSet <string>(block.Items.Where(x => x.IsCorrect.IsTrueOrMaybe()).Select(x => x.Id)), Score = score, MaxScore = maxScore, IsRight = isRight }); }
public static System.Web.WebPages.HelperResult QuizBlock(ChoiceBlock block, BlockRenderContext context) { return(new System.Web.WebPages.HelperResult(__razor_helper_writer => { var items = block.ShuffledItems(); var isMultiply = block.Multiple; var typeInp = isMultiply ? "checkbox" : "radio"; QuizBlockData model = context.GetBlockData(block) ?? new QuizBlockData(new QuizModel(), 1, QuizState.NotPassed); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t<div class=\"quiz-block-mark "); WebViewPage.WriteTo(@__razor_helper_writer, typeInp); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\" id=\'"); WebViewPage.WriteTo(@__razor_helper_writer, block.Id + "_quizBlock"); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\'>\r\n"); for (var itemIndex = 0; itemIndex < items.Length; itemIndex++) { var item = items[itemIndex]; var id = isMultiply ? itemIndex + "noMult" : model.BlockIndex.ToString(); var itemChecked = model.QuizState != QuizState.NotPassed && model.QuizModel.AnswersToQuizes[block.Id].Contains(item.Id); var ans = itemChecked ? "checked" : ""; var itemClass = ""; var title = ""; if (model.QuizState == QuizState.Total) { itemClass = item.IsCorrect ? "right-quiz" : itemChecked ? "wrong-quiz" : ""; title = (item.IsCorrect ? "Правильный" : "Неправильный") + " вариант"; } WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t\t\t<div class=\"quiz\">\r\n\t\t\t\t<label class=\""); WebViewPage.WriteTo(@__razor_helper_writer, itemClass); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\" title=\""); WebViewPage.WriteTo(@__razor_helper_writer, title); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\" "); WebViewPage.WriteTo(@__razor_helper_writer, GetGuestOnclick(context.IsGuest)); WebViewPage.WriteLiteralTo(@__razor_helper_writer, ">\r\n\t\t\t\t\t<input "); WebViewPage.WriteTo(@__razor_helper_writer, ans); WebViewPage.WriteLiteralTo(@__razor_helper_writer, " autocomplete=\"off\" id=\'"); WebViewPage.WriteTo(@__razor_helper_writer, block.Id + "quizBlock" + item.Id); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\' name="); WebViewPage.WriteTo(@__razor_helper_writer, "group" + id); WebViewPage.WriteLiteralTo(@__razor_helper_writer, " type=\""); WebViewPage.WriteTo(@__razor_helper_writer, typeInp); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\" "); WebViewPage.WriteTo(@__razor_helper_writer, GetGuestDisable(context.IsGuest)); WebViewPage.WriteLiteralTo(@__razor_helper_writer, ">\r\n\t\t\t\t\t"); WebViewPage.WriteTo(@__razor_helper_writer, item.Description.RenderTex()); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\r\n\t\t\t\t</label>\r\n"); if (model.QuizState == QuizState.Total && item.IsCorrect) { WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t\t\t\t\t<i class=\"glyphicon glyphicon-ok\" style=\"color: green\" title=\""); WebViewPage.WriteTo(@__razor_helper_writer, title); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\"></i>\r\n"); } if (model.QuizState == QuizState.Total && !string.IsNullOrEmpty(item.Explanation)) { WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t\t\t\t\t<p class=\"text-muted\">"); WebViewPage.WriteTo(@__razor_helper_writer, item.Explanation); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "</p>\r\n"); } WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t\t\t</div>\r\n"); } WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t</div>\r\n"); })); }