2015-12-12 06:14:22 +00:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; })();
|
|
|
|
|
|
|
|
var _unit = require('./classes/unit');
|
|
|
|
|
|
|
|
var _unit2 = _interopRequireDefault(_unit);
|
|
|
|
|
|
|
|
var _interface = require('./classes/interface');
|
|
|
|
|
|
|
|
var _interface2 = _interopRequireDefault(_interface);
|
|
|
|
|
|
|
|
var _fs = require('fs');
|
|
|
|
|
|
|
|
var _fs2 = _interopRequireDefault(_fs);
|
|
|
|
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
|
|
|
|
var FRAME = 100;
|
2015-12-12 06:20:21 +00:00
|
|
|
loop();
|
2015-12-12 06:14:22 +00:00
|
|
|
|
|
|
|
var ui = new _interface2.default();
|
|
|
|
|
|
|
|
var snake = [];
|
|
|
|
var UP = 0;
|
|
|
|
var DOWN = 1;
|
|
|
|
var LEFT = 2;
|
|
|
|
var RIGHT = 3;
|
|
|
|
var head = createPart();
|
|
|
|
head.color = '#71da29';
|
|
|
|
head.dieOnExit = true;
|
|
|
|
createPart();
|
|
|
|
createPart();
|
|
|
|
|
|
|
|
var point = new _unit2.default(ui);
|
|
|
|
point.shape = '+';
|
|
|
|
point.color = '#f3ff6a';
|
|
|
|
point.random();
|
|
|
|
|
|
|
|
var score = 0;
|
|
|
|
|
|
|
|
var stop = false;
|
|
|
|
function loop() {
|
|
|
|
if (stop) return;
|
|
|
|
ui.clear();
|
|
|
|
|
|
|
|
point.draw();
|
|
|
|
|
|
|
|
snake.forEach(function (part, i) {
|
|
|
|
part.draw();
|
|
|
|
|
|
|
|
if (i > 0) part.findWay(i);
|
|
|
|
|
|
|
|
part.move();
|
|
|
|
});
|
|
|
|
|
|
|
|
if (head.collides(point)) {
|
|
|
|
point.random();
|
|
|
|
createPart();
|
|
|
|
score++;
|
|
|
|
|
|
|
|
FRAME--;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (head.collides(snake.slice(2))) {
|
|
|
|
gameover();
|
|
|
|
}
|
|
|
|
|
|
|
|
ui.cursor.goto(0, 0).yellow().write('Score: ' + score);
|
|
|
|
ui.cursor.reset();
|
|
|
|
|
|
|
|
setTimeout(loop, FRAME);
|
|
|
|
}
|
|
|
|
|
|
|
|
loop();
|
|
|
|
|
|
|
|
ui.onKey('right', function () {
|
|
|
|
changeDirection(RIGHT);
|
|
|
|
});
|
|
|
|
ui.onKey('down', function () {
|
|
|
|
changeDirection(DOWN);
|
|
|
|
});
|
|
|
|
ui.onKey('up', function () {
|
|
|
|
changeDirection(UP);
|
|
|
|
});
|
|
|
|
ui.onKey('left', function () {
|
|
|
|
changeDirection(LEFT);
|
|
|
|
});
|
|
|
|
|
|
|
|
ui.onKey(function () {
|
|
|
|
if (!stop) return;
|
|
|
|
|
|
|
|
stop = false;
|
|
|
|
snake = [];
|
|
|
|
head = createPart();
|
|
|
|
head.color = '#71da29';
|
|
|
|
createPart();
|
|
|
|
createPart();
|
|
|
|
|
|
|
|
score = 0;
|
|
|
|
|
|
|
|
point.random();
|
|
|
|
|
|
|
|
loop();
|
|
|
|
});
|
|
|
|
|
|
|
|
function changeDirection(dir) {
|
|
|
|
head.direction = dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
function createPart() {
|
|
|
|
var part = new _unit2.default(ui);
|
|
|
|
var last = snake[snake.length - 1];
|
|
|
|
|
|
|
|
var direction = undefined;
|
|
|
|
if (!last) {
|
|
|
|
direction = UP;
|
|
|
|
} else {
|
|
|
|
direction = last.direction;
|
|
|
|
}
|
|
|
|
|
|
|
|
part.shape = '•';
|
|
|
|
part.color = '#bdfe91';
|
|
|
|
part.direction = direction;
|
|
|
|
part.changeTo = null;
|
|
|
|
|
|
|
|
part.findWay = function (i) {
|
|
|
|
var ahead = snake[i - 1];
|
|
|
|
|
|
|
|
if (this.changeTo !== null) {
|
|
|
|
this.direction = this.changeTo;
|
|
|
|
this.changeTo = null;
|
|
|
|
}
|
|
|
|
if (this.direction !== ahead.direction) {
|
|
|
|
this.changeTo = ahead.direction;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
part.speed = function () {
|
|
|
|
var multiplier = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];
|
|
|
|
var direction = part.direction;
|
|
|
|
|
|
|
|
var x = direction == LEFT ? -1 : direction == RIGHT ? 1 : 0;
|
|
|
|
var y = direction == UP ? -1 : direction == DOWN ? 1 : 0;
|
|
|
|
|
|
|
|
return [x * multiplier, y * multiplier];
|
|
|
|
};
|
|
|
|
|
|
|
|
var _part$speed = part.speed();
|
|
|
|
|
|
|
|
var _part$speed2 = _slicedToArray(_part$speed, 2);
|
|
|
|
|
|
|
|
var dX = _part$speed2[0];
|
|
|
|
var dY = _part$speed2[1];
|
|
|
|
|
|
|
|
dX *= -1;
|
|
|
|
dY *= -1;
|
|
|
|
|
|
|
|
var x = last ? last.x + dX : ui.center.x;
|
|
|
|
var y = last ? last.y + dY : ui.center.y;
|
|
|
|
|
|
|
|
part.go(x, y);
|
|
|
|
|
|
|
|
snake.push(part);
|
|
|
|
return part;
|
|
|
|
}
|
|
|
|
|
|
|
|
function gameover() {
|
|
|
|
var MSG = 'Game Over!';
|
|
|
|
ui.cursor.goto(ui.center.x - MSG.length / 2, ui.center.y);
|
|
|
|
ui.cursor.red();
|
|
|
|
ui.cursor.bold();
|
|
|
|
ui.write(MSG);
|
|
|
|
|
|
|
|
ui.cursor.reset();
|
|
|
|
ui.cursor.hex('#f65590');
|
|
|
|
var RETRY = 'Press any key to play again';
|
|
|
|
ui.cursor.goto(ui.center.x - RETRY.length / 2, ui.center.y + 2);
|
|
|
|
ui.write(RETRY);
|
|
|
|
|
|
|
|
stop = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
process.on('exit', function () {
|
|
|
|
ui.cursor.horizontalAbsolute(0).eraseLine();
|
|
|
|
ui.cursor.show();
|
|
|
|
});
|