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
- }