run.js (需要自己先用npm下载keypress这个包 用 npm install keypress –save 下载)
如果想在xshell上玩需要把空格和方块改下 (在windows的控制台用的话一个方块是两个字符,在xshell上不知道为啥是一个字符,还需要修改下xshell上文本显示的样式显示才会正常)
const config = require('./config');
const keypress = require('keypress');
var live = false;
var snakes = [];
var food = {};
var score = 0;
var keyDown = 'right';
var stepX = 1;
var stepY = 0;
const startNum = config.startNum;
const time = config.time;
DawnCanvas([{top:0,left:0},{top:10,left:0}])
keypress(process.stdin); //监听键盘输入
process.stdin.on('keypress', function (ch, key) {
//console.log('got "keypress"', key);
if (key && key.ctrl && key.name == 'c') {
process.abort();
}
if(key)
{
if(!live)
{
start();
}
else
{
//console.log(keyDown)
if(key.name == "up" || key.name == "w")
{
if(keyDown != 'down')
{
keyDown = 'up';
stepX = 0;
stepY = -1;
}
}
else if(key.name == "down" || key.name == "s")
{
if(keyDown != 'up')
{
keyDown = 'down';
stepX = 0;
stepY = 1;
}
}
else if(key.name == "left" || key.name == "a")
{
if(keyDown != 'right')
{
keyDown = 'left';
stepX = -1;
stepY = 0;
}
}
else if(key.name == "right" || key.name == "d")
{
if(keyDown != 'left')
{
keyDown = 'right';
stepX = 1;
stepY = 0;
}
}
}
}
});
process.stdin.setRawMode(true);
process.stdin.resume();
function start()
{
snakes = [];
stepX = 1;
stepY = 0;
keyDown = 'right';
live = true;
score = 0;
DawnSnake(startNum);
createFood();
SnakeMove();
}
function SnakeMove() {
if(live){
for(var i=0;i<snakes.length-1;i++)
{
snakes[i].top = snakes[i+1].top
snakes[i].left = snakes[i+1].left
}
var first = snakes.length-1
snakes[first].top = snakes[first].top+stepY;
snakes[first].left = snakes[first].left+stepX;
if(!isLive(snakes[first].top,snakes[first].left))
{
live = false;
console.log("游戏结束")
}
else
{
eatFood(snakes[first].top,snakes[first].left);
var snakes1 = [].concat(snakes);
snakes1.push(food);
DawnCanvas(snakes1)
setTimeout(function(){
SnakeMove()
},time);
}
}
}
function isLive(top,left){
if(top>24||top<0||left>24||left<0)
{
return false;
}
else
{
for(var i=0;i<snakes.length-1;i++)
{
if(top==snakes[i].top&&left==snakes[i].left)
{
return false;
break;
}
}
return true;
}
}
function eatFood(top,left){ //是否吃到食物
if(top==food.top&&left==food.left)
{
score++;
snakes.push({top:top,left:left})
createFood();
}
}
function createFood(){ //创建食物
isCreate = true
do
{
food={
top:Math.round(Math.random()*24),
left:Math.round(Math.random()*24)
}
for(var i=0;i<snakes.length;i++)
{
if(food.top==snakes[i].top&&food.left==snakes[i].left)
{
isCreate = false;
break;
}
else
{
isCreate = true;
}
}
}
while(!isCreate)
}
function DawnSnake(startNum) //初始化蛇
{
for(let i=0;i<startNum;i++)
{
var item = {
top:0,
left:i
}
snakes.push(item);
}
}
function DawnCanvas(items1) //绘图游戏界面
{
var isDawn = false;
var canvas = '';
canvas += '┍┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┑\n';
for(let i=0;i<25;i++)
{
canvas += '│ ';
for(let j=0;j<25;j++)
{
isDawn = false;
for(let item of items1)
{
if(item.top == i && item.left == j)
{
canvas += '■';
isDawn = true;
}
if(isDawn)
{
break;
}
}
if(!isDawn)
{
canvas += ' ';
}
}
canvas+='│ \n';
}
canvas += '┕┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┚\n';
process.stdout.write('\033[2J'); //清空控制台
console.log(canvas)
if(!live)
{
console.log('按任意键开始游戏....')
}
else
{
console.log("得分:",score)
}
}
const Rand = function(Min,Max){
var Range = Max - Min;
var Rand = Math.random();
var num = Min + Math.round(Rand * Range); //四舍五入
return num;
}
config.js
module.exports = {
time : 150,
startNum : 3
}