A snek is born
parent
a385c09922
commit
685b5874c7
13
apps.json
13
apps.json
|
|
@ -2100,6 +2100,19 @@
|
||||||
{"name":"snake.img","url":"snake-icon.js","evaluate":true}
|
{"name":"snake.img","url":"snake-icon.js","evaluate":true}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{ "id": "snek",
|
||||||
|
"name": "The snek game",
|
||||||
|
"shortName":"Snek",
|
||||||
|
"version": "0.01",
|
||||||
|
"description": "A snek game where you control a snek to eat all the apples!",
|
||||||
|
"icon": "snek-icon.js",
|
||||||
|
"supports": ["BANGLEJS2"],
|
||||||
|
"tags": "game,fun",
|
||||||
|
"storage": [
|
||||||
|
{"name":"snek.app.js","url":"snek.js"},
|
||||||
|
{"name":"snek.img","url":"snek-icon.js","evaluate":true}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "calculator",
|
"id": "calculator",
|
||||||
"name": "Calculator",
|
"name": "Calculator",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
require("heatshrink").decompress(atob("pFIwkB+MRAEH/EUIA7i93u9xEUIABEf4AC+93/4CBETpDBv//gEHEf6MB9wkB/8HSDl3vwjCAAfnErIjiEQYdBAAXuAoSNXEYIdDAAoj4j/3DpN3v6NWAA3/fDYjgRgIjLu9xESj2BAAN/SQwLBEe4XDdwghDBQQjSCgN+C5D9FEebTDEZJEWEQSDVEdZpDZYPnETYhDAAhpeEbzREI0rTbEdXuETb4Bvz1BAYIj/EYxrg9yQDv/3JoS9WEcoaGAAQtBOwYABEaSMBWoYeFJKgjjiIUD9ySEEjwAJFogj0SQgAFBQ4jRABcfXoQj/TowjCOgIkeEf7lHvz+CEb93Ef4jHR8Rr/fY4jCuIifAAQj/EIojbeohGeEcQhHfLRFDeoIicEcQbDv3uEYiNXIgnu87SgEcf/DKnxBJEf/4ACESf/EcYA=="))
|
||||||
|
|
@ -0,0 +1,463 @@
|
||||||
|
function init() {
|
||||||
|
this.titleScreen = true;
|
||||||
|
this.min = 0;
|
||||||
|
this.max = 160;
|
||||||
|
this.step = 20;
|
||||||
|
this.scoreMultiplier = 25;
|
||||||
|
this.totalGrid = this.max / this.step;
|
||||||
|
|
||||||
|
if (g.theme.dark) {
|
||||||
|
this.textColor = 1;
|
||||||
|
} else {
|
||||||
|
this.textColor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getNewPosistion = () => {
|
||||||
|
let newPos;
|
||||||
|
while (!newPos) {
|
||||||
|
// random bonus points for bad luck / lag
|
||||||
|
if (currentPosition.length > 10) {
|
||||||
|
this.score += 1;
|
||||||
|
}
|
||||||
|
const x = Math.floor(Math.random() * this.totalGrid + 1) * this.step;
|
||||||
|
const y = Math.floor(Math.random() * this.totalGrid + 1) * this.step;
|
||||||
|
const found = currentPosition.find(pos => {
|
||||||
|
return pos.x === x && pos.y === y;
|
||||||
|
});
|
||||||
|
if (!found) {
|
||||||
|
newPos = {x: x, y: y};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newPos;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.restart = () => {
|
||||||
|
g.clear();
|
||||||
|
this.titleScreen = false;
|
||||||
|
this.score = 0;
|
||||||
|
this.paused = false;
|
||||||
|
this.currentPosition = [{x: 2 * step, y: 3 * step},{x: 1 * step, y: 3 * step}];
|
||||||
|
this.death = false;
|
||||||
|
this.gameSpeed = 200;
|
||||||
|
this.directionSet = null;
|
||||||
|
this.direction = 1;
|
||||||
|
this.createApple();
|
||||||
|
};
|
||||||
|
|
||||||
|
const game = () => {
|
||||||
|
if (this.death && !this.paused) {
|
||||||
|
g.clear();
|
||||||
|
this.showDeathScreen();
|
||||||
|
} else if (this.titleScreen && !this.paused) {
|
||||||
|
this.showTitleScreen();
|
||||||
|
} else if (!this.paused) {
|
||||||
|
g.clear();
|
||||||
|
this.drawApple();
|
||||||
|
this.drawSnake();
|
||||||
|
this.boundries();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
game();
|
||||||
|
}, this.gameSpeed);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.increaseDifficulity = () => {
|
||||||
|
if (gameSpeed > 59) {
|
||||||
|
gameSpeed -= 10;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.createApple = () => {
|
||||||
|
this.applePosition = getNewPosistion();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.drawApple = () => {
|
||||||
|
g.setColor(0, 1, 0);
|
||||||
|
|
||||||
|
g.drawImage(this.appleLeaf, this.applePosition.x - 15, this.applePosition.y - 10);
|
||||||
|
g.setColor(1, 0, 0);
|
||||||
|
|
||||||
|
g.drawImage(this.apple, this.applePosition.x - 15, this.applePosition.y - 2);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkmax = (x) => {
|
||||||
|
if (x > this.max) {
|
||||||
|
return this.min;
|
||||||
|
} else if (x < this.min) {
|
||||||
|
return this.max;
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.movement = (lastItem) => {
|
||||||
|
let newPosition;
|
||||||
|
switch(this.direction) {
|
||||||
|
case 3:
|
||||||
|
newPosition = {
|
||||||
|
x: checkmax(lastItem.x + this.step),
|
||||||
|
y: lastItem.y
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
newPosition = {
|
||||||
|
x: checkmax(lastItem.x - this.step),
|
||||||
|
y: lastItem.y
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
newPosition = {
|
||||||
|
x: lastItem.x,
|
||||||
|
y: checkmax(lastItem.y + this.step)
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
newPosition = {
|
||||||
|
x: lastItem.x,
|
||||||
|
y: checkmax(lastItem.y - this.step)
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this.directionSet = false;
|
||||||
|
this.checkDeath(newPosition);
|
||||||
|
this.currentPosition.push(newPosition);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
this.snakeHead = (props) => {
|
||||||
|
switch (this.direction) {
|
||||||
|
case 0:
|
||||||
|
return [this.snakeUp, props.x - 9, props.y - 12];
|
||||||
|
case 1:
|
||||||
|
return [this.snakeLeft, props.x - 20, props.y - 10];
|
||||||
|
case 3:
|
||||||
|
return [this.snakeRight, props.x - 12, props.y - 12];
|
||||||
|
case 2:
|
||||||
|
return [this.snakeDown, props.x - 12, props.y - 7];
|
||||||
|
default:
|
||||||
|
return [this.snakeDown, props.x - 12, props.y - 7];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.drawSnake = () => {
|
||||||
|
const totalItems = this.currentPosition.length - 1;
|
||||||
|
g.setColor(0, 1, 0);
|
||||||
|
this.movement(this.currentPosition[totalItems]);
|
||||||
|
this.currentPosition.forEach((props, index) => {
|
||||||
|
if (index-1 === totalItems) {
|
||||||
|
const head = this.snakeHead(props);
|
||||||
|
|
||||||
|
g.drawImage(head[0], head[1], head[2]);
|
||||||
|
} else {
|
||||||
|
g.fillCircle(props.x,props.y,10);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (this.currentPosition[totalItems].x === this.applePosition.x && this.currentPosition[totalItems].y === this.applePosition.y) {
|
||||||
|
this.createApple();
|
||||||
|
this.increaseDifficulity();
|
||||||
|
} else {
|
||||||
|
this.currentPosition.shift();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.checkDeath = (newPos) => {
|
||||||
|
|
||||||
|
const found = this.currentPosition.find((oldPos) => {
|
||||||
|
return newPos.x === oldPos.x && newPos.y === oldPos.y;
|
||||||
|
});
|
||||||
|
if (found) {
|
||||||
|
Bangle.buzz();
|
||||||
|
g.clear();
|
||||||
|
this.death = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.boundries = () => {
|
||||||
|
if (this.currentPosition.x >= this.maxPx) {
|
||||||
|
this.currentPosition.x = this.maxPx;
|
||||||
|
}
|
||||||
|
else if (this.currentPosition.x < 10) {
|
||||||
|
this.currentPosition.x = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( this.currentPosition.y >= this.maxPy) {
|
||||||
|
this.currentPosition.y = this.maxPy;
|
||||||
|
} else if (this.currentPosition.y < 10) {
|
||||||
|
this.currentPosition.y = 10;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.creatTopScrore = () => {
|
||||||
|
require("Storage").writeJSON("snek_jd", {
|
||||||
|
topScore: this.calculateScore()
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.calculateScore = () => {
|
||||||
|
return currentPosition.length * this.scoreMultiplier + this.score;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.showDeathScreen = () => {
|
||||||
|
this.paused = true;
|
||||||
|
g.setFont('Vector', 25);
|
||||||
|
g.setColor(1, 0, 0);
|
||||||
|
g.drawString("GAME OVER",15, 50, "solid");
|
||||||
|
g.setFont('Vector', 15);
|
||||||
|
g.setColor(this.textColor, this.textColor, this.textColor);
|
||||||
|
g.drawString("Score : " + this.calculateScore(), 50, 78, "solid");
|
||||||
|
|
||||||
|
let storage = require("Storage").readJSON("snek_jd");
|
||||||
|
if (storage && storage.topScore) {
|
||||||
|
if (storage.topScore < this.calculateScore()) {
|
||||||
|
g.setColor(0, 1, 1);
|
||||||
|
g.drawString("New top score!", 20, 95, "solid");
|
||||||
|
g.setFont('Vector', 22);
|
||||||
|
g.drawString(this.calculateScore(), 20, 115, "solid");
|
||||||
|
|
||||||
|
this.creatTopScrore();
|
||||||
|
} else {
|
||||||
|
g.setColor(this.textColor, this.textColor, this.textColor);
|
||||||
|
g.drawString("Top score : " + storage.topScore, 20, 95, "solid");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.creatTopScrore();
|
||||||
|
}
|
||||||
|
g.setFont('Vector', 25);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Events */
|
||||||
|
Bangle.on('tap', (data) => {
|
||||||
|
Bangle.setLCDPower(true);
|
||||||
|
if (this.death) {
|
||||||
|
this.showTitleScreen();
|
||||||
|
} else if (this.titleScreen || this.paused) {
|
||||||
|
this.restart();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Bangle.on('accel', (xyz) => {
|
||||||
|
if (Math.abs(xyz.x) > Math.abs(xyz.y)) {
|
||||||
|
if (xyz.x < 0) {
|
||||||
|
if (!this.directionSet && this.direction !== 1) {
|
||||||
|
Bangle.setLCDPower(true);
|
||||||
|
this.direction = 3;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!this.directionSet && this.direction !== 3) {
|
||||||
|
Bangle.setLCDPower(true);
|
||||||
|
this.direction = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (xyz.y < 0) {
|
||||||
|
if (!this.directionSet && this.direction !== 0) {
|
||||||
|
Bangle.setLCDPower(true);
|
||||||
|
this.direction = 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!this.directionSet && this.direction !== 2) {
|
||||||
|
Bangle.setLCDPower(true);
|
||||||
|
this.direction = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.directionSet = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.showTitleScreen = () => {
|
||||||
|
this.death = false;
|
||||||
|
g.clear();
|
||||||
|
g.setColor(0, 1, 0);
|
||||||
|
g.setFont('Vector', 50);
|
||||||
|
g.drawString("nek", 70, 15, "solid");
|
||||||
|
g.drawImage(this.titleScreenImg, 20, 20);
|
||||||
|
g.fillPoly([
|
||||||
|
15, 66,
|
||||||
|
152, 70,
|
||||||
|
159, 79,
|
||||||
|
21, 71 ]);
|
||||||
|
g.setFont('Vector', 12);
|
||||||
|
g.setColor(1, 0, 1);
|
||||||
|
g.drawString("by: Jason de Belle", 30, 80, "solid");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Graphics */
|
||||||
|
this.snakeUp = Graphics.createImage(`
|
||||||
|
XX XX
|
||||||
|
xx xx
|
||||||
|
xx xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xxxxxxxx
|
||||||
|
xxxx xxxx
|
||||||
|
xxxxxx xxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxx
|
||||||
|
xxxxx xXXx xxxxx
|
||||||
|
xxxxx XX xxxxx
|
||||||
|
xxxxx XX xxxxx
|
||||||
|
xxxxxx xxxx xxxxx
|
||||||
|
xxxxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxx
|
||||||
|
`);
|
||||||
|
this.snakeDown = Graphics.createImage(`
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxxxx
|
||||||
|
xxxxxx xxxx xxxxxx
|
||||||
|
xxxxxx xxxx xxxxxx
|
||||||
|
xxxx XX xxxxx
|
||||||
|
xxxx XX xxxxx
|
||||||
|
xxxx xXXx xxxx
|
||||||
|
xxxx xXXx xxxx
|
||||||
|
xXxxxxxxxxxxxx
|
||||||
|
xXxxxxxxxxxxxx
|
||||||
|
xxx xxx
|
||||||
|
xxxx xxxx
|
||||||
|
xxxx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
x x
|
||||||
|
xx xx
|
||||||
|
xx xx
|
||||||
|
`);
|
||||||
|
|
||||||
|
this.snakeRight = Graphics.createImage(`
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xXxxxxxx xxxx
|
||||||
|
xXxxxxxx xxxx
|
||||||
|
xxxxxxxX xxx
|
||||||
|
xxxxxxxX xxx xxxx
|
||||||
|
xxxxxxxxxxXX xxxxxx xxxx
|
||||||
|
xxxxxxxxxxXX xxxxxx xx
|
||||||
|
xxxxxxxxxxXXxxxxx xxxxxxxx
|
||||||
|
xxxxxxxxxxXXxxxxx xxxxxxxx
|
||||||
|
xxxxxxxxxxxx xxxxx xx
|
||||||
|
xxxxxxxxxxxx xxxxx xxx
|
||||||
|
xxxxxxxx xx xxxx
|
||||||
|
xxxxxxxx xx
|
||||||
|
xxxxxxxx xxx
|
||||||
|
xxxxxxxx xxx
|
||||||
|
xxxxxxxxxxx
|
||||||
|
xxxxxxxxxxx
|
||||||
|
xxxxxxxxx
|
||||||
|
xxxxxxxxx
|
||||||
|
`);
|
||||||
|
this.snakeLeft = Graphics.createImage(`
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xXxxxxxxxxxxxx
|
||||||
|
xX xxxxxxxxxx
|
||||||
|
x xx xXxxxxxxxx
|
||||||
|
xx xx xXxxxxxxxx
|
||||||
|
xx xx xxxx xxXXxxxxxxxx
|
||||||
|
xxxxxxx xxxxxXXxxxxxxxx
|
||||||
|
xxxxxxx xxxxxXXxxxxxxxx
|
||||||
|
xx xx xxxx xxXXxxxxxxxx
|
||||||
|
xx xxx xxxxxxxxxx
|
||||||
|
x xxx xxxxxxxxx
|
||||||
|
xxxx xxxxxxxxx
|
||||||
|
xxxx xxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxx
|
||||||
|
xxxxxxxxxxx
|
||||||
|
xxxxxxxxx
|
||||||
|
xxxxxxxxx
|
||||||
|
`);
|
||||||
|
|
||||||
|
this.apple = Graphics.createImage(`
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxx
|
||||||
|
`);
|
||||||
|
|
||||||
|
this.appleLeaf = Graphics.createImage(`
|
||||||
|
xxxxxx
|
||||||
|
xxxxxx
|
||||||
|
xxxx
|
||||||
|
XXxxxxxxxx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
xx
|
||||||
|
`);
|
||||||
|
|
||||||
|
|
||||||
|
this.titleScreenImg = Graphics.createImage(`
|
||||||
|
sxxxxxxxs
|
||||||
|
xxsxxx xxxxxs
|
||||||
|
xxxxxxxxsxx xxxxsx
|
||||||
|
xxxxxxxxxxxxxxxsxxs xxxxsxx
|
||||||
|
xxxxxxxxxxxxxxxxxxxxxsxxxsssxxxxxxsxxxx
|
||||||
|
xxxxxxxxxxxxxxxxxxxsxxxxsxxs xxsxxx
|
||||||
|
xxxxxxxxxxxxxxxxxxxxxxxxxsxx xxxsxx
|
||||||
|
xxxxxxxxxxxxxxxxxxxxx sxxx ssxxsx
|
||||||
|
xxxxxxxxxxxxxxx xxxxxxs
|
||||||
|
xxxxxxxxxxxx ssss
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxx
|
||||||
|
xxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxxxx
|
||||||
|
xxxxxxxxxx
|
||||||
|
xxxxxxx
|
||||||
|
xxx
|
||||||
|
`);
|
||||||
|
|
||||||
|
game();
|
||||||
|
}
|
||||||
|
init();
|
||||||
Loading…
Reference in New Issue