var canvasT = document.getElementById('canvasTotal'); var ctxT = canvasT.getContext('2d'); var canvasO = document.getElementById('canvasObj'); var ctxO = canvasO.getContext('2d'); var canvasR = document.getElementById('canvasR'); //var ctxR = canvasR.getContext('2d'); tab1=[]; tab2=[]; tab3=[]; tab4=[]; tabR=[[],[],[],[],[]]; tabR1=[]; tabR2=[]; tabR3=[]; tabR4=[]; points=0; tabTotal=[]; tabObjCmp=[]; mousePos=[]; var displayType = getCookie("displayMode")=="" ? "both" : getCookie("displayMode"); var dotsAmount= getCookie("dotsAmount")=="" ? 4 : getCookie("dotsAmount"); var colors=[]; var colorsAvailable=["red","yellow","green","purple","lightblue","brown","cyan","orange"]; for(var cpt=0;cpt-1) { colors.push(colorsAvailable[pos]); colorsAvailable.splice(index,1); } } size=screen.height/6; // 6 lignes de 50px // 6 colonnes de 50px canvasT.width=size; canvasO.width=size; canvasT.height=size; canvasO.height=size; for(var a=1;a<5;a++) { eval("var canvas"+ a +"= document.getElementById('canvas"+a+"')"); eval("var ctx"+a+" = canvas"+a+".getContext('2d')"); eval("canvas"+a+".width=size"); eval("canvas"+a+".height=size"); eval("var canvasR"+ a +"= document.getElementById('canvasR"+a+"')"); eval("var ctxR"+a+" = canvasR"+a+".getContext('2d')"); eval("canvasR"+a+".width=size"); eval("canvasR"+a+".height=size"); } function faireCercle(x,y,color,lectx){ var cercle = new Path2D(); nx=(size/6)*(x>0 ? x+2 : x+3); ny=(size/6)*(y>0 ? y+2 : y+3); cercle.moveTo(nx, ny); cercle.arc(nx+(size/12), ny+(size/12), (size/12), 0, 2 * Math.PI); lectx.fillStyle = color; lectx.fill(cercle); } function drawImg(x,y,color,lectx) { var img= new Image(); var nx=(size/6)*(x>0 ? x+2 : x+3); var ny=(size/6)*(y>0 ? y+2 : y+3); img.src="ress/"+color+".png"; img.onload = function(){ lectx.drawImage(img,nx,ny,size/6,size/6); } } function genVitraux() { var mat = matrix(6,6); var x; var y; var baseVitrail=[true]; var tries; for(var cpt=0;cpt"+cpt); tries++; } if(tries==20) console.log("trop long"); mat[x][y]=1; x-=2; y-=2; baseVitrail.push([(x>0 ? x : x-1),(y>0 ? y : y-1),colors[cpt]]); console.log("mat = "+mat); tries=0; } //console.log("final : "+baseVitrail+" et :"+Array.isArray(baseVitrail)); for(var i=1;i<5;i++) { eval("tab"+i+"=copyMDArray(baseVitrail)"); } } function tourneG(letab,lecanvas,lectx) { letab.forEach(element => { tmp=element[0]; element[0]=element[1]; element[1]=-tmp; }); toutDessiner(letab,lecanvas,lectx); empiler(); } function tourneD(letab,lecanvas,lectx,sselem=null) { if(sselem==null){ letab.forEach(element => { tmp=element[1]; element[1]=element[0]; element[0]=-tmp; }); } else { letab[sselem].forEach(element => { tmp=element[1]; element[1]=element[0]; element[0]=-tmp; }); } //console.log("pre-empiler :"+tabTotal); empiler(sselem!=null); //console.log("post-empiler :"+tabTotal); if(sselem==null) toutDessiner(letab,lecanvas,lectx); } function toutDessiner(pts,lecanvas,lectx) { lectx.clearRect(0, 0, lecanvas.width, lecanvas.height); if(pts[0]) { var i=1*(typeof pts[0]==="boolean"); for(i;i val.toString() != test.toString(); var exists=false; if(!obj) { tabTotal=[]; if(tab1[0]) { tab1.forEach(element => { if(Array.isArray(element)) { tabTotal.push(element); } }) } if(tab2[0]){ tab2.forEach(element => { if(Array.isArray(element)) { colors.forEach(col => { test=[element[0],element[1],col]; if(!exists) exists=!tabTotal.every(unique); }) if(!exists) tabTotal.push(element); exists=false; } }) } if(tab3[0]) { tab3.forEach(element => { if(Array.isArray(element)){ colors.forEach(col => { test=[element[0],element[1],col]; if(!exists) exists=!tabTotal.every(unique); }) if(!exists) tabTotal.push(element); exists=false; } }) } if(tab4[0]){ tab4.forEach(element => { if(Array.isArray(element)) { colors.forEach(col => { test=[element[0],element[1],col]; if(!exists) exists=!tabTotal.every(unique); }) if(!exists) tabTotal.push(element); exists=false; } }) } checkAllOK(); toutDessiner(tabTotal,canvasT,ctxT); } else{ tabObjCmp=[]; for(count=1;count { test=[element[0],element[1],col]; if(!exists) exists=!tabObjCmp.every(unique); }) if(!exists) tabObjCmp.push(element); exists=false; } } } } function swap(letab, lecanvas, lectx,ladir){ if(ladir=="H"){ letab.forEach(element=> { element[1]=-element[1]; }) } else { letab.forEach(element=> { element[0]=-element[0]; }) } if(lecanvas!=null) { toutDessiner(letab,lecanvas,lectx); empiler(); } } function getRandomInt(max) { //rng entier [1;max] return Math.floor(Math.random() * Math.floor(max))+1; } function copyMDArray(array) //permet la copie d'arrays sans copier les références { var newArray = []; array.forEach(element => { newArray.push(Array.from(element)) }); return newArray } function generate(){ tabObj=[copyMDArray(tab1),copyMDArray(tab2),copyMDArray(tab3),copyMDArray(tab4)]; tabObjCmp=[]; var actions=getRandomInt(4)+1; var swapTreshold=11; var switchTreshold=11; if(difficulty=="med") //70% tournerD, 30% swap { actions+=getRandomInt(3)+3; swapTreshold=8; } if(difficulty=="hard") //50% tournerD, 30% swap, 20% switch { actions+=getRandomInt(5)+5; swapTreshold=6; switchTreshold=9; } console.log("actions : "+actions+" difficulty="+difficulty); while(actions>0){ if(difficulty!="easy") act=getRandomInt(10); else act=1; console.log("act="+act+" left:"+actions); if(switchTreshold<=act && actions>3) // faire un switch { var from=getRandomInt(4)-1; var to=getRandomInt(4)-1; while(from==to) to=getRandomInt(4)-1; [tabObj[from],tabObj[to]]=[tabObj[to],tabObj[from]]; console.log("switch "+from+"->"+to); actions-=3; } else if(swapTreshold<=act && actions>2) { var from=getRandomInt(4)-1; var dir=getRandomInt(2)==1 ? "H":"V"; swap(tabObj[from],null,ctxO,dir); console.log("swap"+dir+" de "+from); actions-=2; } else { tourneD(tabObj,canvasO,ctxO,getRandomInt(4)-1); actions-=1; } } empiler(true); toutDessiner(tabObjCmp,canvasO,ctxO); } function getMousePosition(lecanvas, event, lectx, letab) { let rect = lecanvas.getBoundingClientRect(); let x = event.clientX - rect.left; let y = event.clientY - rect.top; let dir = compas(x,y,lecanvas); if(xy; se = x>lecanvas.height-y; if(ne && se ) return "E"; if(ne && !se ) return "N"; if(!ne && se ) return "S"; if(!ne && !se ) return "O"; } function rotationManager(e) { var mouseOnRes = mousePos[0].match(/[R]/g)!=null; canvasNumber=e.currentTarget.id.substring(6); document.getElementById("canvas"+mousePos[0]).classList.remove('vitrail-select'); console.log(mousePos[0]+" vers "+canvasNumber+", mouseOnRes?"+mouseOnRes); var firstAv=1; for(i=1;i<4;i++) //détermine la 1° place libre dans la réserve { if(typeof tabR[i][0]=="boolean") firstAv++; else break; } if(mouseOnRes && !canvasNumber.includes("R")) //clic dans la réserve, relâche sur la pile en jeu { if(!isVisible(canvasNumber)) //relâche sur emplacement vide au centre { toggleVisible(canvasNumber); tabR[canvasNumber]=[]; console.log("contenu du tabR[cn] : "+tabR[canvasNumber]); toggleVisible(mousePos[0].substring(1),true); } } else { if(isVisible(mousePos[0])) //clic sur un vitrail présent { if(canvasNumber.includes("R")) //relâche dans réserve { if(tabR[canvasNumber]==null) //emplacement de réserve vide { toggleVisible(mousePos[0]); //inverser tag du canvas du centre tabR[firstAv]=copyMDArray(eval("tab"+mousePos[0])); //mettre le canvas dans la réserve tabR[firstAv][0]=eval("tab"+mousePos[0]+"[0]"); //transférer le tag du canvas dans la réserve toggleVisible(firstAv,true); //inverser tag du canvas de réesrve toutDessiner(tabR[firstAv],eval("canvasR"+firstAv),eval("ctxR"+firstAv)); //afficher canvas dans réserve //console.log(eval("tabR["+(mousePos[0]-1)+"]")); } else //emplacement de réserve occupé { changeOrder(mousePos[0],canvasNumber); } } else { lecanvas=eval("canvas"+canvasNumber); letab=eval("tab"+canvasNumber); lectx=lecanvas.getContext('2d'); dir = compas(e.clientX,e.clientY,e.currentTarget); if(mousePos[0]==canvasNumber) { if((mousePos[1]=="N" && dir == "O") || (mousePos[1]=="S" && dir == "E") || (mousePos[1]=="O" && dir == "S") || (mousePos[1]=="E" && dir == "N")) { tourneG(letab,lecanvas,lectx); } else if((mousePos[1] == "N" && dir == "E") || (mousePos[1] == "S" && dir == "O") || (mousePos[1] == "E" && dir == "S") || (mousePos[1] == "O" && dir == "N")) { tourneD(letab,lecanvas,lectx); } else if ((mousePos[1] == "E" && dir == "O") || (mousePos[1] == "O" && dir == "E")) { swap(letab,lecanvas,lectx,"V"); } else if ((mousePos[1] == "N" && dir == "S") || (mousePos[1] == "S" && dir == "N")) { swap(letab,lecanvas,lectx,"H"); } } else { changeOrder(mousePos[0],canvasNumber); } } } } } function checkAllOK(){ //const condition = (val) => val.toString() == element.toString(); var exists=true; //exists=!tabObjCmp.every(unique); if(tabTotal.length==tabObjCmp.length) { var verifTab=[]; verifTab=copyMDArray(tabTotal); for(i=0;i point.toString()==tabObjCmp[i].toString()); exists*=result.length; } } else { exists=false; } if(exists) { var audio = new Audio('ress/Jewel4.mp3'); audio.play(); handleScore(1); generate(); } } function handleScore(modif) { points+=modif; document.getElementById("stats").innerHTML = points+" points"; if(objPts!=null && points==objPts) { chronoStop(); var pts = diff.getSeconds()+ (diff.getMinutes()*60) + ((diff.getHours()-1)*3600); //console.log("./score.php?pts="+pts+"&mode="+get['mode']+"&diff="+get['diff']+"&pseudo="+get['pseudo']); window.location.replace("./score.php?pts="+pts+"&mode="+get['mode']+"&diff="+get['diff']+"&pseudo="+get['pseudo']); } else if(get['mode']=="surv") { addTime(30); } } function changeOrder(from, to) { if(from.includes("R")) fromTab=tabR[from]; else fromTab=eval("tab"+from); if(to.includes("R")) toTab=tabR[to]; else toTab=eval("tab"+to); for(i=0;i