mirror of https://github.com/espruino/BangleApps
186 lines
3.6 KiB
JavaScript
186 lines
3.6 KiB
JavaScript
|
//Bangle.setLCDMode("176x176");
|
||
|
Bangle.setLCDTimeout(0);
|
||
|
|
||
|
const H = g.getWidth();
|
||
|
const W = g.getHeight();
|
||
|
let running = true;
|
||
|
let score = 0;
|
||
|
let d;
|
||
|
const gridSize = 29;
|
||
|
const tileSize = 6;
|
||
|
let nextX = 0;
|
||
|
let nextY = 0;
|
||
|
const defaultTailSize = 3;
|
||
|
let tailSize = defaultTailSize;
|
||
|
const snakeTrail = [];
|
||
|
const snake = { x: 10, y: 10 };
|
||
|
const apple = { x: Math.floor(Math.random() * gridSize), y: Math.floor(Math.random() * gridSize) };
|
||
|
|
||
|
function drawBackground(){
|
||
|
g.setColor("#000000");
|
||
|
g.fillRect(0, 0, H, W);
|
||
|
}
|
||
|
|
||
|
function drawBackgroundSuccess(){
|
||
|
g.setColor("#00FFFF");
|
||
|
g.fillRect(0, 0, H, W);
|
||
|
}
|
||
|
|
||
|
function drawApple(){
|
||
|
g.setColor("#FF0000");
|
||
|
g.fillCircle((apple.x * tileSize) + tileSize/2, (apple.y * tileSize) + tileSize/2, tileSize/2);
|
||
|
}
|
||
|
|
||
|
function drawSnake(){
|
||
|
g.setColor("#008000");
|
||
|
for (let i = 0; i < snakeTrail.length; i++) {
|
||
|
g.fillRect(snakeTrail[i].x * tileSize, snakeTrail[i].y * tileSize, snakeTrail[i].x * tileSize + tileSize, snakeTrail[i].y * tileSize + tileSize);
|
||
|
|
||
|
//snake bites it's tail
|
||
|
if (snakeTrail[i].x === snake.x && snakeTrail[i].y === snake.y && tailSize > defaultTailSize) {
|
||
|
Bangle.buzz(1000);
|
||
|
gameOver();
|
||
|
}
|
||
|
}
|
||
|
g.setColor("#FFFFFF");
|
||
|
g.fillRect(snake.x*tileSize, snake.y*tileSize, snake.x*tileSize+ tileSize, snake.y*tileSize + tileSize);
|
||
|
|
||
|
g.setColor("#0000ff");
|
||
|
g.fillRect((snake.x*tileSize)+1, (snake.y*tileSize)+2, (snake.x*tileSize)+2, (snake.y*tileSize)+4);
|
||
|
|
||
|
g.setColor("#0000ff");
|
||
|
g.fillRect((snake.x*tileSize)+tileSize-1, (snake.y*tileSize)+2, (snake.x*tileSize)+tileSize-2, (snake.y*tileSize)+4);
|
||
|
|
||
|
}
|
||
|
|
||
|
function drawScore(){
|
||
|
g.setColor("#555555");
|
||
|
g.setFont("Vector20");
|
||
|
g.setFontAlign(0, 0);
|
||
|
g.drawString("Score:" + score, W / 2, 10);
|
||
|
}
|
||
|
|
||
|
function gameStart() {
|
||
|
running = true;
|
||
|
score = 0;
|
||
|
}
|
||
|
|
||
|
function gameOver() {
|
||
|
g.clear();
|
||
|
g.setColor("#000000");
|
||
|
g.setFont("Vector12");
|
||
|
g.drawString("GAME OVER!", W / 2, H / 2 - 20);
|
||
|
g.drawString("Score: " + score, W / 2, H / 2 - 10);
|
||
|
g.drawString("Tap to Restart", W / 2, H / 2 + 10);
|
||
|
running = false;
|
||
|
tailSize = defaultTailSize;
|
||
|
}
|
||
|
|
||
|
function draw() {
|
||
|
if (!running) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
g.clear();
|
||
|
|
||
|
// move snake in next pos
|
||
|
snake.x += nextX;
|
||
|
snake.y += nextY;
|
||
|
|
||
|
// snake over game world
|
||
|
if (snake.x < 0) {
|
||
|
snake.x = gridSize - 1;
|
||
|
}
|
||
|
if (snake.x > gridSize - 1) {
|
||
|
snake.x = 0;
|
||
|
}
|
||
|
|
||
|
if (snake.y < 0) {
|
||
|
snake.y = gridSize - 1;
|
||
|
}
|
||
|
if (snake.y > gridSize - 1) {
|
||
|
snake.y = 0;
|
||
|
}
|
||
|
|
||
|
//snake bite apple
|
||
|
if (snake.x === apple.x && snake.y === apple.y) {
|
||
|
Bangle.beep(20);
|
||
|
drawBackgroundSuccess();
|
||
|
tailSize++;
|
||
|
score++;
|
||
|
|
||
|
apple.x = Math.floor(Math.random() * gridSize);
|
||
|
apple.y = Math.floor(Math.random() * gridSize);
|
||
|
drawApple();
|
||
|
}
|
||
|
|
||
|
drawBackground();
|
||
|
drawApple();
|
||
|
drawSnake();
|
||
|
drawScore();
|
||
|
|
||
|
//set snake trail
|
||
|
snakeTrail.push({ x: snake.x, y: snake.y });
|
||
|
while (snakeTrail.length > tailSize) {
|
||
|
snakeTrail.shift();
|
||
|
}
|
||
|
|
||
|
g.flip();
|
||
|
}
|
||
|
|
||
|
let dDiff = 10;
|
||
|
|
||
|
Bangle.on('drag', function(a) {
|
||
|
|
||
|
if (a.dx > dDiff ) { // right
|
||
|
if (d !== 'l')
|
||
|
{
|
||
|
nextX = 1;
|
||
|
nextY = 0;
|
||
|
d = 'r';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (a.dx < -dDiff ) { // left
|
||
|
if (d !== 'r')
|
||
|
{
|
||
|
nextX = -1;
|
||
|
nextY = 0;
|
||
|
d = 'l';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (a.dy < -dDiff) { // Up
|
||
|
if (d !== 'd') {
|
||
|
nextX = 0;
|
||
|
nextY = -1;
|
||
|
d = 'u';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (a.dy > dDiff) { // Down
|
||
|
if (d !== 'u')
|
||
|
{
|
||
|
nextX = 0;
|
||
|
nextY = 1;
|
||
|
d = 'd';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Bangle.on('touch', button => {
|
||
|
if (!running) {
|
||
|
gameStart();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
|
||
|
// render X times per second
|
||
|
const x = 5;
|
||
|
setInterval(draw, 1000 / x);
|