在火车上,为了打发时间,我开始了写JS小游戏的计划。就先从贪吃蛇这种最简单的开始写起吧。
那位用JAVASCRIPT写出超级玛丽的牛人,值得学习。我这里用li标记来模拟红白机中画面的像素点的想法,就是源于此。
贪吃蛇的游戏规则:
- 吃掉一个食物,蛇长自动+1;
- 蛇头撞到边缘或蛇身则游戏结束;
- 用方向键控制移动方向,需要有暂停游戏功能;
主要游戏元素:
- 蛇;
- 食物;
- 舞台;
主要思路及算法:
- 构造的舞台,很明显是一个固定大小的二维数组;
- 蛇通过不断吃食物可以改变自身长度,所以应该是一个长度可变的二维数组;
- 食物、蛇可以出现在整个舞台的任意地方,可以通过改变其坐标值来改变位置;
接下来看一部分代码:
snake.unshift([nextX,nextY]) if(aLi[nextX][nextY].className==_options.classFood){ _createFood(); }else{ aLi[snake[nSnakeLen][0]][snake[nSnakeLen][1]].className=''; snake.pop(); }
这部分是整个游戏最核心的代码,snake数组在每次移动的时候,它的第一个节点都会占领这个像素点,所以这个数组就是unshift([蛇头像素点坐标])。如果这个点是食物那么,继续生成食物,蛇身则已经通过unshift自动+1;如果这个点不是食物,那么删除蛇尾的像素点,从而保持蛇身长度不变,实现了蛇的移动效果。
另外一部分比较重要的,通过方向键改变蛇身移动方向。考虑到蛇本身是包含一系列坐标值的二维数组,只需给它的值在横向或纵向上+1或-1,即可左右移动一个像素的位置。
//移动方向、预载移动方向 var direction = preDirection = [0,1]; var nextX = snake[0][0]+direction[0]; var nextY = snake[0][1]+direction[1];
主要函数方法,我都在源代码里写上了注释。虽然游戏用了组件封装的写法,不过其实都是原生写法,所以还是有改进之处。有BUG欢迎提出来。