js实现的贪吃蛇,以下仅供参考:
贪吃蛇的需求分析:
1,构造一个蛇移动的地图 对象===>PC端的游戏 浏览器上运行的程序(JS)
(1)使用div 创建地图元素;
(2)添加到body中;
(3)设置地图元素的样式; JS实现
(4)调用地图显示的方法,从而显示浏览器
2,构造一个食物对象 ===>PC端的元素 浏览器上显示(地图div中显示)
(1)使用div创建食物元素;
(2)添加到地图的元素中去;
(3)设置食物的样式;
(4)调用食物显示的方法,从而显示在地图div中
3,创建一个蛇 对象 ===>现在地图div元素中
(1)创建二维数组: 用来构造蛇身,位置,颜色;
arrSnake=[
[9,8,null,‘red’],
[8,8,null,‘green’],
[7,8,null,‘green’]
];
(2)创建显示蛇的方法;
–>初始化蛇 3节 for循环 创建div元素;
–>添加 到地图的div中;
–>设置蛇的样式 (二维数组的数据访问) arrSnake[][]
(3)蛇的调用 显示蛇的方法(通过实例化的对象.显示蛇的方法名);
display()===>声明 创建蛇对象中
(4)创建蛇移动方向的方法
-->考虑: 通过哪种方式控制蛇的移动 键盘控制
-->传递 键码到蛇移动方向的方法中去;
-->使用蛇对象中的属性记录 蛇移动方向;
(5)创建蛇移动的方法
-->考虑: 计时器控制蛇自动 移动过程中 全局属性记录的方向传递进该方法
-->判断: 蛇的方向, 从而设置 蛇头移动, 紧接着蛇身以及蛇尾移动(for)(bug:蛇身叠加);
-->最后 重点: 是调用蛇显示的 方法 从而才能改变蛇的位置(bug:蛇头重复的创建)
-->添加计时器 重复调用 注意: 该函数在计时器中是使用对象调用. 不能直接调
var div_map; //创造地图的对象
var div_food; //创造食物的对象
var div_snake; //创建蛇的对象
var sum=0; //初始化的分数
var time; //接收定时器的变量
var div_eye; //创建眼睛的变量
var div_an1; //创建暂停继续
var sort; //分数的div
var sor;
var div;
var btn;
window.onload=function(){
div=document.getElementById('bt');
btn=document.getElementById('hg');
var id=document.getElementById('id1');
var id2=document.getElementById('id2');
var id3=document.getElementById('id3');
id.onclick=function(){
shili('url(tim.jpg)no-repeat',300);
}
id2.onclick=function(){
shili('url(lans.jpg)
',600);
}
id3.onclick=function(){
shili('url(xue.jpg)no-repeat',100);
}
var bgm=document.getElementById('bgm1') ;
//console.log(bgm);
bgm.autoplay='autoplay';
//bgm.autoplay='autoplay';
function shili(m,n){
//开始页面的隐藏
div.style.display='none';
btn.style.display='none';
//实例化地图
div_map=new Map();
div_map.backgroundImage=m;
div_map.display()
//实例化食物
div_food=new Food();
div_food.display()
//实例化的蛇
div_snake=new Snake(n);
div_snake.display();
div_snake.move();
//实例化的眼睛
div_eye=new Eye();
div_eye.display();
//实例化按钮
div_an1=new Stop();
div_an1.display();
//记分板的创建
sort=document.createElement('div');
sort.style.position='absolute';
sort.innerHTML='得分:';
document.getElementsByTagName('body')[0].appendChild(sort);
sort.style.margin='-400px 310px';
sor=document.createElement('div');
sor.innerHTML=sum;
sort.appendChild(sor);
//给body添加点击事件用来控制键盘的移动
document.getElementsByTagName('body')[0].onkeydown=function(evevt){
//console.log(event.keyCode);
div_snake.setDirect(event.keyCode);
}
}
}
//创造地图对象
function Map(){
//地图对象的属性
this.width=800;
this.height=600;
this._map=null;
this.backgroundImage=null;
//地图对象的样式
this.display=function(){
this._map=document.createElement('div');
this._map.style.background=this.backgroundImage;
this._map.style.width=this.width+'px';
this._map.style.height=this.height+'px';
this._map.style.margin='40px auto';
this._map.style.position='relative';
document.getElementsByTagName('body')[0].appendChild(this._map);
}
}
//创建食物对象
function Food(){
//食物的属性
this.width=20;
this.height=20;
this.color='red';
this.food=null;
//x y用于后来蛇吃食物
this.x=0;
this.y=0;
//食物的样式
this.display=function(){
//解决蛇碰到食物后,食物随机重复出现
if(this.food==null){
this.food=document.createElement('div');
this.food.style.width=this.width+'px';
this.food.style.height=this.height+'px';
this.food.style.background=this.color;
this.food.style.position='absolute';
// this.food.style.borderRadius='50%';
div_map._map.appendChild(this.food);
}
this.x=Math.round(Math.random()*39);
this.y=Math.round(Math.random()*29);
this.food.style.left=this.x*this.width+'px';
this.food.style.top=this.y*this.height+'px';
}
}
//创建蛇的对象 n传递速度的参数
function Snake(n){
this.width=20;
this.height=20;
this.direct=null;
//二维数组用来存储蛇的数据
this.snakeArr=[
[6,2,null,'pink'],
[5,2,null,'pink'],
[4,2,null,'pink']
];
//蛇的显示方法
this.display=function(){
for(var i=0;i<this.snakeArr.length;i++){
//解决了蛇移动时一直增加
if(this.snakeArr[i][2]==null){
this.snakeArr[i][2]=document.createElement('div');
this.snakeArr[i][2].style.width=this.width+'px';
this.snakeArr[i][2].style.height=this.height+'px';
this.snakeArr[i][2].style.background=this.snakeArr[i][3];
this.snakeArr[i][2].style.position='absolute';
this.snakeArr[i][2].style.borderRadius='50%';
div_map._map.appendChild(this.snakeArr[i][2]);
}
this.snakeArr[i][2].style.left=this.snakeArr[i][0]*this.width+'px';
this.snakeArr[i][2].style.top=this.snakeArr[i][1]*this.height+'px';
}
}
//传递按钮的键码
this.setDirect=function(code){
switch(code){
case 37:
//console.log('zuo');
// this.snakeArr[0][0]-=1;
// if(this.direct!='right'){
// }
this.direct='left';
this.snakeArr[0][2].style.transform='rotateZ(180deg)';
break;
case 38:
// if(this.direct!='down'){
//console.log('上')}
this.direct='up'
this.snakeArr[0][2].style.transform='rotateZ(-90deg)';
break;
case 39:
//console.log('右')
// if(this.direct!='left'){}
this.direct='right';
this.snakeArr[0][2].style.transform='rotateZ(0deg)';
break;
case 40:
//console.log('下')
// if(this.direct!='up'){}
this.direct='down';
this.snakeArr[0][2].style.transform='rotateZ(90deg)';
break;
default:
alert('请按住键盘')
break;
}
}
//通过按钮的键码控制蛇的移动
this.move=function(){
//解决蛇叠加
if(this.direct!=null){
//让后面的蛇节的坐标等于前面蛇节的坐标
for(var i=this.snakeArr.length-1;i>0;i--){
this.snakeArr[i][0]=this.snakeArr[i-1][0];
this.snakeArr[i][1]=this.snakeArr[i-1][1];
}
switch(this.direct){
case 'left':
this.snakeArr[0][0]-=1;
break;
case 'up':
this.snakeArr[0][1]-=1;
break;
case 'right':
this.snakeArr[0][0]+=1;
break;
case 'down':
this.snakeArr[0][1]+=1;
break;
default:
break;
}
//蛇吃到食物增加身体;
if(this.snakeArr[0][0]==div_food.x &&this.snakeArr[0][1]==div_food.y){
div_food.display();
//记分
sum+=2;
sor.innerHTML=sum;
var x=this.snakeArr[this.snakeArr.length-1][0];
var y=this.snakeArr[this.snakeArr.length-1][1];
this.snakeArr.push([x,y,null,'pink'])
}
//撞到墙壁死亡
if(this.snakeArr[0][0]==40||this.snakeArr[0][1]==30||this.snakeArr[0][0]==-1||this.snakeArr[0][1]==-1){
alert('Game Over!');
if(confirm('是否重新开始')){
window.location.reload();
}else{
return false;//阻止程序继续运行
}
}
}
//撞到自己后死亡
for(var i=1;i<this.snakeArr.length;i++){
if(this.snakeArr[0][0]==this.snakeArr[i][0]&&this.snakeArr[0][1]==this.snakeArr[i][1])
{
if(confirm('是否重新开始')){
window.location.reload();
}else{
return false;//阻止程序继续运行
}
}
}
div_snake.display();
time=setTimeout('div_snake.move()',n);
}
}
//创建蛇的眼睛
function Eye(){
this.width=5;
this.height=5;
this.color='green';
this.eyeArr=[[1,0,null,'green'],
[1,0,null,'green']];
this.display=function(){
for(var i=0;i<this.eyeArr.length;i++){
this.eyeArr[i][2]=document.createElement('div');
this.eyeArr[i][2].style.width=this.width+'px';
this.eyeArr[i][2].style.height=this.height+'px';
this.eyeArr[i][2].style.background=this.color;
this.eyeArr[i][2].style.margin='2px auto';
this.eyeArr[i][2].style.borderRadius='60%'
div_snake.snakeArr[0][2].appendChild(this.eyeArr[i][2]);
}
}
}
//按钮的暂停和继续
function Stop(){
var num = true;
this.display=function(){
this.an=document.createElement('button');
this.an.style.width=50+'px';
this.an.style.height=50+'px';
this.an.style.background='pink';
this.an.innerHTML='暂停按钮';
this.an.style.position='absolute';
this.an.style.margin='-550px 300px';
this.an.style.overflow=' hidden';
document.getElementsByTagName('body')[0].appendChild(this.an);
this.an.onclick=function(){
if(num){
clearTimeout(time);
num=false;
}else{
setTimeout('div_snake.move()',n);
num = true;
}
}
}
}