A snek is born

pull/995/head
Jay de Belle 2021-12-03 19:27:42 -05:00
parent a385c09922
commit 685b5874c7
3 changed files with 477 additions and 0 deletions

View File

@ -2100,6 +2100,19 @@
{"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",
"name": "Calculator",

1
apps/snek/snek-icon.js Normal file
View File

@ -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=="))

463
apps/snek/snek.js Normal file
View File

@ -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();