diff --git a/Script.js b/Script.js index cf326e0..ece390f 100644 --- a/Script.js +++ b/Script.js @@ -1,284 +1,403 @@ -document.addEventListener("DOMContentLoaded",main,false); - -const MAX_WIDTH = 1000; -const MAX_HEIGHT = 500; -const PIXEL_DIM = 20; -const MAX_X = MAX_WIDTH/PIXEL_DIM; -const MAX_Y = MAX_HEIGHT/PIXEL_DIM; -const SCOLOR = "yellow"; -const FCOLOR = "red"; -const UCOLOR = "white"; -const GAMETICK = 100; -const EzMode = true; -const EzLevel = 2; -const SuperProb = 10; - -const percorsiTesta=["./Images/Testa_Up.png","./Images/Testa_Right.png","./Images/Testa_Down.png","./Images/Testa_Left.png"]; -const percorsiCorpo=["./Images/Corpo_Up.png","./Images/Corpo_Right.png","./Images/Corpo_Down.png","./Images/Corpo_Left.png"]; -const percorsiCoda=["./Images/Coda_Up.png","./Images/Coda_Right.png","./Images/Coda_Down.png","./Images/Coda_Left.png"]; -const percorsiS = [percorsiTesta,percorsiCorpo,percorsiCoda]; -let immaginiFinali = []; - -for(let j = 0;j<4;j++){ - let immagini = []; - if( j == 3){ - let timg = new Image; - timg.src = "./Images/Cibo.png"; - let simg = new Image; - simg.src = "./Images/Super_Cibo.png" - immagini.push(timg); - immagini.push(simg); - }else{ - for(let i = 0;i<4;i++){ - let timg = new Image; - timg.src = percorsiS[j][i]; - immagini.push(timg); - } - } - immaginiFinali.push(immagini); -} -/* -for(let i = 0;i<4;i++){ - for(let j = 0;j per la posizione - -let direz; -let pos; -let dim = 3; -let ris=null; -let generato; -let posF; -let maxP=0; -let superFood=false; - -function getObj(id){ - return document.getElementById(id); -} - -function main(){ - getObj("start").addEventListener("click",game); - document.addEventListener("keydown",(a) => { - if(ris==null) return - let b = a.code; - let deltax = pos[pos.length -1][0] - pos[pos.length-2][0]; - let deltay = pos[pos.length -1][0] - pos[pos.length-2][0]; - switch(b){ - case "KeyW": - case "ArrowUp": - if(deltax == 0 && deltay == 0){ - return; - }else if(direz[1] != 1){ - direz = [0,-1]; - } - break; - case "KeyS": - case "ArrowDown": - if(deltax == 0 && deltay == 0){ - return; - }else if(direz[1] != -1){ - direz = [0,1]; - } - break - case "KeyA": - case "ArrowLeft": - if(deltax == 1 && deltay == 1){ - return; - } - if(direz[0] != 1){ - direz = [-1,0]; - } - break; - case "KeyD": - case "ArrowRight": - if(deltax == -1 && deltay == -1){ - return; - }else if(direz[0] != -1){ - direz = [1,0]; - } - break; - } - }) - putPunteggio("Sc",0); - pulisciCampo(getObj("campoGioco").getContext("2d")); -} - -function game(){ - if(ris!=null){ - return; - } - let campo = getObj("campoGioco"); - campo = campo.getContext("2d"); - direz = [1,0]; - pos = [[10,10]]; - dim = 3; - generato=false; - ris = setInterval(() => { - if(!generato){ - posF = spawnFood(campo,pos); - //console.log(posF[0]); - generato = true; - } - - let index = dim -1 > pos.length-1 ? pos.length-1 : dim-1; - - let nuovaPos = [pos[index][0] + direz[0],pos[index][1] + direz[1]]; - pos.push(nuovaPos); // aggiornamento posizione testa la pos è una lista invertita, l'ultima posizione è la testa - //console.log(pos) // posvecchia posnuova - - dim = checkFood(pos,posF,generato); - - pos = clearPath(campo,dim,pos); //tolgo la pos vecchia - - if(checkCollisioni(pos)){ - stopGame(campo); - return; - } - - //console.log(dim); - - disegnaQuadrati(campo,pos,SCOLOR,"s"); // solo qua aggiorno lo screen - putPunteggio("Sc",dim-3); - - },GAMETICK); -} - -function putPunteggio(id,curr){ - let obj = getObj(id); - let tex = `Corrente: ${curr} Massimo: ${maxP}`; - obj.innerText=tex; -} - -function checkFood(pos,posFood){ - if(pos[pos.length-1][0] == posFood[0][0] && pos[pos.length-1][1] == posFood[0][1]){ - generato = false; - } - let delta = 1; - if(superFood){ - delta = 5 - } - return (generato ? dim:dim+delta); -} - -function checkCollisioni(pos){ - if(pos[pos.length-1][0] < 0 || pos[pos.length-1][0] >= MAX_X){ - return true; - }else if(pos[pos.length-1][1] < 0 || pos[pos.length-1][1] >= MAX_Y){ - return true; - }else if(pos.length>1){ - let max = pos.length-1 - for(let i = 0;i=0;x--){ - disegnaQuadrati(c,[posSnake[x]],UCOLOR); - posSnake.splice(0,1); - //console.log(x); - } - return posSnake; -} - -function spawnFood(c,posSnake){ - let pos = generaPosRandom(); - //console.log("Generazione di un nuovo food"); - let conflitto = true; - while(conflitto){ - for(let x = 0;x MAX_X - EzLevel){ - pos = generaPosRandom(); - conflitto = true; - }else if(pos[0][1] < EzLevel || pos[0][1] > MAX_Y - EzLevel){ - pos = generaPosRandom(); - conflitto = true; - }else{ - //console.log(pos[0]); - conflitto = false; - } - } - } - let isSuper = random(0,SuperProb); - superFood = isSuper == SuperProb; - disegnaQuadrati(c,pos,FCOLOR,"c"); - return pos; -} - -function stopGame(c){ - clearInterval(ris); - pulisciCampo(c); - //alert("Hai perso"); - maxP= dim-3 > maxP ? dim-3:maxP; - putPunteggio("Sc",0); - ris=null -} - -function disegnaQuadrati(c,posizioni,color,id){ - c.fillStyle= id=="s"? UCOLOR : color; - for(let x = 0;x per la posizione + +let direz; +let pos; +let dim = 3; +let ris=null; +let generato; +let posF = []; +let maxP=0; +let superFood=false; +let festaActive = false; +let festaTimer = 0; +let tickCount = 0; +let scoreMultiplier = 1; +let isPaused = false; + +function getObj(id){ + return document.getElementById(id); +} + +function main(){ + getObj("start").addEventListener("click",game); + getObj("pause").addEventListener("click",togglePause); + document.addEventListener("keydown",(a) => { + if(ris==null) return + let b = a.code; + let deltax = pos[pos.length -1][0] - pos[pos.length-2][0]; + let deltay = pos[pos.length -1][0] - pos[pos.length-2][0]; + switch(b){ + case "KeyW": + case "ArrowUp": + if(deltax == 0 && deltay == 0){ + return; + }else if(direz[1] != 1){ + direz = [0,-1]; + } + break; + case "KeyS": + case "ArrowDown": + if(deltax == 0 && deltay == 0){ + return; + }else if(direz[1] != -1){ + direz = [0,1]; + } + break + case "KeyA": + case "ArrowLeft": + if(deltax == 1 && deltay == 1){ + return; + } + if(direz[0] != 1){ + direz = [-1,0]; + } + break; + case "KeyD": + case "ArrowRight": + if(deltax == -1 && deltay == -1){ + return; + }else if(direz[0] != -1){ + direz = [1,0]; + } + break; + case "Space": + togglePause(); + break; + } + }) + putPunteggio("Sc",0); + pulisciCampo(getObj("campoGioco").getContext("2d")); +} + +function game(){ + if(ris!=null){ + return; + } + getObj("pause").style.display = "inline-block"; + let campo = getObj("campoGioco"); + campo = campo.getContext("2d"); + direz = [1,0]; + pos = [[10,10]]; + dim = 3; + generato=false; + festaActive = false; + festaTimer = 0; + tickCount = 0; + scoreMultiplier = 1; + isPaused = false; + ris = setInterval(() => { + if(isPaused) return; + tickCount++; + + // controlla l'attivazione dell'evento festa + if(tickCount % FESTA_INTERVAL_TICKS === 0 && !festaActive){ + if(Math.random() < FESTA_CHANCE){ + festaActive = true; + festaTimer = FESTA_DURATION_TICKS; + scoreMultiplier = 2; + // Genera cibi aggiuntivi + for(let i = 0; i < 3; i++){ + let newFood = spawnFoodSingle(campo, pos); + posF.push(newFood[0]); + } + } + } + + // Gestisci il timer dell'evento + if(festaActive){ + festaTimer--; + if(festaTimer <= 0){ + festaActive = false; + scoreMultiplier = 1; + // Rimuovi i cibi extra, mantieni solo uno + while(posF.length > 1){ + let extraFood = posF.pop(); + disegnaQuadrati(campo, [extraFood], UCOLOR, ""); + } + } + } + + if(!generato){ + posF.push(spawnFood(campo,pos)[0]); + generato = true; + } + + let index = dim -1 > pos.length-1 ? pos.length-1 : dim-1; + + let nuovaPos = [pos[index][0] + direz[0],pos[index][1] + direz[1]]; + pos.push(nuovaPos); // aggiornamento posizione testa la pos è una lista invertita, l'ultima posizione è la testa + //console.log(pos) // posvecchia posnuova + + dim = checkFood(pos,posF,generato); + + pos = clearPath(campo,dim,pos); //tolgo la pos vecchia + + if(checkCollisioni(pos)){ + stopGame(campo); + return; + } + + //console.log(dim); + + disegnaQuadrati(campo,pos,SCOLOR,"s"); // solo qua aggiorno lo screen + + // Draw all foods + for(let food of posF){ + disegnaQuadrati(campo,[food],FCOLOR,"c"); + } + + putPunteggio("Sc",dim-3); + + // Update event message + let eventDiv = getObj("eventMessage"); + if(festaActive){ + let secondsLeft = Math.ceil(festaTimer * GAMETICK / 1000); + eventDiv.innerText = "Festa della frutta! Tempo: " + secondsLeft + "s"; + } else { + eventDiv.innerText = ""; + } + + },GAMETICK); +} + +function putPunteggio(id,curr){ + let obj = getObj(id); + let tex = `Corrente: ${curr} Massimo: ${maxP}`; + obj.innerText=tex; +} + +function checkFood(pos,posFood){ + let eaten = false; + for(let i = 0; i < posFood.length; i++){ + if(pos[pos.length-1][0] == posFood[i][0] && pos[pos.length-1][1] == posFood[i][1]){ + posFood.splice(i,1); + eaten = true; + break; + } + } + if(eaten){ + generato = false; + } + let delta = 1; + if(superFood){ + delta = 5; + } + delta *= scoreMultiplier; + return (generato ? dim : dim + delta); +} + +function checkCollisioni(pos){ + if(pos[pos.length-1][0] < 0 || pos[pos.length-1][0] >= MAX_X){ + return true; + }else if(pos[pos.length-1][1] < 0 || pos[pos.length-1][1] >= MAX_Y){ + return true; + }else if(pos.length>1){ + let max = pos.length-1 + for(let i = 0;i=0;x--){ + disegnaQuadrati(c,[posSnake[x]],UCOLOR); + posSnake.splice(0,1); + //console.log(x); + } + return posSnake; +} + +function spawnFood(c,posSnake){ + let pos = generaPosRandom(); + //console.log("Generazione di un nuovo food"); + let conflitto = true; + while(conflitto){ + for(let x = 0;x MAX_X - EzLevel){ + pos = generaPosRandom(); + conflitto = true; + }else if(pos[0][1] < EzLevel || pos[0][1] > MAX_Y - EzLevel){ + pos = generaPosRandom(); + conflitto = true; + }else{ + //console.log(pos[0]); + conflitto = false; + } + } + } + let isSuper = random(0,SuperProb); + superFood = isSuper == SuperProb; + disegnaQuadrati(c,pos,FCOLOR,"c"); + return pos; +} + +function spawnFoodSingle(c,posSnake){ + let pos = generaPosRandom(); + let conflitto = true; + while(conflitto){ + for(let x = 0;x MAX_X - EzLevel){ + pos = generaPosRandom(); + conflitto = true; + }else if(pos[0][1] < EzLevel || pos[0][1] > MAX_Y - EzLevel){ + pos = generaPosRandom(); + conflitto = true; + }else{ + conflitto = false; + } + } + } + disegnaQuadrati(c,pos,FCOLOR,"c"); + return pos; +} + +function stopGame(c){ + clearInterval(ris); + pulisciCampo(c); + // Clear all foods + posF = []; + //alert("Hai perso"); + maxP= dim-3 > maxP ? dim-3:maxP; + putPunteggio("Sc",0); + ris=null +} + +function disegnaQuadrati(c,posizioni,color,id){ + c.fillStyle= id=="s"? UCOLOR : color; + for(let x = 0;x - - - - - - - Snake - - -

SnakeJs

-

- -
- - - - + + + + + + + + Snake + + +

SnakeJs

+

+ +
+
+ + + + +