play.cshtml 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. @using NEducation.Models;
  2. @using NEducation.Controllers;
  3. @model NEducation.Models.GrammarModel
  4. @{
  5. ViewBag.Title = "MiniGame";
  6. Layout = "~/Views/Shared/_LayoutMiniGame.cshtml";
  7. GrammarModel model = Session["model"] as GrammarModel;
  8. int questionIndex = model.currentQuestionIndex-1;
  9. }
  10. <style>
  11. .countdown-wrapper {
  12. display: flex;
  13. justify-content: center;
  14. }
  15. .countdown-circle {
  16. width: 50px;
  17. height: 50px;
  18. border-radius: 50%;
  19. background: conic-gradient(#E6871D 100%, transparent 0);
  20. display: flex;
  21. justify-content: center;
  22. align-items: center;
  23. position: relative;
  24. }
  25. .countdown-circle::before {
  26. content: '';
  27. width: 40px;
  28. height: 40px;
  29. border-radius: 50%;
  30. background-color: white;
  31. position: absolute;
  32. }
  33. #countdown {
  34. position: relative;
  35. font-size: 1em;
  36. font-weight: bold;
  37. z-index: 10;
  38. }
  39. .error-message, .summary-message {
  40. font-size: 1.5em;
  41. text-align: center;
  42. color: red;
  43. }
  44. </style>
  45. <div class="main minigame" id="open_play">
  46. <div class="fixed top-0 left-0 right-0 z-50 w-full overflow-x-hidden overflow-y-auto md:inset-0 h-screen max-h-full z-[99999] backdrop-filter-1">
  47. <div class="fixed z-[1] w-full blend-mode top-[5%] left-[40%]">
  48. <div class="countdown-wrapper">
  49. <div class="countdown-circle">
  50. <span id="countdown">@Model.remainTime</span>
  51. </div>
  52. </div>
  53. </div>
  54. <div class="minigame_content">
  55. <div>
  56. <!-- Hidden question container for storing question ID -->
  57. <div class="question-container" data-question-id="@Model.question.id" hidden></div>
  58. <div class="text-c-1 text-s-32 justify-center top-100 text-black-color">
  59. @if (Model.questions != null && Model.questions.Count > 0)
  60. {
  61. <text>@NEducation.Content.Texts.Lang.Question @(questionIndex)/@(Model.questions.Count): @NEducation.Content.Texts.Lang.ContentQuestions</text>
  62. }
  63. </div>
  64. @if (Model.questions != null && Model.questions.Count > 0)
  65. {
  66. <div class="pb-[10px]">
  67. <div class="text-c-2 w-full justify-center font-z-10 top-30 bottom-30 text-s-15 text-black-color">
  68. @Model.question.content
  69. </div>
  70. </div>
  71. <div class="answer-box">
  72. <button onclick="selectAnswer(this, '1')">
  73. @Model.question.answer1
  74. </button>
  75. </div>
  76. <div class="answer-box">
  77. <button onclick="selectAnswer(this, '2')">
  78. @Model.question.answer2
  79. </button>
  80. </div>
  81. <div class="answer-box">
  82. <button onclick="selectAnswer(this, '3')">
  83. @Model.question.answer3
  84. </button>
  85. </div>
  86. <div class="answer-box">
  87. <button onclick="selectAnswer(this, '4')">
  88. @Model.question.answer4
  89. </button>
  90. </div>
  91. }
  92. else
  93. {
  94. <div>Không có câu hỏi nào để hiển thị.</div>
  95. }
  96. <div class="flex justify-center items-center gap-[20px] top-50">
  97. <button onclick="submitAnswer()">
  98. <div class="btn-c-2">
  99. <div class="text-c-1 font-z-18 button-box" >
  100. @NEducation.Content.Texts.Lang.Confirm
  101. </div>
  102. </div>
  103. </button>
  104. </div>
  105. </div>
  106. </div>
  107. </div>
  108. </div>
  109. @*<script src="~/Content/assets/mini_game/js/minigame_main.js"></script>*@
  110. <script>
  111. var totalTime = @UtilsController.questionTimeout;
  112. let selectedAnswer = null;
  113. let questionIndex = @questionIndex;
  114. var countdownNumber = @Model.remainTime;
  115. const countdownElement = document.getElementById('countdown');
  116. const countdownCircle = document.querySelector('.countdown-circle');
  117. let countdownInterval;
  118. startCountdown();
  119. function selectAnswer(button, answer) {
  120. selectedAnswer = answer;
  121. const buttons = document.querySelectorAll('.answer-box button');
  122. buttons.forEach(btn => {
  123. btn.classList.remove('selected');
  124. });
  125. console.log("selectAnswer:" + answer);
  126. button.classList.add('selected');
  127. }
  128. function sendAnswersToServer(answerData) {
  129. console.log("Sending data:", JSON.stringify(answerData));
  130. $.ajax({
  131. url: '/MiniGame/SendAnswer',
  132. type: 'POST',
  133. contentType: 'application/json',
  134. data: JSON.stringify(answerData),
  135. success: function (result) {
  136. console.log("Server response:", result);
  137. if (result.error === "0") {
  138. if (result.finish === "1") {
  139. console.log("Game finished, redirecting to result page...");
  140. window.location.href = "/MiniGame/Result?check=1";
  141. } else if (result.question) {
  142. console.log("Loading next question...");
  143. location.reload();
  144. startCountdown();
  145. updateQuestionUI(result.question);
  146. }
  147. } else if (result.error === "1" || result.error === "2") {
  148. console.log("Error occurred, redirecting to result page...");
  149. window.location.href = "/MiniGame/Result?check=0";
  150. }
  151. },
  152. error: function (xhr, status, error) {
  153. console.error("AJAX request failed:", status, error);
  154. $('#open_play').html('<p>Error loading Play.</p>');
  155. }
  156. });
  157. }
  158. function updateQuestionUI(newQuestion) {
  159. document.querySelector('.text-c-2').textContent = newQuestion.content;
  160. document.querySelector('.question-container').setAttribute('data-question-id', newQuestion.id);
  161. const buttons = document.querySelectorAll('.answer-box button');
  162. buttons.forEach((btn, index) => {
  163. btn.textContent = newQuestion[`answer${index + 1}`];
  164. btn.onclick = () => selectAnswer(btn, index + 1);
  165. });
  166. selectedAnswer = null;
  167. countdownNumber = totalTime; // Reset the countdown for the new question
  168. startCountdown();
  169. }
  170. function stopGame(message) {
  171. clearInterval(countdownInterval);
  172. //document.querySelector('.minigame_content').innerHTML = `<div class="error-message">${message}</div>`;
  173. }
  174. function showSummary() {
  175. clearInterval(countdownInterval);
  176. document.querySelector('.minigame_content').innerHTML = '<div class="summary-message">Congratulations! You have completed 20 questions.</div>';
  177. }
  178. function startCountdown() {
  179. if (countdownNumber <= 0) {
  180. let questionId = document.querySelector('.question-container').getAttribute('data-question-id');
  181. let answerData = {
  182. QUESTION_ID: questionId,
  183. ANSWER: selectedAnswer
  184. };
  185. sendAnswersToServer(answerData);
  186. } else {
  187. countdownInterval = setInterval(() => {
  188. countdownNumber--;
  189. console.log("countdownNumber:" + countdownNumber);
  190. if (countdownNumber <= 0) {
  191. countdownNumber = 0; // Ensure it doesn't go below 0
  192. clearInterval(countdownInterval);
  193. let questionId = document.querySelector('.question-container').getAttribute('data-question-id');
  194. let answerData = {
  195. QUESTION_ID: questionId,
  196. ANSWER: selectedAnswer
  197. };
  198. console.log("countdownNumber <= 0:" + countdownNumber);
  199. sendAnswersToServer(answerData);
  200. }
  201. countdownElement.textContent = countdownNumber;
  202. countdownCircle.style.background = `conic-gradient(#E6871D ${360 - ((totalTime - countdownNumber) / totalTime) * 360}deg, lightgray 0)`;
  203. }, 1000);
  204. }
  205. }
  206. function submitAnswer() {
  207. if (selectedAnswer) {
  208. let questionId = document.querySelector('.question-container').getAttribute('data-question-id');
  209. console.log("selectedAnswer:" + selectedAnswer);
  210. let answerData = {
  211. QUESTION_ID: questionId,
  212. ANSWER: selectedAnswer
  213. };
  214. console.log("answerData:" + answerData);
  215. sendAnswersToServer(answerData);
  216. //answerList.push(answerData);
  217. } else {
  218. alert("Please select an answer before submitting!");
  219. }
  220. }
  221. </script>