<%- include('../static/start.ejs') %> <style> .dropzone { background-color: #bfe4ff; border: dashed 4px transparent; border-radius: 4px; /* margin: 10px auto 10px; */ /* padding: 10px; */ padding: 5px; width: 50vw; min-height: 50px; transition: background-color 0.3s; } .drop-active { border-color: #aaa; } .drop-target { background-color: #29e; border-color: #fff; border-style: solid; } .drag-drop { /* display: inline-block; */ min-width: 40px; /* height: 15px; */ padding: 5px; /* padding: 2em 0.5em; */ /* margin: 1rem 0 0 1rem; */ color: #fff; background-color: #29e; border: solid 2px #fff; touch-action: none; transform: translate(0px, 0px); transition: background-color 0.3s; } .drag-drop.can-drop { color: #000; background-color: #4e4; } .code_vars li{ /* display: inline-table; */ width: max-content; max-width: 280px; } </style> <% task = 'Известна масса каждого из 12 предметов. Определить общую массу всего набора предметов.'; code ="let mas = [12, 25.2, 125, 23.1, 16.3, 82, 2, 8, 64, 12.7, 72.1, 7]; /%"+ "let sum = 0; /%"+ "for(let i = 0; i < 12; i++) _% { /%"+ "sum += mas[i]; _% } /%"+ "return sum;" %> <%- include('../static/header.ejs') %> <section class="main"> <div class="main-top" style="display: flex;"> <div class="code_space" style="width: 100vw;"></div> <ul class="code_vars" style="border: 1px #29e solid;max-width: 300px; display: block;width: -webkit-fill-available;"></ul> </div> <div class="main-bottom" style="display: block;margin-top: 20px;"> <div class="task" style="margin-bottom: 20px;"><b>Задача: </b> <%= task %></div> <div style="display: flex; justify-content: space-around;"> <button class="check_btn" onclick="check_task()">проверить</button> </div> </div> </section> <script> // function get_lvl(callback){ // fetch("/lvls/<%=theme%>/<%=lvl%>.txt") // .then((response) => { // return response.text(); // }) // .then((data) => { // callback(data); // }) // } function check_next() { $.post("/check/<%= theme %>/<%= lvl %>") .done(function( res ) { console.log(res["body"]); if(res["body"] == true){ if("<%=lvl%>" != 5){ let next_btn = document.createElement("button") next_btn.setAttribute("onclick",`goto('/<%= theme %>/<%= parseInt(lvl)+1 %>')`); next_btn.innerText = "следующий уровень"; document.getElementsByClassName("header_btn3")[0].appendChild(next_btn); } } }) } check_next() let answer = {}; let code = []; show_task(); function show_task() { code = "<%-code%>".split("/%"); Object.entries(code).forEach(([key,value]) => { code[key] = value.replace("_%","\n"); }); let arr = []; Object.entries(code).forEach(([key,value]) => { // console.log(key,value); let new_obj = document.createElement("li"); new_obj.id = `ans-${key}`; new_obj.classList.add("drag-drop"); new_obj.classList.add("drag"); new_obj.innerText = value; let ask_obj = document.createElement("div"); ask_obj.id = `ask-${key}`; ask_obj.classList.add(`dropzone`); arr.push(new_obj); console.log(arr); // document.getElementsByClassName("code_vars")[0].appendChild(new_obj); document.getElementsByClassName("code_space")[0].appendChild(ask_obj); answer[key] = null }); Object.entries(shuffle_array(arr)).forEach(([key,value]) => { document.getElementsByClassName("code_vars")[0].appendChild(value); }); } function shuffle_array(array) { var currentIndex = array.length, temporaryValue, randomIndex; while (0 !== currentIndex) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } interact('.main').dropzone({ overlap: 0.75, ondrop: function (event) { var drag = event.relatedTarget; var zone = event.target; if(drag.parentNode.id.split("-").at(-1) != ""){ answer[drag.parentNode.id.split("-").at(-1)] = null } document.getElementsByClassName("code_vars")[0].appendChild(drag) setpos(0,0,drag); } }) function check_task() { if(!Object.values(answer).includes(null)){ let grade = 0; Object.entries(answer).forEach(([key,value]) => { if (value != null && value != "") { document.getElementById(`ans-${value}`).classList.remove("drag"); if(key == value){ // document.getElementById(`ask-${key}`).style.backgroundColor = "green"; grade++; document.getElementById(`ans-${value}`).style.backgroundColor = "green"; }else{ // document.getElementById(`ask-${key}`).style.backgroundColor = "red"; document.getElementById(`ans-${value}`).style.backgroundColor = "red"; } } }); setTimeout(()=>{ if (grade == code.length) { alert("Поздравляю вы прошли уровень"); console.log({theme:"<%= theme %>",lvl:"<%= lvl %>"}); $.post("/finish/<%= theme %>/<%= lvl %>") .done(function( res ) { document.getElementsByClassName("check_btn")[0].setAttribute("onclick","") if("<%=lvl%>" != 5){ let next_btn = document.createElement("button") next_btn.setAttribute("onclick",`goto('/<%= theme %>/<%= parseInt(lvl)+1 %>')`); next_btn.innerText = "следующий уровень"; document.getElementsByClassName("header_btn3")[0].innerHTML = ""; document.getElementsByClassName("header_btn3")[0].appendChild(next_btn); let restart_btn = document.createElement("button") restart_btn.setAttribute("onclick","goto('')"); restart_btn.innerText = "перезапустить"; document.getElementsByClassName("header_btn2")[0].innerHTML = ""; document.getElementsByClassName("header_btn2")[0].appendChild(restart_btn); } else{ alert("Поздравляю вы прошли всю тему <%=theme_name%>"); } }) } else{ alert("Вы не правильно выполнили задание"); let restart_btn = document.createElement("button") restart_btn.setAttribute("onclick","goto('')"); restart_btn.innerText = "перезапустить"; document.getElementsByClassName("header_btn2")[0].innerHTML = ""; document.getElementsByClassName("header_btn2")[0].appendChild(restart_btn); } },700) } else{ alert("Сначала расставьте все строки") } } interact('.dropzone').dropzone({ overlap: 0.75, ondropactivate: function (event) { // add active dropzone feedback event.target.classList.add('drop-active') }, ondragenter: function (event) { var drag = event.relatedTarget var zone = event.target // feedback the possibility of a drop zone.classList.add('drop-target') }, ondragleave: function (event) { var drag = event.relatedTarget; var zone = event.target; // remove the drop feedback style // event.relatedTarget.classList.remove('can-drop') event.target.classList.remove('drop-target') // if(answer[zone.id.split("-").at(-1)] == drag.id.split("-").at(-1)){ // answer[zone.id.split("-").at(-1)] = null // } }, ondrop: function (event) { var drag = event.relatedTarget; var zone = event.target; if (zone.children.length == 0) { zone.appendChild(drag) answer[zone.id.split("-").at(-1)] = drag.id.split("-").at(-1); setpos(0,0,drag); } else{ let child = zone.childNodes[0]; let parent = drag.parentNode; if(zone.id.split("-").at(-1) != ""){ answer[zone.id.split("-").at(-1)] = drag.id.split("-").at(-1); } if(parent.id.split("-").at(-1) != ""){ answer[parent.id.split("-").at(-1)] = child.id.split("-").at(-1); } parent.appendChild(child) zone.appendChild(drag) setpos(0,0,child); setpos(0,0,drag); } console.log(answer); }, ondropdeactivate: function (event) { event.target.classList.remove('drop-active') event.target.classList.remove('drop-target') } }) function dragMoveListener (event) { var target = event.target var x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx var y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy setpos(x,y,target); } function setpos(x,y,obj) { obj.style.transform = 'translate(' + x + 'px, ' + y + 'px)' obj.setAttribute('data-x', x) obj.setAttribute('data-y', y) } // this function is used later in the resizing and gesture demos window.dragMoveListener = dragMoveListener interact('.drag') .draggable({ inertia: true, modifiers: [ interact.modifiers.restrictRect({ // restriction: 'parent', endOnly: true }) ], autoScroll: false, // dragMoveListener from the dragging demo above listeners: { move: dragMoveListener } }) </script> <%- include('../static/end.ejs') %>