Initial commit
This commit is contained in:
140
404_games/snake/js/logic.js
Normal file
140
404_games/snake/js/logic.js
Normal file
@@ -0,0 +1,140 @@
|
||||
var BLOCK_SIZE = 16;
|
||||
|
||||
function update(){
|
||||
if (GAME_STATE.complete) GAME_STATE.snake.update();
|
||||
}
|
||||
|
||||
function initGameState(callback){
|
||||
GAME_STATE.grid = {};
|
||||
loadImagePixels("data/map.png", function(rows){
|
||||
rows.forEach(function(row, i){
|
||||
row.forEach(function(pixel, j){
|
||||
var cell = new Cell(i,j);
|
||||
if (isColor(pixel, BLACK))
|
||||
cell.content = 'BLOCK';
|
||||
else if (isColor(pixel, GREEN))
|
||||
cell.content = 'INVALID';
|
||||
else if (isColor(pixel, RED)){
|
||||
cell.content = 'SNAKE';
|
||||
GAME_STATE.snake = new Snake(cell);
|
||||
}
|
||||
GAME_STATE.grid[[i,j]] = cell;
|
||||
GAME_STATE.gameHeight = i;
|
||||
GAME_STATE.gameWidth = j;
|
||||
});
|
||||
});
|
||||
Grid.newFood();
|
||||
GAME_STATE.complete = true;
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
var GAME_STATE = {
|
||||
snake: null,
|
||||
grid: null,
|
||||
gameOver: false,
|
||||
gameHeight: 0,
|
||||
gameWidth: 0,
|
||||
}
|
||||
|
||||
function Grid(){}
|
||||
|
||||
Grid.get = function(x,y){
|
||||
return GAME_STATE.grid[[x,y]];
|
||||
}
|
||||
|
||||
Grid.set = function(x, y, content){
|
||||
var cell = GAME_STATE.grid[[x,y]];
|
||||
cell.content = content;
|
||||
return cell;
|
||||
}
|
||||
|
||||
Grid.unset = function(x, y){
|
||||
var cell = GAME_STATE.grid[[x,y]];
|
||||
cell.content = null;
|
||||
return cell;
|
||||
}
|
||||
|
||||
Grid.randomFree = function(){
|
||||
do{
|
||||
var row = Math.floor(Math.random() * GAME_STATE.gameHeight);
|
||||
var col = Math.floor(Math.random() * GAME_STATE.gameWidth);
|
||||
var cell = this.get(row,col);
|
||||
} while (cell.content);
|
||||
return cell;
|
||||
}
|
||||
|
||||
Grid.newFood = function (){
|
||||
var freeCell = this.randomFree();
|
||||
freeCell.content = 'FOOD';
|
||||
}
|
||||
|
||||
function Cell(x,y){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.content = null;
|
||||
}
|
||||
|
||||
|
||||
function Snake(initCell){
|
||||
this.body = [initCell];
|
||||
this.dir = {x: -1, y: 0}; // start moving to the left
|
||||
}
|
||||
|
||||
Snake.prototype.head = function(){
|
||||
return this.body[0];
|
||||
}
|
||||
|
||||
Snake.prototype.tail = function(){
|
||||
return this.body[-1];
|
||||
}
|
||||
|
||||
Snake.prototype.move = function(dir){
|
||||
switch(dir){
|
||||
case 'l':
|
||||
this.dir = {x: -1, y: 0};
|
||||
break;
|
||||
case 'r':
|
||||
this.dir = {x: 1, y: 0};
|
||||
break;
|
||||
case 'u':
|
||||
this.dir = {x: 0, y: -1};
|
||||
break;
|
||||
case 'd':
|
||||
this.dir = {x: 0, y: 1};
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Snake.prototype.update = function(dir){
|
||||
// compute new position of the head
|
||||
var head = this.head();
|
||||
var dir = this.dir;
|
||||
var newX = head.x + dir.x;
|
||||
var newY = head.y + dir.y;
|
||||
var newHead = Grid.get(newX, newY);
|
||||
|
||||
// check collisions
|
||||
|
||||
// if food, grow (on the head)
|
||||
if (newHead.content == 'FOOD') {
|
||||
newHead.content = 'SNAKE';
|
||||
this.body.unshift(newHead);
|
||||
Grid.newFood();
|
||||
}
|
||||
|
||||
// if block, die
|
||||
else if (newHead.content != null){
|
||||
GAME_STATE.game_over = true;
|
||||
}
|
||||
|
||||
// else, move
|
||||
else {
|
||||
oldTail = this.body.pop();
|
||||
oldTail.content = null;
|
||||
|
||||
newHead.content = 'SNAKE';
|
||||
this.body.unshift(newHead);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user